diff --git a/.spelling b/.spelling index a15619220fd..aed5508655e 100644 --- a/.spelling +++ b/.spelling @@ -23,6 +23,7 @@ cleanup Cleanup clef codegen +collateralised cometbft config cyclomatic diff --git a/CHANGELOG.md b/CHANGELOG.md index c3984dc34bb..c09eef2e34f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased 0.77.0 +## Unreleased 0.78.0 ### 🚨 Breaking changes @@ -19,6 +19,60 @@ - [](https://github.com/vegaprotocol/vega/issues/xxx) +## 0.77.0 + +### 🛠 Improvements + +- [11209](https://github.com/vegaprotocol/vega/issues/11209) - Publish ongoing games data. +- [11242](https://github.com/vegaprotocol/vega/issues/11242) - Add configuration to visor to help control binary retries a bit better. +- [11408](https://github.com/vegaprotocol/vega/issues/11408) - Relax finality check to allow instant deposits over the `Arbitrum` bridge. +- [11196](https://github.com/vegaprotocol/vega/issues/11196) - Add an active field in the price monitoring bounds payload. +- [11211](https://github.com/vegaprotocol/vega/issues/11211) - Liquidation engine includes `vAMM` shapes as available volume. +- [11217](https://github.com/vegaprotocol/vega/issues/11217) - Allow market proposals to override risk factors. +- [11285](https://github.com/vegaprotocol/vega/issues/11285) - Add support for trading transaction ordering. +- [11282](https://github.com/vegaprotocol/vega/issues/11282) - Allow a party to withdraw rewards from an AMM vested account. +- [11301](https://github.com/vegaprotocol/vega/issues/11301) - Sum vesting reward bonus multiplier across all derived keys for party. +- [11329](https://github.com/vegaprotocol/vega/issues/11329) - Add source chain ID when available to transaction event attributes +- [10634](https://github.com/vegaprotocol/vega/issues/10634) - Add spam checks for orders/liquidity provision +- [11337](https://github.com/vegaprotocol/vega/issues/11337) - Enhance transaction reordering with per market control and configurable delay. +- [11334](https://github.com/vegaprotocol/vega/issues/11334) - Heartbeat chain events are now sent to keep last seen block up to date. +- [11344](https://github.com/vegaprotocol/vega/issues/11344) - Include derived parties in accounts API +- [11268](https://github.com/vegaprotocol/vega/issues/11268) - Include derived parties vesting stats API +- [11266](https://github.com/vegaprotocol/vega/issues/11266) - Include derived parties rewards API +- [11357](https://github.com/vegaprotocol/vega/issues/11357) - Support historical game scores +- [11023](https://github.com/vegaprotocol/vega/issues/11023) - Add proposed fees to `vAMM` data. +- [11028](https://github.com/vegaprotocol/vega/issues/11028) - Add API to estimate order book depth based on `vAMM`. +- [11400](https://github.com/vegaprotocol/vega/issues/11400) - Add support for long block auction. +- [11026](https://github.com/vegaprotocol/vega/issues/11026) - Add API flag to get paid liquidity fees for a `vAMM` using the parent key. +- [11027](https://github.com/vegaprotocol/vega/issues/11027) - Add API filters to get fees and rewards by market, across epochs. +- [10360](https://github.com/vegaprotocol/vega/issues/10360) - Scale funding payment by fraction of period spent outside of auction. +- [11452](https://github.com/vegaprotocol/vega/issues/11452) - Implement alternative estimations for fully collateralised capped future. + +### 🐛 Fixes + +- [11066](https://github.com/vegaprotocol/vega/issues/11066) - Ensure vesting statistics match vesting accounts numbers. +- [11279](https://github.com/vegaprotocol/vega/issues/11279) - Handle properly the case of multiple transfers for the same game id. +- [11293](https://github.com/vegaprotocol/vega/issues/11293) - Panic in data node with position estimate endpoint. +- [11401](https://github.com/vegaprotocol/vega/issues/11401) - Ignore dispatch strategies with zero `ref-counts` when calculating payouts. +- [11379](https://github.com/vegaprotocol/vega/issues/11379) - Source chain id is now populated in `GQL Erc20WithdrawalApproval` endpoint. +- [11279](https://github.com/vegaprotocol/vega/issues/11279) - Handle properly the case of multiple transfers for the same game id. +- [11297](https://github.com/vegaprotocol/vega/issues/11297) - Handle properly asset decimals < market decimals when uncrossing the order book upon leaving auction. +- [11304](https://github.com/vegaprotocol/vega/issues/11304) - Correctly verify pegged order offset with respect to tick size in the right units. +- [11319](https://github.com/vegaprotocol/vega/issues/11319) - Do not leak Ethereum client secrets in the logs. +- [11336](https://github.com/vegaprotocol/vega/issues/11336) - Add support for decay factor in governance recurring transfers and report the proposal amount rather than 0 when the proposal gets enacted. +- [11368](https://github.com/vegaprotocol/vega/issues/11368) - Add support for update vesting stats in REST API and fix summing the quantum balance for vesting stats. +- [11380](https://github.com/vegaprotocol/vega/issues/11380) - Handle broken stop orders in prepare proposal. +- [11136](https://github.com/vegaprotocol/vega/issues/11136) - Fix premature invocation of post commit hooks in case of fee stats event. +- [11409](https://github.com/vegaprotocol/vega/issues/11409) - When updating a capped market - copy the cap from the existing market definition. +- [11415](https://github.com/vegaprotocol/vega/issues/11415) - End long block auction when expired. +- [11419](https://github.com/vegaprotocol/vega/issues/11419) - Fix long block auction extension to be calculated from current time. +- [11438](https://github.com/vegaprotocol/vega/issues/11438) - Add missing assignment to epoch to and from in `gameTeamScores` resolvers. +- [11442](https://github.com/vegaprotocol/vega/issues/11442) - Add validation to `submitAMM` to ensure the curves can be successfully generated. +- [11448](https://github.com/vegaprotocol/vega/issues/11448) - Fix team game score query with epoch filter. +- [11457](https://github.com/vegaprotocol/vega/issues/11457) - Fix cursor column ordering for game scores. +- [11454](https://github.com/vegaprotocol/vega/issues/11454) - Ensure ended transfers proper handling. + + ## 0.76.1 ### 🐛 Fixes @@ -26,7 +80,7 @@ - [11250](https://github.com/vegaprotocol/vega/issues/11250) - Add missing dispatch strategy in transfer proposal. - [11252](https://github.com/vegaprotocol/vega/issues/11252) - Treat no position as zero position when calculating stop order overrides. - [11249](https://github.com/vegaprotocol/vega/issues/11249) - Composite mark price oracles are now deactivated when a market is rejected. - +- [11262](https://github.com/vegaprotocol/vega/pull/11262) - Fix auction extensions after risk parameter update. ## 0.76.0 @@ -64,6 +118,7 @@ - [11143](https://github.com/vegaprotocol/vega/issues/11143) - Add support for new asset proposal in batch governance proposal - [11182](https://github.com/vegaprotocol/vega/issues/11182) - Remove reduce only restriction on spot markets stop orders. - [11153](https://github.com/vegaprotocol/vega/issues/11153) - Add check on start-up that bridge `RPC-endpoints` are functional. +- [11227](https://github.com/vegaprotocol/vega/issues/11227) - Add capped futures to `protos`. ### 🐛 Fixes @@ -193,6 +248,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 @@ -227,6 +283,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/Jenkinsfile b/Jenkinsfile index d16f23f7c17..2ceb05e9c2f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -228,6 +228,15 @@ pipeline { dir('vega/core/integration') { sh 'go test . -timeout 30m --godog.format=junit:core-integration-report.xml' junit checksName: 'Core Integration Tests', testResults: 'core-integration-report.xml' + + } + } + post { + failure { + archiveArtifacts( + artifacts: 'vega/core/integration/core-integration-report.xml', + allowEmptyArchive: true + ) } } } @@ -238,6 +247,14 @@ pipeline { junit checksName: 'Core Integration Perps Tests', testResults: 'core-integration-perps-report.xml' } } + post { + failure { + archiveArtifacts( + artifacts: 'vega/core/integration/core-integration-perps-report.xml', + allowEmptyArchive: true + ) + } + } } stage('datanode/integration tests') { options { retry(3) } diff --git a/blockexplorer/store/transactions_test.go b/blockexplorer/store/transactions_test.go index 59f691171e2..014f5b25fc9 100644 --- a/blockexplorer/store/transactions_test.go +++ b/blockexplorer/store/transactions_test.go @@ -91,18 +91,22 @@ func TestMain(m *testing.M) { } cancel() - connectionSource, err = sqlstore.NewTransactionalConnectionSource(log, sqlConfig.ConnectionConfig) + ctx, cancel = context.WithCancel(context.Background()) + connectionSource, err = sqlstore.NewTransactionalConnectionSource(ctx, log, sqlConfig.ConnectionConfig) if err != nil { + cancel() panic(err) } defer embeddedPostgres.Stop() if err = sqlstore.WipeDatabaseAndMigrateSchemaToLatestVersion(log, sqlConfig.ConnectionConfig, store.EmbedMigrations, false); err != nil { log.Errorf("failed to wipe database and migrate schema, dumping postgres log:\n %s", postgresLog.String()) + cancel() panic(err) } code := m.Run() + cancel() os.Exit(code) } @@ -119,7 +123,6 @@ type txResult struct { func addTestTxResults(ctx context.Context, t *testing.T, txResultTable string, txResults ...txResult) []*pb.Transaction { t.Helper() - conn := connectionSource.Connection rows := make([]*pb.Transaction, 0, len(txResults)) blockIDs := make(map[int64]int64) @@ -136,14 +139,14 @@ func addTestTxResults(ctx context.Context, t *testing.T, txResultTable string, t var ok bool if blockID, ok = blockIDs[txr.height]; !ok { - require.NoError(t, conn.QueryRow(ctx, blockSQL, txr.height, "test-chain", txr.createdAt).Scan(&blockID)) + require.NoError(t, connectionSource.QueryRow(ctx, blockSQL, txr.height, "test-chain", txr.createdAt).Scan(&blockID)) blockIDs[txr.height] = blockID } index := txr.index var rowID int64 - require.NoError(t, conn.QueryRow(ctx, resultSQL, blockID, index, txr.createdAt, txr.txHash, txr.txResult, txr.submitter, txr.cmdType).Scan(&rowID)) + require.NoError(t, connectionSource.QueryRow(ctx, resultSQL, blockID, index, txr.createdAt, txr.txHash, txr.txResult, txr.submitter, txr.cmdType).Scan(&rowID)) row := entities.TxResultRow{ RowID: rowID, @@ -168,10 +171,9 @@ func addTestTxResults(ctx context.Context, t *testing.T, txResultTable string, t func cleanupTransactionsTest(ctx context.Context, t *testing.T) { t.Helper() - conn := connectionSource.Connection - _, err := conn.Exec(ctx, `DELETE FROM tx_results`) + _, err := connectionSource.Exec(ctx, `DELETE FROM tx_results`) require.NoError(t, err) - _, err = conn.Exec(ctx, `DELETE FROM blocks`) + _, err = connectionSource.Exec(ctx, `DELETE FROM blocks`) require.NoError(t, err) } diff --git a/cmd/data-node/commands/networkhistory/fetch.go b/cmd/data-node/commands/networkhistory/fetch.go index 3ff9f49e4b3..3416f7f9cb3 100644 --- a/cmd/data-node/commands/networkhistory/fetch.go +++ b/cmd/data-node/commands/networkhistory/fetch.go @@ -64,7 +64,7 @@ func (cmd *fetchCmd) Execute(args []string) error { return fmt.Errorf("failed to fix config:%w", err) } - err = verifyChainID(cmd.SQLStore.ConnectionConfig, cmd.ChainID) + err = verifyChainID(ctx, cmd.SQLStore.ConnectionConfig, cmd.ChainID) if err != nil { return fmt.Errorf("failed to verify chain id:%w", err) } @@ -99,8 +99,8 @@ func (cmd *fetchCmd) Execute(args []string) error { return nil } -func verifyChainID(connConfig sqlstore.ConnectionConfig, chainID string) error { - connSource, err := sqlstore.NewTransactionalConnectionSource(logging.NewTestLogger(), connConfig) +func verifyChainID(ctx context.Context, connConfig sqlstore.ConnectionConfig, chainID string) error { + connSource, err := sqlstore.NewTransactionalConnectionSource(ctx, logging.NewTestLogger(), connConfig) if err != nil { return fmt.Errorf("failed to create new transactional connection source: %w", err) } diff --git a/cmd/data-node/commands/networkhistory/load.go b/cmd/data-node/commands/networkhistory/load.go index 2a7a67eab82..dab8106d939 100644 --- a/cmd/data-node/commands/networkhistory/load.go +++ b/cmd/data-node/commands/networkhistory/load.go @@ -77,7 +77,7 @@ func (cmd *loadCmd) Execute(args []string) error { return fmt.Errorf("failed to kill all connections to database: %w", err) } - connPool, err := getCommandConnPool(cmd.Config.SQLStore.ConnectionConfig) + connPool, err := getCommandConnPool(ctx, cmd.Config.SQLStore.ConnectionConfig) if err != nil { return fmt.Errorf("failed to get command connection pool: %w", err) } @@ -89,7 +89,7 @@ func (cmd *loadCmd) Execute(args []string) error { } if hasSchema { - err = verifyChainID(cmd.SQLStore.ConnectionConfig, cmd.ChainID) + err = verifyChainID(ctx, cmd.SQLStore.ConnectionConfig, cmd.ChainID) if err != nil { if !errors.Is(err, networkhistory.ErrChainNotFound) { return fmt.Errorf("failed to verify chain id:%w", err) diff --git a/cmd/data-node/commands/networkhistory/rollback.go b/cmd/data-node/commands/networkhistory/rollback.go index d3a5af4fbd1..df4aa2049da 100644 --- a/cmd/data-node/commands/networkhistory/rollback.go +++ b/cmd/data-node/commands/networkhistory/rollback.go @@ -76,7 +76,7 @@ func (cmd *rollbackCmd) Execute(args []string) error { return fmt.Errorf("failed to kill all connections to database: %w", err) } - connPool, err := getCommandConnPool(cmd.Config.SQLStore.ConnectionConfig) + connPool, err := getCommandConnPool(ctx, cmd.Config.SQLStore.ConnectionConfig) if err != nil { return fmt.Errorf("failed to get command connection pool: %w", err) } diff --git a/cmd/data-node/commands/networkhistory/show.go b/cmd/data-node/commands/networkhistory/show.go index 46711e8a64d..d3ba128ae7a 100644 --- a/cmd/data-node/commands/networkhistory/show.go +++ b/cmd/data-node/commands/networkhistory/show.go @@ -81,6 +81,8 @@ func (o *showOutput) printHuman(allSegments bool) { } func (cmd *showCmd) Execute(_ []string) error { + ctx, cfunc := context.WithCancel(context.Background()) + defer cfunc() cfg := logging.NewDefaultConfig() cfg.Custom.Zap.Level = logging.WarnLevel cfg.Environment = "custom" @@ -111,7 +113,7 @@ func (cmd *showCmd) Execute(_ []string) error { } defer func() { _ = conn.Close() }() - response, err := client.ListAllNetworkHistorySegments(context.Background(), &v2.ListAllNetworkHistorySegmentsRequest{}) + response, err := client.ListAllNetworkHistorySegments(ctx, &v2.ListAllNetworkHistorySegmentsRequest{}) if err != nil { handleErr(log, cmd.Output.IsJSON(), "failed to list all network history segments", err) os.Exit(1) @@ -127,13 +129,13 @@ func (cmd *showCmd) Execute(_ []string) error { segments := segment.Segments[*v2.HistorySegment](response.Segments) output.ContiguousHistories = segments.AllContigousHistories() - pool, err := getCommandConnPool(cmd.Config.SQLStore.ConnectionConfig) + pool, err := getCommandConnPool(ctx, cmd.Config.SQLStore.ConnectionConfig) if err != nil { handleErr(log, cmd.Output.IsJSON(), "failed to get command conn pool", err) } defer pool.Close() - span, err := sqlstore.GetDatanodeBlockSpan(context.Background(), pool) + span, err := sqlstore.GetDatanodeBlockSpan(ctx, pool) if err != nil { handleErr(log, cmd.Output.IsJSON(), "failed to get datanode block span", err) os.Exit(1) @@ -156,10 +158,10 @@ func (cmd *showCmd) Execute(_ []string) error { return nil } -func getCommandConnPool(conf sqlstore.ConnectionConfig) (*pgxpool.Pool, error) { +func getCommandConnPool(ctx context.Context, conf sqlstore.ConnectionConfig) (*pgxpool.Pool, error) { conf.MaxConnPoolSize = 3 - connPool, err := sqlstore.CreateConnectionPool(conf) + connPool, err := sqlstore.CreateConnectionPool(ctx, conf) if err != nil { return nil, fmt.Errorf("failed to create connection pool: %w", err) } diff --git a/cmd/data-node/commands/start/node.go b/cmd/data-node/commands/start/node.go index e4472246656..a71d04c0e90 100644 --- a/cmd/data-node/commands/start/node.go +++ b/cmd/data-node/commands/start/node.go @@ -240,6 +240,8 @@ func (l *NodeCommand) createGRPCServer(config api.Config) *api.GRPCServer { l.gamesService, l.marginModesService, l.timeWeightedNotionalPositionService, + l.gameScoreService, + l.ammPoolsService, ) return grpcServer } diff --git a/cmd/data-node/commands/start/node_pre.go b/cmd/data-node/commands/start/node_pre.go index 294f7f9aab1..5e1528e350e 100644 --- a/cmd/data-node/commands/start/node_pre.go +++ b/cmd/data-node/commands/start/node_pre.go @@ -183,7 +183,7 @@ func (l *NodeCommand) persistentPre([]string) (err error) { preLog.Info("Enabling SQL stores") - l.transactionalConnectionSource, err = sqlstore.NewTransactionalConnectionSource(preLog, l.conf.SQLStore.ConnectionConfig) + l.transactionalConnectionSource, err = sqlstore.NewTransactionalConnectionSource(l.ctx, preLog, l.conf.SQLStore.ConnectionConfig) if err != nil { return fmt.Errorf("failed to create transactional connection source: %w", err) } @@ -193,7 +193,7 @@ func (l *NodeCommand) persistentPre([]string) (err error) { logService := l.Log.Named("service") logService.SetLevel(l.conf.Service.Level.Get()) - if err := l.SetupServices(l.ctx, logService, l.conf.CandlesV2); err != nil { + if err := l.SetupServices(l.ctx, logService, l.conf.Service, l.conf.CandlesV2); err != nil { return err } @@ -211,7 +211,7 @@ func (l *NodeCommand) initialiseDatabase(preLog *logging.Logger) error { var err error conf := l.conf.SQLStore.ConnectionConfig conf.MaxConnPoolSize = 1 - pool, err := sqlstore.CreateConnectionPool(conf) + pool, err := sqlstore.CreateConnectionPool(l.ctx, conf) if err != nil { return fmt.Errorf("failed to create connection pool: %w", err) } @@ -333,7 +333,7 @@ func (l *NodeCommand) initialiseNetworkHistory(preLog *logging.Logger, connConfi connConfig.MaxConnPoolSize = 3 connConfig.MinConnPoolSize = 3 - networkHistoryPool, err := sqlstore.CreateConnectionPool(connConfig) + networkHistoryPool, err := sqlstore.CreateConnectionPool(l.ctx, connConfig) if err != nil { return fmt.Errorf("failed to create network history connection pool: %w", err) } diff --git a/cmd/data-node/commands/start/sqlsubscribers.go b/cmd/data-node/commands/start/sqlsubscribers.go index 8b1afa14e4f..f381571e78a 100644 --- a/cmd/data-node/commands/start/sqlsubscribers.go +++ b/cmd/data-node/commands/start/sqlsubscribers.go @@ -82,6 +82,8 @@ type SQLSubscribers struct { gamesStore *sqlstore.Games marginModesStore *sqlstore.MarginModes timeWeightedNotionalPositionStore *sqlstore.TimeWeightedNotionalPosition + gameScoreStore *sqlstore.GameScores + ammPoolsStore *sqlstore.AMMPools // Services candleService *candlesv2.Svc @@ -138,6 +140,8 @@ type SQLSubscribers struct { gamesService *service.Games marginModesService *service.MarginModes timeWeightedNotionalPositionService *service.TimeWeightedNotionalPosition + gameScoreService *service.GameScore + ammPoolsService *service.AMMPools // Subscribers accountSub *sqlsubscribers.Account @@ -190,6 +194,8 @@ type SQLSubscribers struct { transactionResultsSub *sqlsubscribers.TransactionResults marginModesSub *sqlsubscribers.MarginModes timeWeightedNotionalPositionSub *sqlsubscribers.TimeWeightedNotionalPosition + gameScoreSub *sqlsubscribers.GameScore + ammPoolsSub *sqlsubscribers.AMMPools } func (s *SQLSubscribers) GetSQLSubscribers() []broker.SQLBrokerSubscriber { @@ -246,6 +252,8 @@ func (s *SQLSubscribers) GetSQLSubscribers() []broker.SQLBrokerSubscriber { s.transactionResultsSub, s.marginModesSub, s.timeWeightedNotionalPositionSub, + s.gameScoreSub, + s.ammPoolsSub, } } @@ -307,9 +315,11 @@ 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.gameScoreStore = sqlstore.NewGameScores(transactionalConnectionSource) + s.ammPoolsStore = sqlstore.NewAMMPools(transactionalConnectionSource) } -func (s *SQLSubscribers) SetupServices(ctx context.Context, log *logging.Logger, candlesConfig candlesv2.Config) error { +func (s *SQLSubscribers) SetupServices(ctx context.Context, log *logging.Logger, cfg service.Config, candlesConfig candlesv2.Config) error { s.accountService = service.NewAccount(s.accountStore, s.balanceStore, log) s.assetService = service.NewAsset(s.assetStore) s.blockService = service.NewBlock(s.blockStore) @@ -324,7 +334,7 @@ func (s *SQLSubscribers) SetupServices(ctx context.Context, log *logging.Logger, s.ledgerService = service.NewLedger(s.ledger, log) s.liquidityProvisionService = service.NewLiquidityProvision(s.liquidityProvisionStore) s.marketDataService = service.NewMarketData(s.marketDataStore, log) - s.marketDepthService = service.NewMarketDepth(s.orderStore, log) + s.positionService = service.NewPosition(s.positionStore, log) s.marketsService = service.NewMarkets(s.marketsStore) s.multiSigService = service.NewMultiSig(s.multiSigSignerAddedStore) s.networkLimitsService = service.NewNetworkLimits(s.networkLimitsStore) @@ -335,7 +345,6 @@ func (s *SQLSubscribers) SetupServices(ctx context.Context, log *logging.Logger, s.oracleSpecService = service.NewOracleSpec(s.oracleSpecStore) s.orderService = service.NewOrder(s.orderStore, log) s.partyService = service.NewParty(s.partyStore) - s.positionService = service.NewPosition(s.positionStore, log) s.rewardService = service.NewReward(s.rewardStore, log) s.riskFactorService = service.NewRiskFactor(s.riskFactorStore) s.riskService = service.NewRisk(s.marginLevelsStore, s.accountStore, log) @@ -363,6 +372,19 @@ 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.gameScoreService = service.NewGameScore(s.gameScoreStore, log) + s.ammPoolsService = service.NewAMMPools(s.ammPoolsStore) + + s.marketDepthService = service.NewMarketDepth( + cfg.MarketDepth, + s.orderStore, + s.ammPoolsStore, + s.marketDataStore, + s.positionService, + s.assetStore, + s.marketsStore, + log, + ) s.transactionResultsSub = sqlsubscribers.NewTransactionResults(log) s.transactionResultsService = service.NewTransactionResults(s.transactionResultsSub) @@ -432,4 +454,6 @@ 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.gameScoreSub = sqlsubscribers.NewGameScore(s.gameScoreStore) + s.ammPoolsSub = sqlsubscribers.NewAMMPools(s.ammPoolsService, s.marketDepthService) } diff --git a/cmd/vega/commands/node/node.go b/cmd/vega/commands/node/node.go index b48cd487a2d..cf64ff1c7eb 100644 --- a/cmd/vega/commands/node/node.go +++ b/cmd/vega/commands/node/node.go @@ -478,11 +478,11 @@ func (n *Command) startBlockchainClients() error { n.primaryEthConfirmations = ethclient.NewEthereumConfirmations(n.conf.Ethereum, n.primaryEthClient, nil, ethclient.FinalityStateFinalized) - // for arbitrum we can use the weaker check for finality and only require that the block is marked as "safe". - // This is because "safe" means that the batch has been send to L1 Ethereum and from then on its "final" on - // Arbitrum. If the batched-transaction is part of a re-org on Ethereum, it doesn't matter to Vega because core - // is only looking at the Arbitrum blocks we don't track the batch, so we don't need to wait for full finality. - n.secondaryEthConfirmations = ethclient.NewEthereumConfirmations(n.conf.Ethereum, n.secondaryEthClient, nil, ethclient.FinalityStateSafe) + // for arbitrum the finality state of a block is in now way connected to the Arbitrum network reaching consensus so Vega gains nothing + // from waiting for safe/finalized. Instead we just wait for the event to be seen in the latest block and rely on the consensus check + // Vega performs itself with node-votes. If each validator is running their own Arbitrum node, or is using a node that they need trustworthy + // then this is sufficient. A far as is know, block reorgs do not happen on Arbitrum. + n.secondaryEthConfirmations = ethclient.NewEthereumConfirmations(n.conf.Ethereum, n.secondaryEthClient, nil, ethclient.FinalityStateLatest) return nil } diff --git a/commands/amend_amm.go b/commands/amend_amm.go new file mode 100644 index 00000000000..17d221a9278 --- /dev/null +++ b/commands/amend_amm.go @@ -0,0 +1,141 @@ +// 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 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 { + hasUpdate = true + var base, lowerBound, upperBound *big.Int + if base, _ = big.NewInt(0).SetString(cmd.ConcentratedLiquidityParameters.Base, 10); base == nil { + errs.FinalAddForProperty("amend_amm.concentrated_liquidity_parameters.base", ErrIsNotValidNumber) + } else if base.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.base", ErrMustBePositive) + } + + var haveLower, haveUpper bool + if cmd.ConcentratedLiquidityParameters.LowerBound != nil { + haveLower = true + if lowerBound, _ = big.NewInt(0).SetString(*cmd.ConcentratedLiquidityParameters.LowerBound, 10); lowerBound == nil { + errs.FinalAddForProperty("amend_amm.concentrated_liquidity_parameters.lower_bound", ErrIsNotValidNumber) + } else if lowerBound.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.lower_bound", ErrMustBePositive) + } + } + if cmd.ConcentratedLiquidityParameters.UpperBound != nil { + haveUpper = true + if upperBound, _ = big.NewInt(0).SetString(*cmd.ConcentratedLiquidityParameters.UpperBound, 10); upperBound == nil { + errs.FinalAddForProperty("amend_amm.concentrated_liquidity_parameters.upper_bound", ErrIsNotValidNumber) + } else if upperBound.Cmp(big.NewInt(0)) <= 0 { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.upper_bound", ErrMustBePositive) + } + } + + if !haveLower && !haveUpper { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.lower_bound", errors.New("lower_bound and upper_bound cannot both be empty")) + } + + if base != nil && lowerBound != nil && base.Cmp(lowerBound) <= 0 { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.base", errors.New("should be a bigger value than lower_bound")) + } + + if base != nil && upperBound != nil && base.Cmp(upperBound) >= 0 { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.base", errors.New("should be a smaller value than upper_bound")) + } + + if cmd.ConcentratedLiquidityParameters.LeverageAtUpperBound != nil { + if leverage, err := num.DecimalFromString(*cmd.ConcentratedLiquidityParameters.LeverageAtUpperBound); err != nil { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.leverage_at_upper_bound", ErrIsNotValidNumber) + } else if leverage.LessThan(num.DecimalZero()) { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.leverage_at_upper_bound", ErrMustBePositive) + } + } + + if cmd.ConcentratedLiquidityParameters.LeverageAtLowerBound != nil { + if leverage, err := num.DecimalFromString(*cmd.ConcentratedLiquidityParameters.LeverageAtLowerBound); err != nil { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.leverage_at_lower_bound", ErrIsNotValidNumber) + } else if leverage.LessThan(num.DecimalZero()) { + errs.AddForProperty("amend_amm.concentrated_liquidity_parameters.leverage_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..9c7b9caf2bf --- /dev/null +++ b/commands/amend_amm_test.go @@ -0,0 +1,343 @@ +// 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: "", + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.base (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + Base: "abc", + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.base (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + Base: "-10", + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.base (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + Base: "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{ + LeverageAtUpperBound: ptr.From(""), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.leverage_at_upper_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LeverageAtUpperBound: ptr.From("abc"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.leverage_at_upper_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LeverageAtUpperBound: ptr.From("-10"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.leverage_at_upper_bound (must be positive)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LeverageAtLowerBound: ptr.From(""), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.leverage_at_lower_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LeverageAtLowerBound: ptr.From("abc"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.leverage_at_lower_bound (is not a valid number)", + }, + { + submission: commandspb.AmendAMM{ + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LeverageAtLowerBound: ptr.From("-10"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.leverage_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: "20000", + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.lower_bound (lower_bound and upper_bound cannot both be empty)", + }, + { + submission: commandspb.AmendAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + SlippageTolerance: "0.09", + CommitmentAmount: ptr.From("10000"), + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From("10000"), + Base: "20000", + UpperBound: ptr.From("15000"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.base (should be a smaller value than upper_bound)", + }, + { + submission: commandspb.AmendAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + SlippageTolerance: "0.09", + CommitmentAmount: ptr.From("10000"), + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + LowerBound: ptr.From("25000"), + Base: "20000", + UpperBound: ptr.From("30000"), + }, + }, + errStr: "amend_amm.concentrated_liquidity_parameters.base (should be a bigger value than lower_bound)", + }, + { + submission: commandspb.AmendAMM{ + MarketId: "e9982447fb4128f9968f9981612c5ea85d19b62058ec2636efc812dcbbc745ca", + SlippageTolerance: "0.09", + CommitmentAmount: ptr.From("10000"), + ConcentratedLiquidityParameters: &commandspb.AmendAMM_ConcentratedLiquidityParameters{ + Base: "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..dfdb3fb1174 100644 --- a/commands/errors.go +++ b/commands/errors.go @@ -93,6 +93,8 @@ 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") + ErrMaxPriceMustRespectTickSize = errors.New("must respect tick size") ) type Errors map[string][]error diff --git a/commands/proposal_submission.go b/commands/proposal_submission.go index 917ca2d934e..1e6b2d8c8fa 100644 --- a/commands/proposal_submission.go +++ b/commands/proposal_submission.go @@ -697,6 +697,14 @@ func checkNewTransferConfiguration(changes *vegapb.NewTransferConfiguration) Err return errs.FinalAddForProperty("new_transfer.changes.recurring.end_epoch", ErrIsNotValid) } + if f, ok := big.NewFloat(0).SetString(recurring.Factor); !ok { + errs.AddForProperty("new_transfer.changes.recurring.factor", ErrNotAValidFloat) + } else { + if f.Cmp(big.NewFloat(0)) <= 0 { + errs.AddForProperty("new_transfer.changes.recurring.factor", ErrMustBePositive) + } + } + if recurring.DispatchStrategy != nil { if len(changes.Destination) > 0 { errs.AddForProperty("new_transfer.changes.destination", ErrIsNotValid) @@ -905,7 +913,7 @@ func checkNewSpotMarketConfiguration(changes *vegapb.NewSpotMarketConfiguration) } errs.Merge(checkPriceMonitoring(changes.PriceMonitoringParameters, "new_spot_market.changes")) errs.Merge(checkTargetStakeParams(changes.TargetStakeParameters, "new_spot_market.changes")) - errs.Merge(checkNewInstrument(changes.Instrument, "new_spot_market.changes.instrument")) + errs.Merge(checkNewInstrument(changes.Instrument, "new_spot_market.changes.instrument", changes.TickSize)) errs.Merge(checkNewSpotRiskParameters(changes)) errs.Merge(checkSLAParams(changes.SlaParams, "new_spot_market.changes.sla_params")) errs.Merge(checkTickSize(changes.TickSize, "new_spot_market.changes")) @@ -965,7 +973,7 @@ func checkNewMarketChangesConfiguration(changes *vegapb.NewMarketConfiguration) errs.Merge(checkLiquidationStrategy(changes.LiquidationStrategy, "new_market.changes")) errs.Merge(checkPriceMonitoring(changes.PriceMonitoringParameters, "new_market.changes")) errs.Merge(checkLiquidityMonitoring(changes.LiquidityMonitoringParameters, "new_market.changes")) - errs.Merge(checkNewInstrument(changes.Instrument, "new_market.changes.instrument")) + errs.Merge(checkNewInstrument(changes.Instrument, "new_market.changes.instrument", changes.TickSize)) errs.Merge(checkNewRiskParameters(changes)) errs.Merge(checkSLAParams(changes.LiquiditySlaParameters, "new_market.changes.sla_params")) errs.Merge(checkLiquidityFeeSettings(changes.LiquidityFeeSettings, "new_market.changes.liquidity_fee_settings")) @@ -1172,7 +1180,7 @@ func checkTargetStakeParams(targetStakeParameters *protoTypes.TargetStakeParamet return errs } -func checkNewInstrument(instrument *protoTypes.InstrumentConfiguration, parent string) Errors { +func checkNewInstrument(instrument *protoTypes.InstrumentConfiguration, parent, tickSize string) Errors { errs := NewErrors() if instrument == nil { @@ -1192,7 +1200,7 @@ func checkNewInstrument(instrument *protoTypes.InstrumentConfiguration, parent s switch product := instrument.Product.(type) { case *protoTypes.InstrumentConfiguration_Future: - errs.Merge(checkNewFuture(product.Future)) + errs.Merge(checkNewFuture(product.Future, tickSize)) case *protoTypes.InstrumentConfiguration_Perpetual: errs.Merge(checkNewPerps(product.Perpetual, fmt.Sprintf("%s.product", parent))) case *protoTypes.InstrumentConfiguration_Spot: @@ -1250,7 +1258,7 @@ func checkUpdateInstrument(instrument *protoTypes.UpdateInstrumentConfiguration) return errs } -func checkNewFuture(future *protoTypes.FutureProduct) Errors { +func checkNewFuture(future *protoTypes.FutureProduct, tickSize string) Errors { errs := NewErrors() if future == nil { @@ -1264,6 +1272,25 @@ func checkNewFuture(future *protoTypes.FutureProduct) Errors { errs.AddForProperty("new_market.changes.instrument.product.future.quote_name", ErrIsRequired) } + if future.Cap != nil { + // convert to uint to ensure input is valid + if len(future.Cap.MaxPrice) == 0 { + errs.AddForProperty("new_market.changes.instrument.product.future.cap.max_price", ErrIsRequired) + } else { + // tick size is validated later on, ignore errors here + tick, _ := num.UintFromString(tickSize, 10) + if tick.IsZero() { + tick = num.UintOne() + } + mp, err := num.UintFromString(future.Cap.MaxPrice, 10) + if err || mp.IsZero() { + errs.AddForProperty("new_market.changes.instrument.product.future.cap.max_price", ErrMustBePositive) + } else if !mp.Mod(mp, tick).IsZero() { + errs.AddForProperty("new_market.changes.instrument.product.future.cap.max_price", ErrMaxPriceMustRespectTickSize) + } + } + } + errs.Merge(checkDataSourceSpec(future.DataSourceSpecForSettlementData, "data_source_spec_for_settlement_data", "new_market.changes.instrument.product.future", true)) errs.Merge(checkDataSourceSpec(future.DataSourceSpecForTradingTermination, "data_source_spec_for_trading_termination", "new_market.changes.instrument.product.future", false)) errs.Merge(checkNewOracleBinding(future)) @@ -2276,6 +2303,33 @@ func checkNewLogNormalRiskParameters(params *protoTypes.NewMarketConfiguration_L return errs.FinalAddForProperty("new_market.changes.risk_parameters.log_normal.params.r", errors.New("must be between [-1,1]")) } + // if not nil, both short and long must be specified and correct + if params.LogNormal.RiskFactorOverride != nil { + short := params.LogNormal.RiskFactorOverride.Short + long := params.LogNormal.RiskFactorOverride.Long + if len(short) <= 0 { + return errs.FinalAddForProperty("new_market.changes.risk_parameters.log_normal.risk_factor_override.short", ErrIsRequired) + } + + d, err := num.DecimalFromString(short) + if err != nil { + errs.AddForProperty("new_market.changes.risk_parameters.log_normal.risk_factor_override.short", ErrIsNotValidNumber) + } else if d.LessThanOrEqual(num.DecimalZero()) { + errs.AddForProperty("new_market.changes.risk_parameters.log_normal.risk_factor_override.short", ErrMustBePositive) + } + + if len(long) <= 0 { + return errs.FinalAddForProperty("new_market.changes.risk_parameters.log_normal.risk_factor_override.long", ErrIsRequired) + } + + d, err = num.DecimalFromString(long) + if err != nil { + errs.AddForProperty("new_market.changes.risk_parameters.log_normal.risk_factor_override.long", ErrIsNotValidNumber) + } else if d.LessThanOrEqual(num.DecimalZero()) { + errs.AddForProperty("new_market.changes.risk_parameters.log_normal.risk_factor_override.long", ErrMustBePositive) + } + } + return errs } @@ -2314,6 +2368,33 @@ func checkUpdateLogNormalRiskParameters(params *protoTypes.UpdateMarketConfigura return errs.FinalAddForProperty("update_market.changes.risk_parameters.log_normal.params.r", ErrIsNotValidNumber) } + // if not nil, both short and long must be specified and correct + if params.LogNormal.RiskFactorOverride != nil { + short := params.LogNormal.RiskFactorOverride.Short + long := params.LogNormal.RiskFactorOverride.Long + if len(short) <= 0 { + errs.AddForProperty("update_market.changes.risk_parameters.log_normal.risk_factor_override.short", ErrIsRequired) + } + + d, err := num.DecimalFromString(short) + if err != nil { + errs.AddForProperty("update_market.changes.risk_parameters.log_normal.risk_factor_override.short", ErrIsNotValidNumber) + } else if d.LessThanOrEqual(num.DecimalZero()) { + errs.AddForProperty("update_market.changes.risk_parameters.log_normal.risk_factor_override.short", ErrMustBePositive) + } + + if len(long) <= 0 { + errs.AddForProperty("update_market.changes.risk_parameters.log_normal.risk_factor_override.long", ErrIsRequired) + } + + d, err = num.DecimalFromString(long) + if err != nil { + errs.AddForProperty("update_market.changes.risk_parameters.log_normal.risk_factor_override.long", ErrIsNotValidNumber) + } else if d.LessThanOrEqual(num.DecimalZero()) { + errs.AddForProperty("update_market.changes.risk_parameters.log_normal.risk_factor_override.long", ErrMustBePositive) + } + } + return errs } diff --git a/commands/proposal_submission_new_market_test.go b/commands/proposal_submission_new_market_test.go index 461e5e9a102..f3ec82ac0bf 100644 --- a/commands/proposal_submission_new_market_test.go +++ b/commands/proposal_submission_new_market_test.go @@ -51,6 +51,8 @@ func TestCheckProposalSubmissionForNewMarket(t *testing.T) { t.Run("Submitting a market change with negative slippage factor fails", testNewMarketChangeSubmissionWithSlippageFactorNegativeFails) t.Run("Submitting a market change with empty max slippage factor succeeds", testNewMarketChangeSubmissionWithEmptySlippageFactorPasses) t.Run("Submitting a market change with too large slippage factor fails", testNewMarketChangeSubmissionWithSlippageFactorTooLargeFails) + t.Run("Submitting a new capped market with max price succeeds", testNewCappedMarketWithMaxPriceSucceeds) + t.Run("Submitting a new capped market without max price fails", testNewCappedMarketWithoutMaxPriceFails) t.Run("Submitting a new market without price monitoring succeeds", testNewMarketChangeSubmissionWithoutPriceMonitoringSucceeds) t.Run("Submitting a new market with price monitoring succeeds", testNewMarketChangeSubmissionWithPriceMonitoringSucceeds) @@ -189,6 +191,8 @@ func TestCheckProposalSubmissionForNewMarket(t *testing.T) { t.Run("Submitting a new spot market with invalid liquidity fee settings", testLiquidityFeeSettingsSpot) t.Run("Submitting a new market with invalid mark price configuration ", testCompositePriceConfiguration) t.Run("Submitting a new market with invalid tick size fails and with valid tick size succeeds", testNewMarketTickSize) + + t.Run("Log Normal risk factor overrides", testNewLogNormalRiskParametersChangeSubmissionWithOverrides) } type tickSizeCase struct { @@ -874,6 +878,89 @@ func testPriceMonitoringChangeSubmissionWithTriggerAuctionExtensionSucceeds(t *t assert.NotContains(t, err.Get("proposal_submission.terms.change.new_market.changes.price_monitoring_parameters.triggers.1.auction_extension"), commands.ErrMustBePositive) } +func testNewCappedMarketWithMaxPriceSucceeds(t *testing.T) { + err := checkProposalSubmission(&commandspb.ProposalSubmission{ + Terms: &vegapb.ProposalTerms{ + Change: &vegapb.ProposalTerms_NewMarket{ + NewMarket: &vegapb.NewMarket{ + Changes: &vegapb.NewMarketConfiguration{ + Instrument: &vegapb.InstrumentConfiguration{ + Product: &vegapb.InstrumentConfiguration_Future{ + Future: &vegapb.FutureProduct{ + Cap: &vegapb.FutureCap{ + MaxPrice: "100", + }, + }, + }, + }, + TickSize: "10", // ensure tick size is fine, too + }, + }, + }, + }, + }) + assert.NotContains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrMustBePositive) + assert.NotContains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrIsRequired) + assert.NotContains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrMaxPriceMustRespectTickSize) +} + +func testNewCappedMarketWithoutMaxPriceFails(t *testing.T) { + fCap := &vegapb.FutureCap{ + MaxPrice: "", + } + nmConf := &vegapb.NewMarketConfiguration{ + Instrument: &vegapb.InstrumentConfiguration{ + Product: &vegapb.InstrumentConfiguration_Future{ + Future: &vegapb.FutureProduct{ + Cap: fCap, + }, + }, + }, + } + cmd := &commandspb.ProposalSubmission{ + Terms: &vegapb.ProposalTerms{ + Change: &vegapb.ProposalTerms_NewMarket{ + NewMarket: &vegapb.NewMarket{ + Changes: nmConf, + }, + }, + }, + } + // submit with empty string: + err := checkProposalSubmission(cmd) + assert.Contains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrIsRequired) + assert.NotContains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrMaxPriceMustRespectTickSize) + fCap.MaxPrice = "foobar" // invalid input + err = checkProposalSubmission(cmd) + assert.Contains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrMustBePositive) + // submit with invalid value relative to tick size + fCap.MaxPrice = "123" + nmConf.TickSize = "10" + err = checkProposalSubmission(cmd) + assert.Contains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrMaxPriceMustRespectTickSize) + + // submit with no max price but other fields set (0019-MCAL-170) + fCap.MaxPrice = "" + fCap.BinarySettlement = ptr.From(true) + fCap.FullyCollateralised = nil + err = checkProposalSubmission(cmd) + assert.Contains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrIsRequired) + + // submit with no max price but other fields set (0019-MCAL-171) + fCap.MaxPrice = "" + fCap.BinarySettlement = nil + fCap.FullyCollateralised = ptr.From(true) + err = checkProposalSubmission(cmd) + assert.Contains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrIsRequired) + + // max cap of zero is rejected + fCap.MaxPrice = "0" + fCap.BinarySettlement = nil + fCap.FullyCollateralised = ptr.From(true) + err = checkProposalSubmission(cmd) + assert.Contains(t, err.Get("proposal_submission.terms.change.new_market.changes.instrument.product.future.cap.max_price"), commands.ErrMustBePositive) +} + func testNewMarketChangeSubmissionWithoutPriceMonitoringSucceeds(t *testing.T) { err := checkProposalSubmission(&commandspb.ProposalSubmission{ Terms: &vegapb.ProposalTerms{ @@ -2497,6 +2584,129 @@ func testNewLogNormalRiskParametersChangeSubmissionWithLogNormalRiskParametersSu assert.NotContains(t, err.Get("proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal"), commands.ErrIsRequired) } +func testNewLogNormalRiskParametersChangeSubmissionWithOverrides(t *testing.T) { + cases := []struct { + desc string + get string + override *vegapb.RiskFactorOverride + err string + }{ + { + desc: "no override is valid", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override", + override: nil, + err: "", + }, + { + desc: "non nil, but with empty short", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override.short", + override: &vegapb.RiskFactorOverride{}, + err: "is required", + }, + { + desc: "non nil, but with bad value short", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override.short", + override: &vegapb.RiskFactorOverride{ + Short: "asd", + }, + err: "is not a valid number", + }, + { + desc: "non nil, but with negative short", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override.short", + override: &vegapb.RiskFactorOverride{ + Short: "-1", + }, + err: "must be positive", + }, + { + desc: "non nil, but with 0 short", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override.short", + override: &vegapb.RiskFactorOverride{ + Short: "0", + }, + err: "must be positive", + }, + { + desc: "non nil, but with empty long", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override.long", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + }, + err: "is required", + }, + { + desc: "non nil, but with bad value long", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override.long", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + Long: "asd", + }, + err: "is not a valid number", + }, + { + desc: "non nil, but with negative long", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override.long", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + Long: "-1", + }, + err: "must be positive", + }, + { + desc: "non nil, but with 0 long", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override.long", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + Long: "0", + }, + err: "must be positive", + }, + { + desc: "both valid", + get: "proposal_submission.terms.change.new_market.changes.risk_parameters.log_normal.risk_factor_override", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + Long: "0.1", + }, + err: "", + }, + } + + for _, c := range cases { + err := checkProposalSubmission(&commandspb.ProposalSubmission{ + Terms: &vegapb.ProposalTerms{ + Change: &vegapb.ProposalTerms_NewMarket{ + NewMarket: &vegapb.NewMarket{ + Changes: &vegapb.NewMarketConfiguration{ + RiskParameters: &vegapb.NewMarketConfiguration_LogNormal{ + LogNormal: &vegapb.LogNormalRiskModel{ + RiskAversionParameter: 0.1, + Tau: 1, + Params: &vegapb.LogNormalModelParams{ + Mu: 0, + Sigma: 0.1, + R: 0, + }, + RiskFactorOverride: c.override, + }, + }, + }, + }, + }, + }, + }) + + if len(c.err) <= 0 { + // no error + assert.Len(t, err.Get(c.get), 0, c.desc) + continue + } + + assert.Contains(t, err.Get(c.get), errors.New(c.err), "test: %v, err: %v", c.desc, err) + } +} + func testNewLogNormalRiskParametersChangeSubmissionWithoutParamsFails(t *testing.T) { err := checkProposalSubmission(&commandspb.ProposalSubmission{ Terms: &vegapb.ProposalTerms{ diff --git a/commands/proposal_submission_new_transfer_test.go b/commands/proposal_submission_new_transfer_test.go index 941e001c14b..9ba54244326 100644 --- a/commands/proposal_submission_new_transfer_test.go +++ b/commands/proposal_submission_new_transfer_test.go @@ -53,6 +53,7 @@ func TestCheckProposalSubmissionForNewTransfer(t *testing.T) { t.Run("Submitting a new recurring transfer change with a dispatch strategy and mismatching destination type for metric", testInvalidDestForMetric) t.Run("Submitting a new transfer change with destination type general and an invalid vega public key", testInvalidGeneralPubKey) t.Run("Submitting a new transfer change with destination type general and an invalid vega public key", testOnlyGeneralValid) + t.Run("Submitting a new transfer change with invalid decay factor", testInvalidDecayFactor) } func testInvalidDestForMetric(t *testing.T) { @@ -349,6 +350,80 @@ func testOneOffWithNegativeDeliverOn(t *testing.T) { require.Contains(t, err.Get("proposal_submission.terms.change.new_transfer.changes.oneoff.deliveron"), commands.ErrMustBePositiveOrZero) } +func testInvalidDecayFactor(t *testing.T) { + decayFactors := []string{"", "-0.1", "bc", "0"} + errors := []string{ + "proposal_submission.terms.change.new_transfer.changes.recurring.factor (not a valid float)", + "proposal_submission.terms.change.new_transfer.changes.recurring.factor (must be positive)", + "proposal_submission.terms.change.new_transfer.changes.recurring.factor (not a valid float)", + "proposal_submission.terms.change.new_transfer.changes.recurring.factor (must be positive)", + } + for i, decay := range decayFactors { + prop := &commandspb.ProposalSubmission{ + Rationale: &types.ProposalRationale{ + Description: "valid", + Title: "test", + }, + Terms: &types.ProposalTerms{ + ClosingTimestamp: time.Now().Unix() + 100, + EnactmentTimestamp: time.Now().Unix() + 200, + Change: &types.ProposalTerms_NewTransfer{ + NewTransfer: &types.NewTransfer{ + Changes: &types.NewTransferConfiguration{ + FractionOfBalance: "0.5", + Amount: "1000", + SourceType: types.AccountType_ACCOUNT_TYPE_NETWORK_TREASURY, + DestinationType: types.AccountType_ACCOUNT_TYPE_GENERAL, + Destination: crypto.RandomHash(), + TransferType: types.GovernanceTransferType_GOVERNANCE_TRANSFER_TYPE_ALL_OR_NOTHING, + Asset: "abcde", + Kind: &types.NewTransferConfiguration_Recurring{ + Recurring: &types.RecurringTransfer{ + StartEpoch: 0, + Factor: decay, + }, + }, + }, + }, + }, + }, + } + err := checkProposalSubmission(prop) + require.Equal(t, errors[i], err.Error()) + } + prop := &commandspb.ProposalSubmission{ + Rationale: &types.ProposalRationale{ + Description: "valid", + Title: "test", + }, + Terms: &types.ProposalTerms{ + ClosingTimestamp: time.Now().Unix() + 100, + EnactmentTimestamp: time.Now().Unix() + 200, + Change: &types.ProposalTerms_NewTransfer{ + NewTransfer: &types.NewTransfer{ + Changes: &types.NewTransferConfiguration{ + FractionOfBalance: "0.5", + Amount: "1000", + SourceType: types.AccountType_ACCOUNT_TYPE_NETWORK_TREASURY, + DestinationType: types.AccountType_ACCOUNT_TYPE_GENERAL, + Destination: crypto.RandomHash(), + TransferType: types.GovernanceTransferType_GOVERNANCE_TRANSFER_TYPE_ALL_OR_NOTHING, + Asset: "abcde", + Kind: &types.NewTransferConfiguration_Recurring{ + Recurring: &types.RecurringTransfer{ + StartEpoch: 0, + Factor: "0.5", + }, + }, + }, + }, + }, + }, + } + err := checkProposalSubmission(prop) + require.True(t, err.Empty()) +} + func testOnlyGeneralValid(t *testing.T) { partyAccs := []types.AccountType{ types.AccountType_ACCOUNT_TYPE_MARGIN, diff --git a/commands/proposal_submission_update_market_test.go b/commands/proposal_submission_update_market_test.go index 2539561c0ab..e3fa5b44aa2 100644 --- a/commands/proposal_submission_update_market_test.go +++ b/commands/proposal_submission_update_market_test.go @@ -139,6 +139,7 @@ func TestCheckProposalSubmissionForUpdateMarket(t *testing.T) { t.Run("Submitting a market update with invalid intenal composite price configuration", testUpdatePerpsMarketChangeSubmissionWithInternalCompositePriceConfig) t.Run("Submitting a market update with invalid tick size fails and valid tick size succeeds", testUpdateMarketTickSize) t.Run("Submitting a spot market update with invalid liquifity fee settings", testUpdateLiquidityFeeSettingsSpot) + t.Run("Update Log Normal with overrides", testUpdateLogNormalRiskParametersChangeSubmissionWithOverrides) } func testUpdateMarketTickSize(t *testing.T) { @@ -2184,6 +2185,129 @@ func testUpdateSimpleRiskParametersChangeSubmissionWithRightProbabilityOfTrading } } +func testUpdateLogNormalRiskParametersChangeSubmissionWithOverrides(t *testing.T) { + cases := []struct { + desc string + get string + override *vegapb.RiskFactorOverride + err string + }{ + { + desc: "no override is valid", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override", + override: nil, + err: "", + }, + { + desc: "non nil, but with empty short", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override.short", + override: &vegapb.RiskFactorOverride{}, + err: "is required", + }, + { + desc: "non nil, but with bad value short", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override.short", + override: &vegapb.RiskFactorOverride{ + Short: "asd", + }, + err: "is not a valid number", + }, + { + desc: "non nil, but with negative short", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override.short", + override: &vegapb.RiskFactorOverride{ + Short: "-1", + }, + err: "must be positive", + }, + { + desc: "non nil, but with 0 short", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override.short", + override: &vegapb.RiskFactorOverride{ + Short: "0", + }, + err: "must be positive", + }, + { + desc: "non nil, but with empty long", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override.long", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + }, + err: "is required", + }, + { + desc: "non nil, but with bad value long", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override.long", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + Long: "asd", + }, + err: "is not a valid number", + }, + { + desc: "non nil, but with negative long", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override.long", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + Long: "-1", + }, + err: "must be positive", + }, + { + desc: "non nil, but with 0 long", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override.long", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + Long: "0", + }, + err: "must be positive", + }, + { + desc: "both valid", + get: "proposal_submission.terms.change.update_market.changes.risk_parameters.log_normal.risk_factor_override", + override: &vegapb.RiskFactorOverride{ + Short: "0.1", + Long: "0.1", + }, + err: "", + }, + } + + for _, c := range cases { + err := checkProposalSubmission(&commandspb.ProposalSubmission{ + Terms: &vegapb.ProposalTerms{ + Change: &vegapb.ProposalTerms_UpdateMarket{ + UpdateMarket: &vegapb.UpdateMarket{ + Changes: &vegapb.UpdateMarketConfiguration{ + RiskParameters: &vegapb.UpdateMarketConfiguration_LogNormal{ + LogNormal: &vegapb.LogNormalRiskModel{ + RiskAversionParameter: 0.1, + Tau: 1, + Params: &vegapb.LogNormalModelParams{ + Mu: 0, + Sigma: 0.1, + R: 0, + }, + RiskFactorOverride: c.override, + }, + }, + }, + }, + }, + }, + }) + + if len(c.err) <= 0 { + // no error + assert.Len(t, err.Get(c.get), 0, c.desc) + continue + } + + assert.Contains(t, err.Get(c.get), errors.New(c.err), "test: %v, err: %v", c.desc, err) + } +} + func testUpdateLogNormalRiskParametersChangeSubmissionWithoutLogNormalRiskParametersFails(t *testing.T) { err := checkProposalSubmission(&commandspb.ProposalSubmission{ Terms: &protoTypes.ProposalTerms{ diff --git a/commands/submit_amm.go b/commands/submit_amm.go new file mode 100644 index 00000000000..ac94b4311b3 --- /dev/null +++ b/commands/submit_amm.go @@ -0,0 +1,145 @@ +// 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.LeverageAtUpperBound != nil { + if len(*cmd.ConcentratedLiquidityParameters.LeverageAtUpperBound) <= 0 { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.leverage_at_upper_bound", ErrIsNotValidNumber) + } else if leverage, err := num.DecimalFromString(*cmd.ConcentratedLiquidityParameters.LeverageAtUpperBound); err != nil { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.leverage_at_upper_bound", ErrIsNotValidNumber) + } else if leverage.LessThan(num.DecimalZero()) { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.leverage_at_upper_bound", ErrMustBePositive) + } + } + + if cmd.ConcentratedLiquidityParameters.LeverageAtLowerBound != nil { + if len(*cmd.ConcentratedLiquidityParameters.LeverageAtLowerBound) <= 0 { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.leverage_at_lower_bound", ErrIsNotValidNumber) + } else if leverage, err := num.DecimalFromString(*cmd.ConcentratedLiquidityParameters.LeverageAtLowerBound); err != nil { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.leverage_at_lower_bound", ErrIsNotValidNumber) + } else if leverage.LessThan(num.DecimalZero()) { + errs.AddForProperty("submit_amm.concentrated_liquidity_parameters.leverage_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..0ebba6a1f46 --- /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{ + LeverageAtUpperBound: ptr.From(""), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.leverage_at_upper_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + LeverageAtUpperBound: ptr.From("abc"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.leverage_at_upper_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + LeverageAtUpperBound: ptr.From("-10"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.leverage_at_upper_bound (must be positive)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + LeverageAtLowerBound: ptr.From(""), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.leverage_at_lower_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + LeverageAtLowerBound: ptr.From("abc"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.leverage_at_lower_bound (is not a valid number)", + }, + { + submission: commandspb.SubmitAMM{ + ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{ + LeverageAtLowerBound: ptr.From("-10"), + }, + }, + errStr: "submit_amm.concentrated_liquidity_parameters.leverage_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", + LeverageAtUpperBound: ptr.From("0.1"), + LeverageAtLowerBound: 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"), + LeverageAtUpperBound: ptr.From("0.1"), + LeverageAtLowerBound: 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..7602d30c97c 100644 --- a/commands/transaction.go +++ b/commands/transaction.go @@ -258,6 +258,14 @@ 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)) + case *commandspb.InputData_DelayedTransactionsWrapper: + break default: errs.AddForProperty("tx.input_data.command", ErrIsNotSupported) } diff --git a/commands/transfer_funds.go b/commands/transfer_funds.go index ee17c2e6856..3cd066ec070 100644 --- a/commands/transfer_funds.go +++ b/commands/transfer_funds.go @@ -89,6 +89,21 @@ func checkTransfer(cmd *commandspb.Transfer) (e Errors) { errs.AddForProperty("transfer.reference", ErrMustBeLessThan100Chars) } + // derived key check + if cmd.From != nil { + if !IsVegaPublicKey(*cmd.From) { + errs.AddForProperty("transfer.from", ErrShouldBeAValidVegaPublicKey) + } + + if cmd.FromAccountType != vega.AccountType_ACCOUNT_TYPE_VESTED_REWARDS { + errs.AddForProperty("transfer.from", errors.New("from can only be set for vested rewards")) + } + + if cmd.ToAccountType != vega.AccountType_ACCOUNT_TYPE_GENERAL { + errs.AddForProperty("transfer.from", errors.New("from can only be set when transferring to general account")) + } + } + if cmd.Kind == nil { errs.AddForProperty("transfer.kind", ErrIsRequired) } else { diff --git a/commands/transfer_funds_test.go b/commands/transfer_funds_test.go index 566cdeaa237..ad3487c6424 100644 --- a/commands/transfer_funds_test.go +++ b/commands/transfer_funds_test.go @@ -1381,6 +1381,66 @@ func TestTransferFunds(t *testing.T) { }, errString: "transfer.kind.dispatch_strategy.transfer_interval (must be between 1 and 100)", }, + // sub account type tests + { + transfer: commandspb.Transfer{ + FromAccountType: vega.AccountType_ACCOUNT_TYPE_VESTED_REWARDS, + ToAccountType: vega.AccountType_ACCOUNT_TYPE_GENERAL, + From: toPointer("derived_key"), + Kind: &commandspb.Transfer_OneOff{ + OneOff: &commandspb.OneOffTransfer{}, + }, + To: "0000000000000000000000000000000000000000000000000000000000000000", + Asset: "080538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff", + Amount: "1", + Reference: "testing", + }, + errString: "transfer.from (should be a valid vega public key)", + }, + { + transfer: commandspb.Transfer{ + FromAccountType: vega.AccountType_ACCOUNT_TYPE_GENERAL, + ToAccountType: vega.AccountType_ACCOUNT_TYPE_GENERAL, + From: toPointer("171538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff"), + Kind: &commandspb.Transfer_OneOff{ + OneOff: &commandspb.OneOffTransfer{}, + }, + To: "0000000000000000000000000000000000000000000000000000000000000000", + Asset: "080538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff", + Amount: "1", + Reference: "testing", + }, + errString: "transfer.from (from can only be set for vested rewards)", + }, + { + transfer: commandspb.Transfer{ + FromAccountType: vega.AccountType_ACCOUNT_TYPE_VESTED_REWARDS, + ToAccountType: vega.AccountType_ACCOUNT_TYPE_GLOBAL_REWARD, + From: toPointer("171538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff"), + Kind: &commandspb.Transfer_OneOff{ + OneOff: &commandspb.OneOffTransfer{}, + }, + To: "0000000000000000000000000000000000000000000000000000000000000000", + Asset: "080538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff", + Amount: "1", + Reference: "testing", + }, + errString: "transfer.from (from can only be set when transferring to general account)", + }, + { + transfer: commandspb.Transfer{ + FromAccountType: vega.AccountType_ACCOUNT_TYPE_VESTED_REWARDS, + ToAccountType: vega.AccountType_ACCOUNT_TYPE_GENERAL, + From: toPointer("171538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff"), + Kind: &commandspb.Transfer_OneOff{ + OneOff: &commandspb.OneOffTransfer{}, + }, + To: "0000000000000000000000000000000000000000000000000000000000000000", + Asset: "080538b7cc2249de568cb4272a17f4d5e0b0a69a1a240acbf5119d816178daff", + Amount: "1", + Reference: "testing", + }, + }, } invalidAccountTypesForOneOff := []vega.AccountType{ @@ -1445,3 +1505,7 @@ func checkTransfer(cmd *commandspb.Transfer) commands.Errors { return e } + +func toPointer[T any](val T) *T { + return &val +} diff --git a/core/banking/cancel_transfer.go b/core/banking/cancel_transfer.go index 013237ef364..fcdc7875101 100644 --- a/core/banking/cancel_transfer.go +++ b/core/banking/cancel_transfer.go @@ -22,7 +22,6 @@ import ( "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/types" - "code.vegaprotocol.io/vega/libs/num" ) var ( @@ -64,6 +63,6 @@ func (e *Engine) CancelGovTransfer(ctx context.Context, ID string) error { } e.deleteGovTransfer(ID) gTransfer.Status = types.TransferStatusCancelled - e.broker.Send(events.NewGovTransferFundsEvent(ctx, gTransfer, num.UintZero(), e.getGovGameID(gTransfer))) + e.broker.Send(events.NewGovTransferFundsEvent(ctx, gTransfer, gTransfer.Config.MaxAmount, e.getGovGameID(gTransfer))) return nil } diff --git a/core/banking/cancel_transfer_test.go b/core/banking/cancel_transfer_test.go index 032abe5a015..448221d4c9e 100644 --- a/core/banking/cancel_transfer_test.go +++ b/core/banking/cancel_transfer_test.go @@ -68,7 +68,6 @@ func TestCancelTransfer(t *testing.T) { e.assets.EXPECT().Get(gomock.Any()).Times(2).Return( assets.NewAsset(&mockAsset{quantum: num.DecimalFromFloat(100), name: asset}), nil) - e.tsvc.EXPECT().GetTimeNow().Times(2) e.broker.EXPECT().Send(gomock.Any()).Times(2) assert.NoError(t, e.TransferFunds(ctx, transfer)) diff --git a/core/banking/checkpoint.go b/core/banking/checkpoint.go index 97ba825e86d..6f4125e36ef 100644 --- a/core/banking/checkpoint.go +++ b/core/banking/checkpoint.go @@ -20,11 +20,11 @@ import ( "fmt" "sort" "sync/atomic" + "time" "code.vegaprotocol.io/vega/core/assets" "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/types" - "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/logging" "code.vegaprotocol.io/vega/protos/vega" @@ -96,13 +96,13 @@ func (e *Engine) Load(ctx context.Context, data []byte) error { e.lastSeenPrimaryEthBlock = b.LastSeenPrimaryEthBlock if e.lastSeenPrimaryEthBlock != 0 { e.log.Info("restoring primary collateral bridge starting block", logging.Uint64("block", e.lastSeenPrimaryEthBlock)) - e.primaryEthEventSource.UpdateCollateralStartingBlock(e.lastSeenPrimaryEthBlock) + e.ethEventSource.UpdateContractBlock(e.bridgeAddresses[e.primaryEthChainID], e.primaryEthChainID, e.lastSeenPrimaryEthBlock) } e.lastSeenSecondaryEthBlock = b.LastSeenSecondaryEthBlock if e.lastSeenSecondaryEthBlock != 0 { e.log.Info("restoring secondary collateral bridge starting block", logging.Uint64("block", e.lastSeenSecondaryEthBlock)) - e.secondaryEthEventSource.UpdateCollateralStartingBlock(e.lastSeenSecondaryEthBlock) + e.ethEventSource.UpdateContractBlock(e.bridgeAddresses[e.secondaryEthChainID], e.secondaryEthChainID, e.lastSeenSecondaryEthBlock) } aa := make([]*types.AssetAction, 0, len(b.AssetActions)) @@ -241,7 +241,7 @@ func (e *Engine) loadScheduledGovernanceTransfers(ctx context.Context, r []*chec for _, g := range v.Transfers { transfer := types.GovernanceTransferFromProto(g) transfers = append(transfers, transfer) - evts = append(evts, events.NewGovTransferFundsEvent(ctx, transfer, num.UintZero(), e.getGovGameID(transfer))) + evts = append(evts, events.NewGovTransferFundsEvent(ctx, transfer, transfer.Config.MaxAmount, e.getGovGameID(transfer))) } e.scheduledGovernanceTransfers[v.DeliverOn] = transfers } @@ -272,6 +272,7 @@ func (e *Engine) loadRecurringTransfers( ctx context.Context, r *checkpoint.RecurringTransfers, ) []events.Event { evts := []events.Event{} + e.nextMetricUpdate = time.Unix(0, r.NextMetricUpdate) for _, v := range r.RecurringTransfers { transfer := types.RecurringTransferFromEvent(v) e.recurringTransfers = append(e.recurringTransfers, transfer) @@ -305,7 +306,7 @@ func (e *Engine) loadRecurringGovernanceTransfers(ctx context.Context, transfers if transfer.Config.RecurringTransferConfig.DispatchStrategy != nil { e.registerDispatchStrategy(transfer.Config.RecurringTransferConfig.DispatchStrategy) } - evts = append(evts, events.NewGovTransferFundsEvent(ctx, transfer, num.UintZero(), e.getGovGameID(transfer))) + evts = append(evts, events.NewGovTransferFundsEvent(ctx, transfer, transfer.Config.MaxAmount, e.getGovGameID(transfer))) } return evts } @@ -334,7 +335,7 @@ func (e *Engine) getRecurringTransfers() *checkpoint.RecurringTransfers { for _, v := range e.recurringTransfers { out.RecurringTransfers = append(out.RecurringTransfers, v.IntoEvent(nil, e.getGameID(v))) } - + out.NextMetricUpdate = e.nextMetricUpdate.UnixNano() return out } diff --git a/core/banking/checkpoint_test.go b/core/banking/checkpoint_test.go index 09f9342ded4..e439dca7ef6 100644 --- a/core/banking/checkpoint_test.go +++ b/core/banking/checkpoint_test.go @@ -81,11 +81,6 @@ func TestDepositFinalisedAfterCheckpoint(t *testing.T) { func testSimpledScheduledTransfer(t *testing.T) { e := getTestEngine(t) - e.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(10, 0) - }).AnyTimes() - // let's do a massive fee, easy to test. e.OnTransferFeeFactorUpdate(context.Background(), num.NewDecimalFromFloat(1)) e.OnTick(context.Background(), time.Unix(10, 0)) @@ -229,7 +224,6 @@ func TestGovernanceScheduledTransfer(t *testing.T) { } e.broker.EXPECT().Send(gomock.Any()).Times(1) - e.tsvc.EXPECT().GetTimeNow().Times(1).Return(time.Unix(10, 0)) require.NoError(t, e.NewGovernanceTransfer(ctx, "1", "some reference", transfer)) checkp, err := e.Checkpoint() @@ -286,11 +280,10 @@ func TestGovernanceRecurringTransfer(t *testing.T) { FractionOfBalance: num.DecimalFromFloat(0.1), Kind: types.TransferKindRecurring, OneOffTransferConfig: nil, - RecurringTransferConfig: &vega.RecurringTransfer{StartEpoch: 1, EndEpoch: &endEpoch}, + RecurringTransferConfig: &vega.RecurringTransfer{StartEpoch: 1, EndEpoch: &endEpoch, Factor: "1"}, } e.broker.EXPECT().Send(gomock.Any()).Times(1) - e.tsvc.EXPECT().GetTimeNow().Times(1).Return(time.Unix(10, 0)) require.NoError(t, e.NewGovernanceTransfer(ctx, "1", "some reference", transfer)) checkp, err := e.Checkpoint() @@ -316,7 +309,7 @@ func TestGovernanceRecurringTransfer(t *testing.T) { e2.col.EXPECT().GovernanceTransferFunds(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1) e2.OnEpoch(ctx, types.Epoch{Seq: 0, StartTime: time.Unix(10, 0), Action: vega.EpochAction_EPOCH_ACTION_END}) e2.OnEpoch(ctx, types.Epoch{Seq: 1, StartTime: time.Unix(20, 0), Action: vega.EpochAction_EPOCH_ACTION_START}) - e2.broker.EXPECT().Send(gomock.Any()).Times(3) + e2.broker.EXPECT().Send(gomock.Any()).Times(2) e2.broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() e2.OnEpoch(ctx, types.Epoch{Seq: 1, StartTime: time.Unix(20, 0), Action: vega.EpochAction_EPOCH_ACTION_END}) diff --git a/core/banking/deduplicate_test.go b/core/banking/deduplicate_test.go index 568a3a7ee5d..f9f09a779b6 100644 --- a/core/banking/deduplicate_test.go +++ b/core/banking/deduplicate_test.go @@ -25,6 +25,7 @@ import ( "code.vegaprotocol.io/vega/core/types" vgrand "code.vegaprotocol.io/vega/libs/rand" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" ) @@ -32,7 +33,7 @@ func TestAssetActionDeduplication(t *testing.T) { ctx := context.Background() eng := getTestEngine(t) - eng.OnPrimaryEthChainIDUpdated("1") + eng.OnPrimaryEthChainIDUpdated("1", "hello") id1 := vgrand.RandomStr(5) txHash1 := vgrand.RandomStr(5) @@ -54,9 +55,9 @@ func TestAssetActionDeduplication(t *testing.T) { asset1 := assets.NewAsset(erc20Asset) t.Run("Generate asset list", func(t *testing.T) { - eng.tsvc.EXPECT().GetTimeNow().Times(1).Return(time.Now()) eng.assets.EXPECT().Get(assetID1).Times(1).Return(asset1, nil) - require.NoError(t, eng.EnableERC20(ctx, assetList1, id1, 1000, 1000, txHash1, "")) + eng.ethSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).Times(1) + require.NoError(t, eng.EnableERC20(ctx, assetList1, id1, 1000, 1000, txHash1, "1")) // Validate the asset list. eng.witness.f(eng.witness.r, true) @@ -71,9 +72,8 @@ func TestAssetActionDeduplication(t *testing.T) { }) t.Run("Generate duplicated asset list and ", func(t *testing.T) { - eng.tsvc.EXPECT().GetTimeNow().Times(1).Return(time.Now()) eng.assets.EXPECT().Get(assetID1).Times(1).Return(asset1, nil) - require.NoError(t, eng.EnableERC20(ctx, assetList1, id1, 1000, 1000, txHash1, "")) + require.NoError(t, eng.EnableERC20(ctx, assetList1, id1, 1000, 1000, txHash1, "1")) // Validate the asset list. eng.witness.f(eng.witness.r, true) @@ -88,7 +88,6 @@ func TestAssetActionDeduplication(t *testing.T) { // set, which might happen with the introduction of the second bridge. We have // to ensure the event is acknowledge as a duplicate. t.Run("Generate a duplicated event but updated with the chain ID", func(t *testing.T) { - eng.tsvc.EXPECT().GetTimeNow().Times(1).Return(time.Now()) eng.assets.EXPECT().Get(assetID1).Times(1).Return(asset1, nil) require.NoError(t, eng.EnableERC20(ctx, assetList1, id1, 1000, 1000, txHash1, "1")) diff --git a/core/banking/engine.go b/core/banking/engine.go index 4e42c770108..859724a9574 100644 --- a/core/banking/engine.go +++ b/core/banking/engine.go @@ -40,7 +40,7 @@ import ( "golang.org/x/exp/maps" ) -//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/banking Assets,Notary,Collateral,Witness,TimeService,EpochService,Topology,MarketActivityTracker,ERC20BridgeView,EthereumEventSource +//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/banking Assets,Notary,Collateral,Witness,TimeService,EpochService,Topology,MarketActivityTracker,ERC20BridgeView,EthereumEventSource,Parties var ( ErrWrongAssetTypeUsedInBuiltinAssetChainEvent = errors.New("non builtin asset used for builtin asset chain event") @@ -113,10 +113,15 @@ type MarketActivityTracker interface { MarkPaidProposer(asset, market, payoutAsset string, marketsInScope []string, funder string) MarketTrackedForAsset(market, asset string) bool TeamStatsForMarkets(allMarketsForAssets, onlyTheseMarkets []string) map[string]map[string]*num.Uint + PublishGameMetric(ctx context.Context, dispatchStrategy []*vega.DispatchStrategy, now time.Time) } type EthereumEventSource interface { - UpdateCollateralStartingBlock(uint64) + UpdateContractBlock(string, string, uint64) +} + +type Parties interface { + CheckDerivedKeyOwnership(party types.PartyID, derivedKey string) bool } const ( @@ -142,6 +147,7 @@ type Engine struct { notary Notary assets Assets top Topology + parties Parties // assetActions tracks all the asset actions the engine must process on network // tick. @@ -158,7 +164,6 @@ type Engine struct { lastSeenPrimaryEthBlock uint64 primaryBridgeState *bridgeState primaryBridgeView ERC20BridgeView - primaryEthEventSource EthereumEventSource // lastSeenSecondaryEthBlock holds the block height of the latest ERC20 chain // event, from the secondary chain, processed by the engine. @@ -166,7 +171,11 @@ type Engine struct { secondaryEthChainID string secondaryBridgeState *bridgeState secondaryBridgeView ERC20BridgeView - secondaryEthEventSource EthereumEventSource + + // map from chain-id -> collateral contract address + bridgeAddresses map[string]string + + ethEventSource EthereumEventSource withdrawals map[string]withdrawalRef withdrawalCnt *big.Int @@ -206,6 +215,12 @@ type Engine struct { maxGovTransferQunatumMultiplier num.Decimal maxGovTransferFraction num.Decimal + + metricUpdateFrequency time.Duration + nextMetricUpdate time.Time + + // transient cache used to market a dispatch strategy as checked for eligibility for this round so we don't check again. + dispatchRequiredCache map[string]bool } type withdrawalRef struct { @@ -225,8 +240,8 @@ func New(log *logging.Logger, marketActivityTracker MarketActivityTracker, primaryBridgeView ERC20BridgeView, secondaryBridgeView ERC20BridgeView, - primaryEthEventSource EthereumEventSource, - secondaryEthEventSource EthereumEventSource, + ethEventSource EthereumEventSource, + parties Parties, ) (e *Engine) { log = log.Named(namedLogger) log.SetLevel(cfg.Level.Get()) @@ -241,8 +256,8 @@ func New(log *logging.Logger, assets: assets, notary: notary, top: top, - primaryEthEventSource: primaryEthEventSource, - secondaryEthEventSource: secondaryEthEventSource, + ethEventSource: ethEventSource, + parties: parties, assetActions: map[string]*assetAction{}, seenAssetActions: treeset.NewWithStringComparator(), withdrawals: map[string]withdrawalRef{}, @@ -259,6 +274,7 @@ func New(log *logging.Logger, minTransferQuantumMultiple: num.DecimalZero(), minWithdrawQuantumMultiple: num.DecimalZero(), marketActivityTracker: marketActivityTracker, + nextMetricUpdate: time.Time{}, hashToStrategy: map[string]*dispatchStrategyCacheEntry{}, primaryBridgeState: &bridgeState{ active: true, @@ -266,10 +282,12 @@ func New(log *logging.Logger, secondaryBridgeState: &bridgeState{ active: true, }, + bridgeAddresses: map[string]string{}, feeDiscountPerPartyAndAsset: map[partyAssetKey]*num.Uint{}, pendingPerAssetAndPartyFeeDiscountUpdates: map[string]map[string]*num.Uint{}, primaryBridgeView: primaryBridgeView, secondaryBridgeView: secondaryBridgeView, + dispatchRequiredCache: map[string]bool{}, } } @@ -288,12 +306,14 @@ func (e *Engine) OnMinWithdrawQuantumMultiple(ctx context.Context, f num.Decimal return nil } -func (e *Engine) OnPrimaryEthChainIDUpdated(chainID string) { +func (e *Engine) OnPrimaryEthChainIDUpdated(chainID, collateralAddress string) { e.primaryEthChainID = chainID + e.bridgeAddresses[chainID] = collateralAddress } -func (e *Engine) OnSecondaryEthChainIDUpdated(chainID string) { +func (e *Engine) OnSecondaryEthChainIDUpdated(chainID, collateralAddress string) { e.secondaryEthChainID = chainID + e.bridgeAddresses[chainID] = collateralAddress } // ReloadConf updates the internal configuration. @@ -310,6 +330,28 @@ func (e *Engine) ReloadConf(cfg Config) { e.cfg = cfg } +func (e *Engine) OnBlockEnd(ctx context.Context, now time.Time) { + if !now.Before(e.nextMetricUpdate) { + e.publishMetricData(ctx, now) + e.nextMetricUpdate = now.Add(e.metricUpdateFrequency) + } +} + +// publishMetricData requests the market activity tracker to publish and event +// for each game with the current metric data for each party. +func (e *Engine) publishMetricData(ctx context.Context, now time.Time) { + hashes := make([]string, 0, len(e.hashToStrategy)) + for hash := range e.hashToStrategy { + hashes = append(hashes, hash) + } + sort.Strings(hashes) + dss := make([]*vega.DispatchStrategy, 0, len(hashes)) + for _, hash := range hashes { + dss = append(dss, e.hashToStrategy[hash].ds) + } + e.marketActivityTracker.PublishGameMetric(ctx, dss, now) +} + func (e *Engine) OnEpoch(ctx context.Context, ep types.Epoch) { switch ep.Action { case proto.EpochAction_EPOCH_ACTION_START: @@ -320,6 +362,9 @@ func (e *Engine) OnEpoch(ctx context.Context, ep types.Epoch) { e.distributeRecurringGovernanceTransfers(ctx) e.applyPendingFeeDiscountsUpdates(ctx) e.sendTeamsStats(ctx, ep.Seq) + e.dispatchRequiredCache = map[string]bool{} + // as the metrics are going to be published here, we want to progress the next update. + e.nextMetricUpdate = e.timeService.GetTimeNow().Add(e.metricUpdateFrequency) default: e.log.Panic("epoch action should never be UNSPECIFIED", logging.String("epoch", ep.String())) } @@ -425,6 +470,11 @@ func (e *Engine) dedupAction(ctx context.Context, aa *assetAction) error { } func (e *Engine) finalizeAction(ctx context.Context, aa *assetAction, now time.Time) error { + // tell the evt forwarder tracker about this block height + if addr, ok := e.bridgeAddresses[aa.chainID]; ok { + e.ethEventSource.UpdateContractBlock(addr, aa.chainID, aa.blockHeight) + } + switch { case aa.IsBuiltinAssetDeposit(): dep := e.deposits[aa.id] @@ -581,6 +631,10 @@ func (e *Engine) GetDispatchStrategy(hash string) *proto.DispatchStrategy { return nil } + if ds.refCount == 0 { + return nil + } + return ds.ds } diff --git a/core/banking/engine_test.go b/core/banking/engine_test.go index 2fe7d638675..78922818012 100644 --- a/core/banking/engine_test.go +++ b/core/banking/engine_test.go @@ -55,6 +55,7 @@ type testEngine struct { marketActivityTracker *mocks.MockMarketActivityTracker ethSource *mocks.MockEthereumEventSource secondaryBridgeView *mocks.MockERC20BridgeView + parties *mocks.MockParties } func getTestEngine(t *testing.T) *testEngine { @@ -64,6 +65,10 @@ func getTestEngine(t *testing.T) *testEngine { col := mocks.NewMockCollateral(ctrl) assets := mocks.NewMockAssets(ctrl) tsvc := mocks.NewMockTimeService(ctrl) + tsvc.EXPECT().GetTimeNow().DoAndReturn( + func() time.Time { + return time.Unix(10, 0) + }).AnyTimes() notary := mocks.NewMockNotary(ctrl) broker := bmocks.NewMockBroker(ctrl) top := mocks.NewMockTopology(ctrl) @@ -75,10 +80,12 @@ func getTestEngine(t *testing.T) *testEngine { notary.EXPECT().OfferSignatures(gomock.Any(), gomock.Any()).AnyTimes() epoch.EXPECT().NotifyOnEpoch(gomock.Any(), gomock.Any()).AnyTimes() - eng := banking.New(logging.NewTestLogger(), banking.NewDefaultConfig(), col, witness, tsvc, assets, notary, broker, top, marketActivityTracker, primaryBridgeView, secondaryBridgeView, ethSource, nil) + parties := mocks.NewMockParties(ctrl) + eng := banking.New(logging.NewTestLogger(), banking.NewDefaultConfig(), col, witness, tsvc, assets, notary, broker, top, marketActivityTracker, primaryBridgeView, secondaryBridgeView, ethSource, parties) require.NoError(t, eng.OnMaxQuantumAmountUpdate(context.Background(), num.DecimalOne())) - eng.OnPrimaryEthChainIDUpdated("1") + eng.OnPrimaryEthChainIDUpdated("1", "hello") + eng.OnSecondaryEthChainIDUpdated("2", "hello2") return &testEngine{ Engine: eng, @@ -94,6 +101,7 @@ func getTestEngine(t *testing.T) *testEngine { secondaryBridgeView: secondaryBridgeView, marketActivityTracker: marketActivityTracker, ethSource: ethSource, + parties: parties, } } @@ -118,7 +126,6 @@ func testDepositSuccess(t *testing.T) { } // call the deposit function - eng.tsvc.EXPECT().GetTimeNow().Times(2).Return(time.Now()) err := eng.DepositBuiltinAsset(context.Background(), bad, "depositid", 42) assert.NoError(t, err) @@ -147,7 +154,6 @@ func testDepositSuccessNoTxDuplicate(t *testing.T) { } // call the deposit function - eng.tsvc.EXPECT().GetTimeNow().Times(2).Return(time.Now()) require.NoError(t, eng.DepositBuiltinAsset(context.Background(), bad, "depositid", 42)) // then we call the callback from the fake witness @@ -161,7 +167,6 @@ func testDepositSuccessNoTxDuplicate(t *testing.T) { eng.OnTick(context.Background(), time.Now()) // call the deposit function - eng.tsvc.EXPECT().GetTimeNow().Times(2).Return(time.Now()) require.NoError(t, eng.DepositBuiltinAsset(context.Background(), bad, "depositid2", 43)) // then we call the callback from the fake witness @@ -188,7 +193,6 @@ func testDepositFailure(t *testing.T) { } // call the deposit function - eng.tsvc.EXPECT().GetTimeNow().Times(2).Return(time.Now()) err := eng.DepositBuiltinAsset(context.Background(), bad, "depositid", 42) assert.NoError(t, err) @@ -217,7 +221,6 @@ func testDepositError(t *testing.T) { eng.witness.err = expectError // call the deposit function - eng.tsvc.EXPECT().GetTimeNow().Times(2).Return(time.Now()) err := eng.DepositBuiltinAsset(context.Background(), bad, "depositid", 42) assert.EqualError(t, err, expectError.Error()) } @@ -236,7 +239,6 @@ func testDepositFailureNotBuiltin(t *testing.T) { } // call the deposit function - eng.tsvc.EXPECT().GetTimeNow().Times(1).Return(time.Now()) err := eng.DepositBuiltinAsset(context.Background(), bad, "depositid", 42) assert.EqualError(t, err, expectError.Error()) } diff --git a/core/banking/erc20.go b/core/banking/erc20.go index cff3d6f7250..86499f1e2c2 100644 --- a/core/banking/erc20.go +++ b/core/banking/erc20.go @@ -42,6 +42,7 @@ type ERC20BridgeView interface { FindBridgeResumed(al *types.ERC20EventBridgeResumed, blockNumber, logIndex uint64, txHash string) error FindDeposit(d *types.ERC20Deposit, blockNumber, logIndex uint64, ethAssetAddress string, txHash string) error FindAssetLimitsUpdated(update *types.ERC20AssetLimitsUpdated, blockNumber uint64, logIndex uint64, ethAssetAddress string, txHash string) error + CollateralBridgeAddress() string } func (e *Engine) EnableERC20( @@ -348,9 +349,4 @@ func (e *Engine) offerERC20NotarySignatures(resource string) []byte { func (e *Engine) addAction(aa *assetAction) { e.assetActions[aa.id] = aa - if aa.chainID == e.primaryEthChainID && aa.blockHeight > e.lastSeenPrimaryEthBlock { - e.lastSeenPrimaryEthBlock = aa.blockHeight - } else if aa.chainID == e.secondaryEthChainID && aa.blockHeight > e.lastSeenSecondaryEthBlock { - e.lastSeenSecondaryEthBlock = aa.blockHeight - } } diff --git a/core/banking/fee_estimate.go b/core/banking/fee_estimate.go index 0b3637a7cb1..0c2d94d45b6 100644 --- a/core/banking/fee_estimate.go +++ b/core/banking/fee_estimate.go @@ -29,9 +29,11 @@ func EstimateFee( accumulatedDiscount *num.Uint, from string, fromAccountType types.AccountType, + fromDerivedKey *string, to string, ) (fee *num.Uint, discount *num.Uint) { - tFee := calculateFeeForTransfer(assetQuantum, maxQuantumAmount, transferFeeFactor, amount, from, fromAccountType, to) + tFee := calculateFeeForTransfer(assetQuantum, maxQuantumAmount, transferFeeFactor, amount, from, + fromAccountType, fromDerivedKey, to) return calculateDiscount(accumulatedDiscount, tFee) } @@ -42,12 +44,14 @@ func calculateFeeForTransfer( amount *num.Uint, from string, fromAccountType types.AccountType, + fromDerivedKey *string, to string, ) *num.Uint { feeAmount := num.UintZero() // no fee for Vested account - if fromAccountType == types.AccountTypeVestedRewards && from == to { + // either from owner's vested to their general account or from derived key vested to owner's general account + if fromAccountType == types.AccountTypeVestedRewards && (from == to || fromDerivedKey != nil) { return feeAmount } diff --git a/core/banking/gov_transfers.go b/core/banking/gov_transfers.go index a647aed7a91..665bd6e1f52 100644 --- a/core/banking/gov_transfers.go +++ b/core/banking/gov_transfers.go @@ -67,13 +67,13 @@ func (e *Engine) distributeScheduledGovernanceTransfers(ctx context.Context, now for _, t := range timepoints { transfers := e.scheduledGovernanceTransfers[t] for _, gTransfer := range transfers { - amt, err := e.processGovernanceTransfer(ctx, gTransfer) + _, err := e.processGovernanceTransfer(ctx, gTransfer) if err != nil { gTransfer.Status = types.TransferStatusStopped - e.broker.Send(events.NewGovTransferFundsEventWithReason(ctx, gTransfer, amt, err.Error(), e.getGovGameID(gTransfer))) + e.broker.Send(events.NewGovTransferFundsEventWithReason(ctx, gTransfer, gTransfer.Config.MaxAmount, err.Error(), e.getGovGameID(gTransfer))) } else { gTransfer.Status = types.TransferStatusDone - e.broker.Send(events.NewGovTransferFundsEvent(ctx, gTransfer, amt, e.getGovGameID(gTransfer))) + e.broker.Send(events.NewGovTransferFundsEvent(ctx, gTransfer, gTransfer.Config.MaxAmount, e.getGovGameID(gTransfer))) } } delete(e.scheduledGovernanceTransfers, t) @@ -104,19 +104,18 @@ func (e *Engine) distributeRecurringGovernanceTransfers(ctx context.Context) { if err != nil { e.log.Error("error calculating transfer amount for governance transfer", logging.Error(err)) gTransfer.Status = types.TransferStatusStopped - transfersDone = append(transfersDone, events.NewGovTransferFundsEventWithReason(ctx, gTransfer, amount, err.Error(), e.getGovGameID(gTransfer))) + transfersDone = append(transfersDone, events.NewGovTransferFundsEventWithReason(ctx, gTransfer, gTransfer.Config.MaxAmount, err.Error(), e.getGovGameID(gTransfer))) doneIDs = append(doneIDs, gTransfer.ID) continue } if gTransfer.Config.RecurringTransferConfig.EndEpoch != nil && *gTransfer.Config.RecurringTransferConfig.EndEpoch == e.currentEpoch { gTransfer.Status = types.TransferStatusDone - transfersDone = append(transfersDone, events.NewGovTransferFundsEvent(ctx, gTransfer, amount, e.getGovGameID(gTransfer))) + transfersDone = append(transfersDone, events.NewGovTransferFundsEvent(ctx, gTransfer, gTransfer.Config.MaxAmount, e.getGovGameID(gTransfer))) doneIDs = append(doneIDs, gTransfer.ID) e.log.Info("recurrent transfer is done", logging.String("transfer ID", gTransfer.ID)) continue } - e.broker.Send(events.NewGovTransferFundsEvent(ctx, gTransfer, amount, e.getGovGameID(gTransfer))) } if len(transfersDone) > 0 { @@ -148,14 +147,13 @@ func (e *Engine) deleteGovTransfer(ID string) { func (e *Engine) NewGovernanceTransfer(ctx context.Context, ID, reference string, config *types.NewTransferConfiguration) error { var err error - var amount *num.Uint var gTransfer *types.GovernanceTransfer defer func() { if err != nil { - e.broker.Send(events.NewGovTransferFundsEventWithReason(ctx, gTransfer, amount, err.Error(), e.getGovGameID(gTransfer))) + e.broker.Send(events.NewGovTransferFundsEventWithReason(ctx, gTransfer, gTransfer.Config.MaxAmount, err.Error(), e.getGovGameID(gTransfer))) } else { - e.broker.Send(events.NewGovTransferFundsEvent(ctx, gTransfer, amount, e.getGovGameID(gTransfer))) + e.broker.Send(events.NewGovTransferFundsEvent(ctx, gTransfer, gTransfer.Config.MaxAmount, e.getGovGameID(gTransfer))) } }() now := e.timeService.GetTimeNow() @@ -169,7 +167,7 @@ func (e *Engine) NewGovernanceTransfer(ctx context.Context, ID, reference string if config.Kind == types.TransferKindOneOff { // one off governance transfer to be executed straight away if config.OneOffTransferConfig.DeliverOn == 0 || config.OneOffTransferConfig.DeliverOn < now.UnixNano() { - amount, err = e.processGovernanceTransfer(ctx, gTransfer) + _, err = e.processGovernanceTransfer(ctx, gTransfer) if err != nil { gTransfer.Status = types.TransferStatusRejected return err @@ -182,24 +180,36 @@ func (e *Engine) NewGovernanceTransfer(ctx context.Context, ID, reference string e.scheduledGovernanceTransfers[config.OneOffTransferConfig.DeliverOn] = []*types.GovernanceTransfer{} } e.scheduledGovernanceTransfers[config.OneOffTransferConfig.DeliverOn] = append(e.scheduledGovernanceTransfers[config.OneOffTransferConfig.DeliverOn], gTransfer) - amount = num.UintZero() gTransfer.Status = types.TransferStatusPending return nil } // recurring governance transfer - amount = num.UintZero() e.recurringGovernanceTransfers = append(e.recurringGovernanceTransfers, gTransfer) e.recurringGovernanceTransfersMap[ID] = gTransfer e.registerDispatchStrategy(gTransfer.Config.RecurringTransferConfig.DispatchStrategy) return nil } +func CalculateDecayedAmount(initialAmount *num.Uint, startEpoch, currentEpoch uint64, decayFactor string) *num.Uint { + if len(decayFactor) == 0 { + return initialAmount + } + factor := num.MustDecimalFromString(decayFactor) + amount, _ := num.UintFromDecimal(initialAmount.ToDecimal().Mul(factor.Pow(num.NewUint(currentEpoch).ToDecimal().Sub(num.NewUint(startEpoch).ToDecimal())))) + return amount +} + // processGovernanceTransfer process a governance transfer and emit ledger movement events. func (e *Engine) processGovernanceTransfer( ctx context.Context, gTransfer *types.GovernanceTransfer, ) (*num.Uint, error) { - transferAmount, err := e.CalculateGovernanceTransferAmount(gTransfer.Config.Asset, gTransfer.Config.Source, gTransfer.Config.SourceType, gTransfer.Config.FractionOfBalance, gTransfer.Config.MaxAmount, gTransfer.Config.TransferType) + amount := gTransfer.Config.MaxAmount + if gTransfer.Config.RecurringTransferConfig != nil { + amount = CalculateDecayedAmount(amount, gTransfer.Config.RecurringTransferConfig.StartEpoch, e.currentEpoch, gTransfer.Config.RecurringTransferConfig.Factor) + } + + transferAmount, err := e.CalculateGovernanceTransferAmount(gTransfer.Config.Asset, gTransfer.Config.Source, gTransfer.Config.SourceType, gTransfer.Config.FractionOfBalance, amount, gTransfer.Config.TransferType) if err != nil { e.log.Error("failed to calculate amount for governance transfer", logging.String("proposal", gTransfer.ID), logging.String("error", err.Error())) return num.UintZero(), err diff --git a/core/banking/gov_transfers_test.go b/core/banking/gov_transfers_test.go index 4ec0851c088..32f632458d3 100644 --- a/core/banking/gov_transfers_test.go +++ b/core/banking/gov_transfers_test.go @@ -20,6 +20,7 @@ import ( "testing" "code.vegaprotocol.io/vega/core/assets" + "code.vegaprotocol.io/vega/core/banking" "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/protos/vega" @@ -88,3 +89,12 @@ func TestCalculateGovernanceTransferAmount(t *testing.T) { require.NoError(t, err) require.Equal(t, num.NewUint(50000), balance) } + +func TestCalculateDecayedAmount(t *testing.T) { + // no decay + require.Equal(t, num.NewUint(1000), banking.CalculateDecayedAmount(num.NewUint(1000), 1, 10, "")) + // 0.5 decay, after one epoch + require.Equal(t, num.NewUint(500), banking.CalculateDecayedAmount(num.NewUint(1000), 1, 2, "0.5")) + // 0.5 decay, after two epochs + require.Equal(t, num.NewUint(250), banking.CalculateDecayedAmount(num.NewUint(1000), 1, 3, "0.5")) +} diff --git a/core/banking/mocks/mocks.go b/core/banking/mocks/mocks.go index 44671c4a515..3ac5f286fd4 100644 --- a/core/banking/mocks/mocks.go +++ b/core/banking/mocks/mocks.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: code.vegaprotocol.io/vega/core/banking (interfaces: Assets,Notary,Collateral,Witness,TimeService,EpochService,Topology,MarketActivityTracker,ERC20BridgeView,EthereumEventSource) +// Source: code.vegaprotocol.io/vega/core/banking (interfaces: Assets,Notary,Collateral,Witness,TimeService,EpochService,Topology,MarketActivityTracker,ERC20BridgeView,EthereumEventSource,Parties) // Package mocks is a generated GoMock package. package mocks @@ -554,6 +554,18 @@ func (mr *MockMarketActivityTrackerMockRecorder) MarketTrackedForAsset(arg0, arg return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarketTrackedForAsset", reflect.TypeOf((*MockMarketActivityTracker)(nil).MarketTrackedForAsset), arg0, arg1) } +// PublishGameMetric mocks base method. +func (m *MockMarketActivityTracker) PublishGameMetric(arg0 context.Context, arg1 []*vega.DispatchStrategy, arg2 time.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "PublishGameMetric", arg0, arg1, arg2) +} + +// PublishGameMetric indicates an expected call of PublishGameMetric. +func (mr *MockMarketActivityTrackerMockRecorder) PublishGameMetric(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PublishGameMetric", reflect.TypeOf((*MockMarketActivityTracker)(nil).PublishGameMetric), arg0, arg1, arg2) +} + // TeamStatsForMarkets mocks base method. func (m *MockMarketActivityTracker) TeamStatsForMarkets(arg0, arg1 []string) map[string]map[string]*num.Uint { m.ctrl.T.Helper() @@ -591,6 +603,20 @@ func (m *MockERC20BridgeView) EXPECT() *MockERC20BridgeViewMockRecorder { return m.recorder } +// CollateralBridgeAddress mocks base method. +func (m *MockERC20BridgeView) CollateralBridgeAddress() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CollateralBridgeAddress") + ret0, _ := ret[0].(string) + return ret0 +} + +// CollateralBridgeAddress indicates an expected call of CollateralBridgeAddress. +func (mr *MockERC20BridgeViewMockRecorder) CollateralBridgeAddress() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CollateralBridgeAddress", reflect.TypeOf((*MockERC20BridgeView)(nil).CollateralBridgeAddress)) +} + // FindAssetLimitsUpdated mocks base method. func (m *MockERC20BridgeView) FindAssetLimitsUpdated(arg0 *types.ERC20AssetLimitsUpdated, arg1, arg2 uint64, arg3, arg4 string) error { m.ctrl.T.Helper() @@ -684,14 +710,51 @@ func (m *MockEthereumEventSource) EXPECT() *MockEthereumEventSourceMockRecorder return m.recorder } -// UpdateCollateralStartingBlock mocks base method. -func (m *MockEthereumEventSource) UpdateCollateralStartingBlock(arg0 uint64) { +// UpdateContractBlock mocks base method. +func (m *MockEthereumEventSource) UpdateContractBlock(arg0, arg1 string, arg2 uint64) { m.ctrl.T.Helper() - m.ctrl.Call(m, "UpdateCollateralStartingBlock", arg0) + m.ctrl.Call(m, "UpdateContractBlock", arg0, arg1, arg2) +} + +// UpdateContractBlock indicates an expected call of UpdateContractBlock. +func (mr *MockEthereumEventSourceMockRecorder) UpdateContractBlock(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateContractBlock", reflect.TypeOf((*MockEthereumEventSource)(nil).UpdateContractBlock), arg0, arg1, arg2) +} + +// MockParties is a mock of Parties interface. +type MockParties struct { + ctrl *gomock.Controller + recorder *MockPartiesMockRecorder +} + +// MockPartiesMockRecorder is the mock recorder for MockParties. +type MockPartiesMockRecorder struct { + mock *MockParties +} + +// NewMockParties creates a new mock instance. +func NewMockParties(ctrl *gomock.Controller) *MockParties { + mock := &MockParties{ctrl: ctrl} + mock.recorder = &MockPartiesMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockParties) EXPECT() *MockPartiesMockRecorder { + return m.recorder +} + +// CheckDerivedKeyOwnership mocks base method. +func (m *MockParties) CheckDerivedKeyOwnership(arg0 types.PartyID, arg1 string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckDerivedKeyOwnership", arg0, arg1) + ret0, _ := ret[0].(bool) + return ret0 } -// UpdateCollateralStartingBlock indicates an expected call of UpdateCollateralStartingBlock. -func (mr *MockEthereumEventSourceMockRecorder) UpdateCollateralStartingBlock(arg0 interface{}) *gomock.Call { +// CheckDerivedKeyOwnership indicates an expected call of CheckDerivedKeyOwnership. +func (mr *MockPartiesMockRecorder) CheckDerivedKeyOwnership(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateCollateralStartingBlock", reflect.TypeOf((*MockEthereumEventSource)(nil).UpdateCollateralStartingBlock), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckDerivedKeyOwnership", reflect.TypeOf((*MockParties)(nil).CheckDerivedKeyOwnership), arg0, arg1) } diff --git a/core/banking/oneoff_transfers.go b/core/banking/oneoff_transfers.go index 43695cb4426..1e8d1c58cef 100644 --- a/core/banking/oneoff_transfers.go +++ b/core/banking/oneoff_transfers.go @@ -86,14 +86,22 @@ func (e *Engine) oneOffTransfer( return err } - if err := e.ensureMinimalTransferAmount(a, transfer.Amount, transfer.FromAccountType, transfer.From); err != nil { + if transfer.FromDerivedKey != nil { + if ownsDerivedKey := e.parties.CheckDerivedKeyOwnership(types.PartyID(transfer.From), *transfer.FromDerivedKey); !ownsDerivedKey { + transfer.Status = types.TransferStatusRejected + return fmt.Errorf("party %s does not own derived key %s", transfer.From, *transfer.FromDerivedKey) + } + } + + if err := e.ensureMinimalTransferAmount(a, transfer.Amount, transfer.FromAccountType, transfer.From, transfer.FromDerivedKey); err != nil { transfer.Status = types.TransferStatusRejected return err } tresps, err := e.processTransfer( ctx, a, transfer.From, transfer.To, "", transfer.FromAccountType, - transfer.ToAccountType, transfer.Amount, transfer.Reference, transfer.ID, e.currentEpoch, transfer, + transfer.ToAccountType, transfer.Amount, transfer.Reference, transfer.ID, e.currentEpoch, transfer.FromDerivedKey, + transfer, ) if err != nil { transfer.Status = types.TransferStatusRejected diff --git a/core/banking/oneoff_transfers_test.go b/core/banking/oneoff_transfers_test.go index 91b204a9b01..9e8fd7d91bb 100644 --- a/core/banking/oneoff_transfers_test.go +++ b/core/banking/oneoff_transfers_test.go @@ -38,6 +38,9 @@ func TestTransfers(t *testing.T) { t.Run("valid oneoff with deliverOn", testValidOneOffTransferWithDeliverOn) t.Run("valid oneoff with deliverOn in the past is done straight away", testValidOneOffTransferWithDeliverOnInThePastStraightAway) t.Run("rejected if doesn't reach minimal amount", testRejectedIfDoesntReachMinimalAmount) + t.Run("valid oneoff transfer from derived key", testValidOneOffTransferWithFromDerivedKey) + t.Run("onefoff invalid transfers from derived key", testOneOffTransferInvalidTransfersWithFromDerivedKey) + t.Run("onefoff invalid owner transfers from derived key", testOneOffTransferInvalidOwnerTransfersWithFromDerivedKey) } func testRejectedIfDoesntReachMinimalAmount(t *testing.T) { @@ -62,7 +65,6 @@ func testRejectedIfDoesntReachMinimalAmount(t *testing.T) { e.OnMinTransferQuantumMultiple(context.Background(), num.DecimalFromFloat(1)) // asset exists e.assets.EXPECT().Get(gomock.Any()).Times(1).Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.EqualError(t, @@ -78,7 +80,6 @@ func testInvalidTransferKind(t *testing.T) { transfer := &types.TransferFunds{ Kind: types.TransferCommandKind(-1), } - e.tsvc.EXPECT().GetTimeNow().Times(1) assert.EqualError(t, e.TransferFunds(ctx, transfer), banking.ErrUnsupportedTransferKind.Error(), @@ -88,8 +89,6 @@ func testInvalidTransferKind(t *testing.T) { func testOneOffTransferNotEnoughFundsToTransfer(t *testing.T) { e := getTestEngine(t) - e.tsvc.EXPECT().GetTimeNow().Times(1) - ctx := context.Background() transfer := &types.TransferFunds{ Kind: types.TransferCommandKindOneOff, @@ -145,7 +144,6 @@ func testOneOffTransferInvalidTransfers(t *testing.T) { var baseCpy types.TransferBase t.Run("invalid from account", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy := transferBase transfer.OneOff.TransferBase = &baseCpy @@ -157,7 +155,6 @@ func testOneOffTransferInvalidTransfers(t *testing.T) { }) t.Run("invalid to account", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy = transferBase transfer.OneOff.TransferBase = &baseCpy @@ -169,7 +166,6 @@ func testOneOffTransferInvalidTransfers(t *testing.T) { }) t.Run("unsupported from account type", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy = transferBase transfer.OneOff.TransferBase = &baseCpy @@ -181,7 +177,6 @@ func testOneOffTransferInvalidTransfers(t *testing.T) { }) t.Run("unsuported to account type", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy = transferBase transfer.OneOff.TransferBase = &baseCpy @@ -193,7 +188,6 @@ func testOneOffTransferInvalidTransfers(t *testing.T) { }) t.Run("zero funds transfer", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy = transferBase transfer.OneOff.TransferBase = &baseCpy @@ -232,7 +226,6 @@ func testValidOneOffTransfer(t *testing.T) { } // asset exists - e.tsvc.EXPECT().GetTimeNow().Times(1) e.assets.EXPECT().Get(gomock.Any()).Times(1).Return( assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) e.col.EXPECT().GetPartyGeneralAccount(gomock.Any(), gomock.Any()).Times(1).Return(&fromAcc, nil) @@ -277,18 +270,12 @@ func testValidOneOffTransfer(t *testing.T) { }) e.broker.EXPECT().Send(gomock.Any()).Times(3) - e.tsvc.EXPECT().GetTimeNow().AnyTimes() assert.NoError(t, e.TransferFunds(ctx, transfer)) } func testValidOneOffTransferWithDeliverOnInThePastStraightAway(t *testing.T) { e := getTestEngine(t) - e.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(10, 0) - }).AnyTimes() - // let's do a massive fee, easy to test e.OnTransferFeeFactorUpdate(context.Background(), num.NewDecimalFromFloat(1)) e.OnTick(context.Background(), time.Unix(10, 0)) @@ -391,9 +378,6 @@ func testValidOneOffTransferWithDeliverOn(t *testing.T) { Balance: num.NewUint(100), } - // Time given to e.Transferfunds - base time Unix(10,0) - e.tsvc.EXPECT().GetTimeNow().Times(2).Return(time.Unix(10, 0)) - // asset exists e.assets.EXPECT().Get(gomock.Any()).Times(1).Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) e.col.EXPECT().GetPartyGeneralAccount(gomock.Any(), gomock.Any()).Times(1).Return(&fromAcc, nil) @@ -469,3 +453,207 @@ func testValidOneOffTransferWithDeliverOn(t *testing.T) { e.broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() e.OnTick(context.Background(), time.Unix(12, 0)) } + +func testValidOneOffTransferWithFromDerivedKey(t *testing.T) { + e := getTestEngine(t) + + // let's do a massive fee, easy to test + e.OnTransferFeeFactorUpdate(context.Background(), num.NewDecimalFromFloat(1)) + + partyKey := "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301" + derivedKey := "c84fbf3442a2a9f9ca87c9cefe686aed241ff49981dd8ce819dd532cd42a8427" + amount := num.NewUint(10) + + ctx := context.Background() + transfer := &types.TransferFunds{ + Kind: types.TransferCommandKindOneOff, + OneOff: &types.OneOffTransfer{ + TransferBase: &types.TransferBase{ + From: partyKey, + FromDerivedKey: &derivedKey, + FromAccountType: types.AccountTypeVestedRewards, + To: partyKey, + ToAccountType: types.AccountTypeGeneral, + Asset: assetNameETH, + Amount: amount, + Reference: "someref", + }, + }, + } + + // asset exists + e.assets.EXPECT().Get(gomock.Any()).Times(1).Return( + assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) + + vestedAccount := types.Account{ + Owner: derivedKey, + // The amount is the same as the transfer amount to ensure that no fee is charged for this type of transaction. + Balance: amount, + Asset: assetNameETH, + } + + e.col.EXPECT().GetPartyVestedRewardAccount(derivedKey, assetNameETH).Return(&vestedAccount, nil).Times(1) + e.parties.EXPECT().CheckDerivedKeyOwnership(types.PartyID(partyKey), derivedKey).Return(true).Times(1) + + // assert the calculation of fees and transfer request are correct + e.col.EXPECT().TransferFunds(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(1).DoAndReturn( + func(ctx context.Context, + transfers []*types.Transfer, + accountTypes []types.AccountType, + references []string, + feeTransfers []*types.Transfer, + feeTransfersAccountTypes []types.AccountType, + ) ([]*types.LedgerMovement, error, + ) { + t.Run("ensure transfers are correct", func(t *testing.T) { + // transfer is done fully instantly, we should have 2 transfer + assert.Len(t, transfers, 2) + assert.Equal(t, derivedKey, transfers[0].Owner) + assert.Equal(t, num.NewUint(10), transfers[0].Amount.Amount) + assert.Equal(t, assetNameETH, transfers[0].Amount.Asset) + assert.Equal(t, partyKey, transfers[1].Owner) + assert.Equal(t, transfers[1].Amount.Amount, num.NewUint(10)) + assert.Equal(t, transfers[1].Amount.Asset, assetNameETH) + + // 2 account types too + assert.Len(t, accountTypes, 2) + assert.Equal(t, accountTypes[0], types.AccountTypeVestedRewards) + assert.Equal(t, accountTypes[1], types.AccountTypeGeneral) + }) + + t.Run("ensure fee transfers are correct", func(t *testing.T) { + assert.Len(t, feeTransfers, 1) + assert.Equal(t, partyKey, feeTransfers[0].Owner) + assert.Equal(t, num.UintZero(), feeTransfers[0].Amount.Amount) + assert.Equal(t, assetNameETH, feeTransfers[0].Amount.Asset) + + // then the fees account types + assert.Len(t, feeTransfersAccountTypes, 1) + assert.Equal(t, accountTypes[0], types.AccountTypeVestedRewards) + }) + return nil, nil + }) + + e.broker.EXPECT().Send(gomock.Any()).Times(3) + assert.NoError(t, e.TransferFunds(ctx, transfer)) +} + +func testOneOffTransferInvalidTransfersWithFromDerivedKey(t *testing.T) { + e := getTestEngine(t) + + ctx := context.Background() + transfer := types.TransferFunds{ + Kind: types.TransferCommandKindOneOff, + OneOff: &types.OneOffTransfer{}, + } + + partyKey := "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301" + derivedKey := "c84fbf3442a2a9f9ca87c9cefe686aed241ff49981dd8ce819dd532cd42a8427" + + transferBase := types.TransferBase{ + From: partyKey, + FromDerivedKey: &derivedKey, + FromAccountType: types.AccountTypeVestedRewards, + To: partyKey, + ToAccountType: types.AccountTypeGeneral, + Asset: assetNameETH, + Amount: num.NewUint(10), + Reference: "someref", + } + + // asset exists + e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(nil, nil) + var baseCpy types.TransferBase + + t.Run("invalid from account", func(t *testing.T) { + e.broker.EXPECT().Send(gomock.Any()).Times(1) + baseCpy := transferBase + transfer.OneOff.TransferBase = &baseCpy + transfer.OneOff.From = "" + assert.EqualError(t, + e.TransferFunds(ctx, &transfer), + types.ErrInvalidFromAccount.Error(), + ) + }) + + t.Run("invalid to account", func(t *testing.T) { + e.broker.EXPECT().Send(gomock.Any()).Times(1) + baseCpy = transferBase + transfer.OneOff.TransferBase = &baseCpy + transfer.OneOff.To = "" + assert.EqualError(t, + e.TransferFunds(ctx, &transfer), + types.ErrInvalidToAccount.Error(), + ) + }) + + t.Run("unsupported from account type", func(t *testing.T) { + e.broker.EXPECT().Send(gomock.Any()).Times(1) + baseCpy = transferBase + transfer.OneOff.TransferBase = &baseCpy + transfer.OneOff.FromAccountType = types.AccountTypeGeneral + assert.EqualError(t, + e.TransferFunds(ctx, &transfer), + types.ErrUnsupportedFromAccountType.Error(), + ) + }) + + t.Run("unsuported to account type", func(t *testing.T) { + e.broker.EXPECT().Send(gomock.Any()).Times(1) + baseCpy = transferBase + transfer.OneOff.TransferBase = &baseCpy + transfer.OneOff.ToAccountType = types.AccountTypeVestedRewards + assert.EqualError(t, + e.TransferFunds(ctx, &transfer), + types.ErrUnsupportedToAccountType.Error(), + ) + }) + + t.Run("zero funds transfer", func(t *testing.T) { + e.broker.EXPECT().Send(gomock.Any()).Times(1) + baseCpy = transferBase + transfer.OneOff.TransferBase = &baseCpy + transfer.OneOff.Amount = num.UintZero() + assert.EqualError(t, + e.TransferFunds(ctx, &transfer), + types.ErrCannotTransferZeroFunds.Error(), + ) + }) +} + +func testOneOffTransferInvalidOwnerTransfersWithFromDerivedKey(t *testing.T) { + e := getTestEngine(t) + + // let's do a massive fee, easy to test + e.OnTransferFeeFactorUpdate(context.Background(), num.NewDecimalFromFloat(1)) + + partyKey := "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301" + derivedKey := "c84fbf3442a2a9f9ca87c9cefe686aed241ff49981dd8ce819dd532cd42a8427" + amount := num.NewUint(10) + + ctx := context.Background() + transfer := &types.TransferFunds{ + Kind: types.TransferCommandKindOneOff, + OneOff: &types.OneOffTransfer{ + TransferBase: &types.TransferBase{ + From: partyKey, + FromDerivedKey: &derivedKey, + FromAccountType: types.AccountTypeVestedRewards, + To: partyKey, + ToAccountType: types.AccountTypeGeneral, + Asset: assetNameETH, + Amount: amount, + Reference: "someref", + }, + }, + } + + // asset exists + e.assets.EXPECT().Get(gomock.Any()).Times(1).Return( + assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) + + e.parties.EXPECT().CheckDerivedKeyOwnership(types.PartyID(partyKey), derivedKey).Return(false).Times(1) + + e.broker.EXPECT().Send(gomock.Any()).Times(1) + assert.ErrorContains(t, e.TransferFunds(ctx, transfer), "does not own derived key") +} diff --git a/core/banking/recurring_transfers.go b/core/banking/recurring_transfers.go index a0b80ac19d2..76941a5dbbf 100644 --- a/core/banking/recurring_transfers.go +++ b/core/banking/recurring_transfers.go @@ -87,7 +87,7 @@ func (e *Engine) recurringTransfer( return err } - if err := e.ensureMinimalTransferAmount(a, transfer.Amount, transfer.FromAccountType, transfer.From); err != nil { + if err := e.ensureMinimalTransferAmount(a, transfer.Amount, transfer.FromAccountType, transfer.From, transfer.FromDerivedKey); err != nil { transfer.Status = types.TransferStatusRejected return err } @@ -185,6 +185,11 @@ func (e *Engine) ensureNoRecurringTransferDuplicates( // NB2: for validator ranking this will always return true as it is assumed that for the network to resume there must always be // a validator with non zero ranking. func (e *Engine) dispatchRequired(ctx context.Context, ds *vegapb.DispatchStrategy) bool { + required, ok := e.dispatchRequiredCache[e.hashDispatchStrategy(ds)] + if ok { + return required + } + defer func() { e.dispatchRequiredCache[e.hashDispatchStrategy(ds)] = required }() switch ds.Metric { case vegapb.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, vegapb.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, @@ -196,21 +201,35 @@ func (e *Engine) dispatchRequired(ctx context.Context, ds *vegapb.DispatchStrate if ds.EntityScope == vegapb.EntityScope_ENTITY_SCOPE_INDIVIDUALS { hasNonZeroMetric := false partyMetrics := e.marketActivityTracker.CalculateMetricForIndividuals(ctx, ds) + gs := events.NewPartyGameScoresEvent(ctx, int64(e.currentEpoch), e.hashDispatchStrategy(ds), e.timeService.GetTimeNow(), partyMetrics) + e.broker.Send(gs) + hasEligibleParties := false for _, pm := range partyMetrics { if !pm.Score.IsZero() { hasNonZeroMetric = true + } + if pm.IsEligible { + hasEligibleParties = true + } + if hasNonZeroMetric && hasEligibleParties { break } } - return hasNonZeroMetric || (len(partyMetrics) > 0 && ds.DistributionStrategy == vegapb.DistributionStrategy_DISTRIBUTION_STRATEGY_RANK) + required = hasNonZeroMetric || (hasEligibleParties && ds.DistributionStrategy == vegapb.DistributionStrategy_DISTRIBUTION_STRATEGY_RANK) + return required } else { - tcs, _ := e.marketActivityTracker.CalculateMetricForTeams(ctx, ds) - return len(tcs) > 0 + tcs, pcs := e.marketActivityTracker.CalculateMetricForTeams(ctx, ds) + gs := events.NewTeamGameScoresEvent(ctx, int64(e.currentEpoch), e.hashDispatchStrategy(ds), e.timeService.GetTimeNow(), tcs, pcs) + e.broker.Send(gs) + required = len(tcs) > 0 + return required } case vegapb.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING: - return true + required = true + return required } - return false + required = false + return required } func (e *Engine) distributeRecurringTransfers(ctx context.Context, newEpoch uint64) { @@ -228,6 +247,14 @@ func (e *Engine) distributeRecurringTransfers(ctx context.Context, newEpoch uint continue } + // if the transfer should have been ended and has not, end it now. + if v.EndEpoch != nil && *v.EndEpoch < e.currentEpoch { + v.Status = types.TransferStatusDone + transfersDone = append(transfersDone, events.NewRecurringTransferFundsEvent(ctx, v, e.getGameID(v))) + doneIDs = append(doneIDs, v.ID) + continue + } + if v.DispatchStrategy != nil && v.DispatchStrategy.TransferInterval != nil && ((newEpoch-v.StartEpoch+1) < uint64(*v.DispatchStrategy.TransferInterval) || (newEpoch-v.StartEpoch+1)%uint64(*v.DispatchStrategy.TransferInterval) != 0) { @@ -253,7 +280,7 @@ func (e *Engine) distributeRecurringTransfers(ctx context.Context, newEpoch uint e.log.Panic("this should never happen", logging.Error(err)) } - if err = e.ensureMinimalTransferAmount(a, amount, v.FromAccountType, v.From); err != nil { + if err = e.ensureMinimalTransferAmount(a, amount, v.FromAccountType, v.From, v.FromDerivedKey); err != nil { v.Status = types.TransferStatusStopped transfersDone = append(transfersDone, events.NewRecurringTransferFundsEventWithReason(ctx, v, err.Error(), e.getGameID(v))) @@ -267,11 +294,12 @@ func (e *Engine) distributeRecurringTransfers(ctx context.Context, newEpoch uint var r []*types.LedgerMovement if v.DispatchStrategy == nil { resps, err = e.processTransfer( - ctx, a, v.From, v.To, "", v.FromAccountType, v.ToAccountType, amount, v.Reference, v.ID, newEpoch, nil, // last is eventual oneoff, which this is not + ctx, a, v.From, v.To, "", v.FromAccountType, v.ToAccountType, amount, v.Reference, v.ID, newEpoch, + v.FromDerivedKey, nil, // last is eventual oneoff, which this is not ) } else { // check if the amount + fees can be covered by the party issuing the transfer - if err = e.ensureFeeForTransferFunds(a, amount, v.From, v.FromAccountType, v.To); err == nil { + if err = e.ensureFeeForTransferFunds(a, amount, v.From, v.FromAccountType, v.FromDerivedKey, v.To); err == nil { // NB: if the metric is market value we're going to transfer the bonus if any directly // to the market account of the asset/reward type - this is similar to previous behaviour and // different to how all other metric based rewards behave. The reason is that we need the context of the funder @@ -284,7 +312,8 @@ func (e *Engine) distributeRecurringTransfers(ctx context.Context, newEpoch uint continue } r, err = e.processTransfer( - ctx, a, v.From, v.To, fms.Market, v.FromAccountType, v.ToAccountType, amt, v.Reference, v.ID, newEpoch, nil, // last is eventual oneoff, which this is not + ctx, a, v.From, v.To, fms.Market, v.FromAccountType, v.ToAccountType, amt, v.Reference, v.ID, + newEpoch, v.FromDerivedKey, nil, // last is eventual oneoff, which this is not ) if err != nil { e.log.Error("failed to process transfer", @@ -310,7 +339,8 @@ func (e *Engine) distributeRecurringTransfers(ctx context.Context, newEpoch uint p, _ := proto.Marshal(v.DispatchStrategy) hash := hex.EncodeToString(crypto.Hash(p)) r, err = e.processTransfer( - ctx, a, v.From, v.To, hash, v.FromAccountType, v.ToAccountType, amount, v.Reference, v.ID, newEpoch, nil, // last is eventual oneoff, which this is not + ctx, a, v.From, v.To, hash, v.FromAccountType, v.ToAccountType, amount, v.Reference, v.ID, newEpoch, + v.FromDerivedKey, nil, // last is eventual oneoff, which this is not ) if err != nil { e.log.Error("failed to process transfer", logging.Error(err)) diff --git a/core/banking/recurring_transfers_test.go b/core/banking/recurring_transfers_test.go index 9d5d991e652..80ff3d08da4 100644 --- a/core/banking/recurring_transfers_test.go +++ b/core/banking/recurring_transfers_test.go @@ -17,6 +17,7 @@ package banking_test import ( "context" + "encoding/hex" "fmt" "testing" @@ -26,6 +27,7 @@ import ( "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/libs/crypto" "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/protos/vega" "github.com/golang/mock/gomock" @@ -42,6 +44,62 @@ func TestRecurringTransfers(t *testing.T) { t.Run("invalid recurring transfers, in the past", testInvalidRecurringTransfersInThePast) } +func TestExpireOldTransfers(t *testing.T) { + e := getTestEngine(t) + + ctx := context.Background() + + e.OnMinTransferQuantumMultiple(context.Background(), num.DecimalFromFloat(1)) + e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(10)}), nil) + e.broker.EXPECT().Send(gomock.Any()).AnyTimes() + fromAcc := types.Account{ + Balance: num.NewUint(100000), // enough for the all + } + e.col.EXPECT().GetPartyGeneralAccount(gomock.Any(), gomock.Any()).AnyTimes().Return(&fromAcc, nil) + + endEpoch := uint64(12) + transfers := []*types.TransferFunds{} + for i := 0; i < 10; i++ { + transfers = append(transfers, &types.TransferFunds{ + Kind: types.TransferCommandKindRecurring, + Recurring: &types.RecurringTransfer{ + TransferBase: &types.TransferBase{ + ID: fmt.Sprintf("TRANSFERID-%d", i), + From: "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301", + FromAccountType: types.AccountTypeGeneral, + To: crypto.RandomHash(), + ToAccountType: types.AccountTypeGeneral, + Asset: assetNameETH, + Amount: num.NewUint(10), + Reference: "someref", + }, + StartEpoch: 10, + EndEpoch: &endEpoch, + Factor: num.MustDecimalFromString("1"), + }, + }) + require.NoError(t, e.TransferFunds(ctx, transfers[i])) + } + e.col.EXPECT().TransferFunds(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(nil, nil).AnyTimes() + + seenEvts := []events.Event{} + e.broker.EXPECT().SendBatch(gomock.Any()).DoAndReturn(func(evts []events.Event) { + seenEvts = append(seenEvts, evts...) + }).AnyTimes() + + e.OnEpoch(context.Background(), types.Epoch{Seq: 15, Action: vega.EpochAction_EPOCH_ACTION_START}) + e.OnEpoch(context.Background(), types.Epoch{Seq: 15, Action: vega.EpochAction_EPOCH_ACTION_END}) + + require.Equal(t, 10, len(seenEvts)) + stoppedIDs := map[string]struct{}{} + for _, e2 := range seenEvts { + if e2.StreamMessage().GetTransfer().Status == types.TransferStatusDone { + stoppedIDs[e2.StreamMessage().GetTransfer().Id] = struct{}{} + } + } + require.Equal(t, 10, len(stoppedIDs)) +} + func TestMaturation(t *testing.T) { e := getTestEngine(t) @@ -49,7 +107,6 @@ func TestMaturation(t *testing.T) { e.OnMinTransferQuantumMultiple(context.Background(), num.DecimalFromFloat(1)) e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(10)}), nil) - e.tsvc.EXPECT().GetTimeNow().AnyTimes() e.broker.EXPECT().Send(gomock.Any()).AnyTimes() fromAcc := types.Account{ Balance: num.NewUint(100000), // enough for the all @@ -127,7 +184,6 @@ func testInvalidRecurringTransfersBadAmount(t *testing.T) { e.OnMinTransferQuantumMultiple(context.Background(), num.DecimalFromFloat(1)) // asset exists e.assets.EXPECT().Get(gomock.Any()).Times(1).Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.EqualError(t, @@ -165,7 +221,6 @@ func testInvalidRecurringTransfersInThePast(t *testing.T) { } e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - e.tsvc.EXPECT().GetTimeNow().Times(2) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.EqualError(t, e.TransferFunds(ctx, transfer), @@ -228,7 +283,6 @@ func testInvalidRecurringTransfersDuplicates(t *testing.T) { } e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - e.tsvc.EXPECT().GetTimeNow().Times(3) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.NoError(t, e.TransferFunds(ctx, transfer)) @@ -313,11 +367,10 @@ func testForeverTransferCancelledNotEnoughFunds(t *testing.T) { } e.marketActivityTracker.EXPECT().CalculateMetricForIndividuals(gomock.Any(), gomock.Any()).AnyTimes().Return([]*types.PartyContributionScore{ - {Party: "", Score: num.DecimalFromFloat(1)}, + {Party: "", Score: num.DecimalFromFloat(1), StakingBalance: num.UintZero(), OpenVolume: num.UintZero(), TotalFeesPaid: num.UintZero(), IsEligible: true}, }) e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - e.tsvc.EXPECT().GetTimeNow().Times(2) - e.broker.EXPECT().Send(gomock.Any()).Times(2) + e.broker.EXPECT().Send(gomock.Any()).AnyTimes() assert.NoError(t, e.TransferFunds(ctx, transfer)) // now let's move epochs to see the others transfers @@ -432,7 +485,6 @@ func testValidRecurringTransfer(t *testing.T) { } e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - e.tsvc.EXPECT().GetTimeNow().Times(3) e.broker.EXPECT().Send(gomock.Any()).Times(3) assert.NoError(t, e.TransferFunds(ctx, transfer)) @@ -571,7 +623,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { var baseCpy types.TransferBase t.Run("invalid from account", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy := transferBase transfer.Recurring.TransferBase = &baseCpy @@ -583,7 +634,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { }) t.Run("invalid to account", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy = transferBase transfer.Recurring.TransferBase = &baseCpy @@ -595,7 +645,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { }) t.Run("unsupported from account type", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy = transferBase transfer.Recurring.TransferBase = &baseCpy @@ -607,7 +656,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { }) t.Run("unsuported to account type", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy = transferBase transfer.Recurring.TransferBase = &baseCpy @@ -619,7 +667,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { }) t.Run("zero funds transfer", func(t *testing.T) { - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) baseCpy = transferBase transfer.Recurring.TransferBase = &baseCpy @@ -644,8 +691,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { t.Run("bad start time", func(t *testing.T) { transfer.Recurring.StartEpoch = 0 - - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.EqualError(t, @@ -657,8 +702,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { t.Run("bad end time", func(t *testing.T) { transfer.Recurring.StartEpoch = 90 transfer.Recurring.EndEpoch = &endEpoch0 - - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.EqualError(t, @@ -670,8 +713,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { t.Run("negative factor", func(t *testing.T) { transfer.Recurring.EndEpoch = &endEpoch100 transfer.Recurring.Factor = num.MustDecimalFromString("-1") - - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.EqualError(t, @@ -682,8 +723,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { t.Run("zero factor", func(t *testing.T) { transfer.Recurring.Factor = num.MustDecimalFromString("0") - - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.EqualError(t, @@ -695,8 +734,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { t.Run("start epoch after end epoch", func(t *testing.T) { transfer.Recurring.Factor = num.MustDecimalFromString("1") transfer.Recurring.EndEpoch = &endEpoch1 - - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.EqualError(t, @@ -707,8 +744,6 @@ func testRecurringTransferInvalidTransfers(t *testing.T) { t.Run("end epoch nil", func(t *testing.T) { transfer.Recurring.EndEpoch = nil - - e.tsvc.EXPECT().GetTimeNow().Times(1) e.broker.EXPECT().Send(gomock.Any()).Times(1) assert.NoError(t, @@ -725,7 +760,6 @@ func TestMarketAssetMismatchRejectsTransfer(t *testing.T) { } eng.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - eng.tsvc.EXPECT().GetTimeNow().Times(1) eng.col.EXPECT().GetPartyGeneralAccount(gomock.Any(), gomock.Any()).AnyTimes().Return(&fromAcc, nil) eng.broker.EXPECT().Send(gomock.Any()).AnyTimes() eng.col.EXPECT().TransferFunds(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() @@ -762,3 +796,72 @@ func TestMarketAssetMismatchRejectsTransfer(t *testing.T) { eng.marketActivityTracker.EXPECT().MarketTrackedForAsset(gomock.Any(), gomock.Any()).Times(1).Return(false) require.Error(t, eng.TransferFunds(context.Background(), recurring)) } + +func TestDispatchStrategyRemoval(t *testing.T) { + e := getTestEngine(t) + + dispatchStrat := &vega.DispatchStrategy{ + AssetForMetric: "zohar", + Metric: vega.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + Markets: []string{"mmm"}, + EntityScope: vega.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vega.IndividualScope_INDIVIDUAL_SCOPE_IN_TEAM, + WindowLength: 1, + LockPeriod: 1, + DistributionStrategy: vega.DistributionStrategy_DISTRIBUTION_STRATEGY_RANK, + } + + p, err := proto.Marshal(dispatchStrat) + require.NoError(t, err) + dsHash := hex.EncodeToString(crypto.Hash(p)) + + var endEpoch uint64 = 100 + party := "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301" + ctx := context.Background() + transfer := &types.TransferFunds{ + Kind: types.TransferCommandKindRecurring, + Recurring: &types.RecurringTransfer{ + TransferBase: &types.TransferBase{ + ID: "TRANSFERID", + From: party, + FromAccountType: types.AccountTypeGeneral, + To: "0000000000000000000000000000000000000000000000000000000000000000", + ToAccountType: types.AccountTypeGlobalReward, + Asset: assetNameETH, + Amount: num.NewUint(100), + Reference: "someref", + }, + StartEpoch: 8, + EndEpoch: &endEpoch, + Factor: num.MustDecimalFromString("0.9"), + DispatchStrategy: dispatchStrat, + }, + } + + e.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) + e.broker.EXPECT().Send(gomock.Any()).AnyTimes() + e.marketActivityTracker.EXPECT().MarketTrackedForAsset(gomock.Any(), gomock.Any()).Times(1).Return(true) + assert.NoError(t, e.TransferFunds(ctx, transfer)) + + // it exists + assert.NotNil(t, e.GetDispatchStrategy(dsHash)) + + // now cancel + require.NoError(t, e.CancelTransferFunds(ctx, + &types.CancelTransferFunds{ + Party: party, + TransferID: "TRANSFERID", + }, + ), + ) + + // it does not exist (secretly it does but has ref-count 0) + assert.Nil(t, e.GetDispatchStrategy(dsHash)) + + // roll into the next epoch end + e.OnEpoch(context.Background(), types.Epoch{Seq: 8, Action: vega.EpochAction_EPOCH_ACTION_END}) + e.OnEpoch(context.Background(), types.Epoch{Seq: 9, Action: vega.EpochAction_EPOCH_ACTION_START}) + + // still not there + assert.Nil(t, e.GetDispatchStrategy(dsHash)) +} diff --git a/core/banking/snapshot.go b/core/banking/snapshot.go index fe7cb5aa94e..64f63ff3651 100644 --- a/core/banking/snapshot.go +++ b/core/banking/snapshot.go @@ -20,8 +20,10 @@ import ( "fmt" "math/big" "sort" + "time" "code.vegaprotocol.io/vega/core/types" + vgcontext "code.vegaprotocol.io/vega/libs/context" "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/logging" @@ -120,6 +122,7 @@ func (e *Engine) serialiseRecurringTransfers() ([]byte, error) { payload := types.Payload{ Data: &types.PayloadBankingRecurringTransfers{ BankingRecurringTransfers: e.getRecurringTransfers(), + NextMetricUpdate: e.nextMetricUpdate, }, } @@ -310,11 +313,11 @@ func (e *Engine) LoadState(ctx context.Context, p *types.Payload) ([]types.State case *types.PayloadBankingWithdrawals: return nil, e.restoreWithdrawals(pl.BankingWithdrawals, p) case *types.PayloadBankingSeen: - return nil, e.restoreSeen(pl.BankingSeen, p) + return nil, e.restoreSeen(ctx, pl.BankingSeen, p) case *types.PayloadBankingAssetActions: return nil, e.restoreAssetActions(pl.BankingAssetActions, p) case *types.PayloadBankingRecurringTransfers: - return nil, e.restoreRecurringTransfers(ctx, pl.BankingRecurringTransfers, p) + return nil, e.restoreRecurringTransfers(ctx, pl.BankingRecurringTransfers, pl.NextMetricUpdate, p) case *types.PayloadBankingScheduledTransfers: return nil, e.restoreScheduledTransfers(ctx, pl.BankingScheduledTransfers, p) case *types.PayloadBankingRecurringGovernanceTransfers: @@ -332,12 +335,12 @@ func (e *Engine) LoadState(ctx context.Context, p *types.Payload) ([]types.State } } -func (e *Engine) restoreRecurringTransfers(ctx context.Context, transfers *checkpoint.RecurringTransfers, p *types.Payload) error { +func (e *Engine) restoreRecurringTransfers(ctx context.Context, transfers *checkpoint.RecurringTransfers, nextMetricUpdate time.Time, p *types.Payload) error { var err error // ignore events here as we don't need to send them _ = e.loadRecurringTransfers(ctx, transfers) e.bss.serialisedRecurringTransfers, err = proto.Marshal(p.IntoProto()) - + e.nextMetricUpdate = nextMetricUpdate return err } @@ -421,13 +424,35 @@ func (e *Engine) restoreWithdrawals(withdrawals *types.BankingWithdrawals, p *ty return err } -func (e *Engine) restoreSeen(seen *types.BankingSeen, p *types.Payload) error { +func (e *Engine) restoreSeen(ctx context.Context, seen *types.BankingSeen, p *types.Payload) error { var err error e.log.Info("restoring seen", logging.Int("n", len(seen.Refs))) e.seenAssetActions = treeset.NewWithStringComparator() for _, v := range seen.Refs { e.seenAssetActions.Add(v) } + + if vgcontext.InProgressUpgradeFrom(ctx, "v0.76.8") { + e.log.Info("migration code updating primary bridge last seen", + logging.String("address", e.bridgeAddresses[e.primaryEthChainID]), + logging.Uint64("last-seen", seen.LastSeenPrimaryEthBlock), + ) + e.ethEventSource.UpdateContractBlock( + e.bridgeAddresses[e.primaryEthChainID], + e.primaryEthChainID, + seen.LastSeenPrimaryEthBlock, + ) + e.log.Info("migration code updating primary bridge last seen", + logging.String("address", e.bridgeAddresses[e.secondaryEthChainID]), + logging.Uint64("last-seen", seen.LastSeenSecondaryEthBlock), + ) + e.ethEventSource.UpdateContractBlock( + e.bridgeAddresses[e.secondaryEthChainID], + e.secondaryEthChainID, + seen.LastSeenSecondaryEthBlock, + ) + } + e.lastSeenPrimaryEthBlock = seen.LastSeenPrimaryEthBlock e.lastSeenSecondaryEthBlock = seen.LastSeenSecondaryEthBlock e.bss.serialisedSeen, err = proto.Marshal(p.IntoProto()) @@ -473,16 +498,3 @@ func (e *Engine) OnEpochRestore(_ context.Context, ep types.Epoch) { e.log.Debug("epoch restoration notification received", logging.String("epoch", ep.String())) e.currentEpoch = ep.Seq } - -func (e *Engine) OnStateLoaded(_ context.Context) error { - if e.lastSeenPrimaryEthBlock != 0 { - e.log.Info("restoring primary collateral bridge starting block", logging.Uint64("block", e.lastSeenPrimaryEthBlock)) - e.primaryEthEventSource.UpdateCollateralStartingBlock(e.lastSeenPrimaryEthBlock) - } - - if e.lastSeenSecondaryEthBlock != 0 { - e.log.Info("restoring secondary collateral bridge starting block", logging.Uint64("block", e.lastSeenSecondaryEthBlock)) - e.secondaryEthEventSource.UpdateCollateralStartingBlock(e.lastSeenSecondaryEthBlock) - } - return nil -} diff --git a/core/banking/snapshot_test.go b/core/banking/snapshot_test.go index e6119fe6f5c..9faab7daed2 100644 --- a/core/banking/snapshot_test.go +++ b/core/banking/snapshot_test.go @@ -312,7 +312,6 @@ func TestSeenSnapshotRoundTrip(t *testing.T) { seenKey := (&types.PayloadBankingSeen{}).Key() eng := getTestEngine(t) - eng.tsvc.EXPECT().GetTimeNow().Times(2) state1, _, err := eng.GetState(seenKey) require.Nil(t, err) eng.col.EXPECT().Deposit(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return(&types.LedgerMovement{}, nil) @@ -464,7 +463,6 @@ func TestOneOffTransfersSnapshotRoundTrip(t *testing.T) { eng.col.EXPECT().TransferFunds(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() eng.assets.EXPECT().Get(gomock.Any()).Times(1).Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) eng.col.EXPECT().GetPartyGeneralAccount(gomock.Any(), gomock.Any()).AnyTimes().Times(1).Return(&fromAcc, nil) - eng.tsvc.EXPECT().GetTimeNow().Times(2).Return(now) eng.broker.EXPECT().Send(gomock.Any()).AnyTimes() require.NoError(t, eng.TransferFunds(ctx, oneoff)) @@ -494,7 +492,6 @@ func TestRecurringTransfersSnapshotRoundTrip(t *testing.T) { } eng.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) - eng.tsvc.EXPECT().GetTimeNow().Times(1) eng.col.EXPECT().GetPartyGeneralAccount(gomock.Any(), gomock.Any()).AnyTimes().Return(&fromAcc, nil) eng.broker.EXPECT().Send(gomock.Any()).AnyTimes() eng.col.EXPECT().TransferFunds(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() @@ -596,7 +593,6 @@ func TestRecurringGovTransfersSnapshotRoundTrip(t *testing.T) { dsHash := hex.EncodeToString(crypto.Hash(p)) e.broker.EXPECT().Send(gomock.Any()).Times(1) - e.tsvc.EXPECT().GetTimeNow().Times(1).Return(time.Now()) require.NoError(t, e.NewGovernanceTransfer(ctx, "1", "some reference", transfer)) // test the new transfer prompts a change @@ -622,10 +618,6 @@ func TestScheduledgGovTransfersSnapshotRoundTrip(t *testing.T) { ctx := context.Background() key := (&types.PayloadBankingScheduledGovernanceTransfers{}).Key() e := getTestEngine(t) - e.tsvc.EXPECT().GetTimeNow().DoAndReturn( - func() time.Time { - return time.Unix(10, 0) - }).AnyTimes() // let's do a massive fee, easy to test. e.OnTransferFeeFactorUpdate(context.Background(), num.NewDecimalFromFloat(1)) diff --git a/core/banking/transfer_common_test.go b/core/banking/transfer_common_test.go index 5a3b8ef9772..d076ccefee3 100644 --- a/core/banking/transfer_common_test.go +++ b/core/banking/transfer_common_test.go @@ -127,3 +127,52 @@ func TestCheckTransferWithVestedAccount(t *testing.T) { e.CheckTransfer(transfer), ) } + +func TestCheckTransferWithVestedAccountFromSubAccount(t *testing.T) { + e := getTestEngine(t) + + derivedKey := "c84fbf3442a2a9f9ca87c9cefe686aed241ff49981dd8ce819dd532cd42a8427" + asset := "eth" + + transfer := &types.TransferBase{ + From: "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301", + FromDerivedKey: &derivedKey, + FromAccountType: types.AccountTypeVestedRewards, + To: "03ae90688632c649c4beab6040ff5bd04dbde8efbf737d8673bbda792a110301", + ToAccountType: types.AccountTypeGeneral, + Asset: asset, + Amount: num.NewUint(10), + Reference: "someref", + } + + e.OnMinTransferQuantumMultiple(context.Background(), num.DecimalFromFloat(1)) + + // balance is under the min amount + e.col.EXPECT().GetPartyVestedRewardAccount(derivedKey, gomock.Any()).Return(&types.Account{Balance: num.NewUint(90)}, nil).Times(1) + + // asset exists + e.assets.EXPECT().Get(gomock.Any()).Times(1).Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) + // try to transfer a small balance, but not the whole balance + require.EqualError(t, + e.CheckTransfer(transfer), + "transfer from vested account under minimal transfer amount must be the full balance", + ) + + // now we try to transfer the full amount + e.col.EXPECT().GetPartyVestedRewardAccount(derivedKey, gomock.Any()).Return(&types.Account{Balance: num.NewUint(90)}, nil).Times(2) + transfer.Amount = num.NewUint(90) + e.assets.EXPECT().Get(gomock.Any()).Times(1).Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) + require.NoError(t, + e.CheckTransfer(transfer), + ) + + // now we try again, with a balance above the min amount, but not the whole balance + e.col.EXPECT().GetPartyVestedRewardAccount(derivedKey, gomock.Any()).Return(&types.Account{Balance: num.NewUint(300)}, nil).Times(1) + e.assets.EXPECT().Get(gomock.Any()).Times(1).Return(assets.NewAsset(&mockAsset{name: assetNameETH, quantum: num.DecimalFromFloat(100)}), nil) + + transfer.Amount = num.NewUint(110) + // try to transfer a small balance, but not the whole balance + require.NoError(t, + e.CheckTransfer(transfer), + ) +} diff --git a/core/banking/transfers_common.go b/core/banking/transfers_common.go index 8795075b62c..b75e16ac2e7 100644 --- a/core/banking/transfers_common.go +++ b/core/banking/transfers_common.go @@ -18,6 +18,7 @@ package banking import ( "context" "fmt" + "time" "code.vegaprotocol.io/vega/core/assets" "code.vegaprotocol.io/vega/core/events" @@ -26,6 +27,15 @@ import ( "code.vegaprotocol.io/vega/logging" ) +func (e *Engine) OnRewardsUpdateFrequencyUpdate(ctx context.Context, d time.Duration) error { + if !e.nextMetricUpdate.IsZero() { + e.nextMetricUpdate = e.nextMetricUpdate.Add(-e.metricUpdateFrequency) + } + e.nextMetricUpdate = e.nextMetricUpdate.Add(d) + e.metricUpdateFrequency = d + return nil +} + func (e *Engine) OnTransferFeeFactorUpdate(ctx context.Context, f num.Decimal) error { e.transferFeeFactor = f return nil @@ -81,11 +91,11 @@ func (e *Engine) CheckTransfer(t *types.TransferBase) error { return fmt.Errorf("could not transfer funds, %w", err) } - if err := e.ensureMinimalTransferAmount(a, t.Amount, t.FromAccountType, t.From); err != nil { + if err := e.ensureMinimalTransferAmount(a, t.Amount, t.FromAccountType, t.From, t.FromDerivedKey); err != nil { return err } - if err = e.ensureFeeForTransferFunds(a, t.Amount, t.From, t.FromAccountType, t.To); err != nil { + if err = e.ensureFeeForTransferFunds(a, t.Amount, t.From, t.FromAccountType, t.FromDerivedKey, t.To); err != nil { return fmt.Errorf("could not transfer funds, %w", err) } return nil @@ -96,6 +106,7 @@ func (e *Engine) ensureMinimalTransferAmount( amount *num.Uint, fromAccType types.AccountType, from string, + fromSubAccount *string, ) error { quantum := a.Type().Details.Quantum // no reason this would produce an error @@ -104,6 +115,9 @@ func (e *Engine) ensureMinimalTransferAmount( // no verify amount if amount.LT(minAmount) { if fromAccType == types.AccountTypeVestedRewards { + if fromSubAccount != nil { + from = *fromSubAccount + } return e.ensureMinimalTransferAmountFromVested(amount, from, a.Type().ID) } @@ -142,6 +156,8 @@ func (e *Engine) processTransfer( reference string, transferID string, epoch uint64, + // optional from derived key transfer + fromDerivedKey *string, // optional oneoff transfer // in case we need to schedule the delivery oneoff *types.OneOffTransfer, @@ -150,12 +166,17 @@ func (e *Engine) processTransfer( // ensure the party have enough funds for both the // amount and the fee for the transfer - feeTransfer, discount, err := e.makeFeeTransferForFundsTransfer(ctx, assetType, amount, from, fromAcc, to) + feeTransfer, discount, err := e.makeFeeTransferForFundsTransfer(ctx, assetType, amount, from, fromAcc, fromDerivedKey, to) if err != nil { return nil, fmt.Errorf("could not pay the fee for transfer: %w", err) } feeTransferAccountType := []types.AccountType{fromAcc} + // transfer from sub account to owners general account + if fromDerivedKey != nil { + from = *fromDerivedKey + } + fromTransfer, toTransfer := e.makeTransfers(from, to, assetType.ID, "", toMarket, amount, &transferID) transfers := []*types.Transfer{fromTransfer} accountTypes := []types.AccountType{fromAcc} @@ -226,6 +247,7 @@ func (e *Engine) calculateFeeTransferForTransfer( amount *num.Uint, from string, fromAccountType types.AccountType, + fromDerivedKey *string, to string, ) *num.Uint { return calculateFeeForTransfer( @@ -235,6 +257,7 @@ func (e *Engine) calculateFeeTransferForTransfer( amount, from, fromAccountType, + fromDerivedKey, to, ) } @@ -245,12 +268,13 @@ func (e *Engine) makeFeeTransferForFundsTransfer( amount *num.Uint, from string, fromAccountType types.AccountType, + fromDerivedKey *string, to string, ) (*types.Transfer, *num.Uint, error) { - theoreticalFee := e.calculateFeeTransferForTransfer(asset, amount, from, fromAccountType, to) + theoreticalFee := e.calculateFeeTransferForTransfer(asset, amount, from, fromAccountType, fromDerivedKey, to) feeAmount, discountAmount := e.ApplyFeeDiscount(ctx, asset.ID, from, theoreticalFee) - if err := e.ensureEnoughFundsForTransfer(asset, amount, from, fromAccountType, feeAmount); err != nil { + if err := e.ensureEnoughFundsForTransfer(asset, amount, from, fromAccountType, fromDerivedKey, feeAmount); err != nil { return nil, nil, err } @@ -280,12 +304,13 @@ func (e *Engine) ensureFeeForTransferFunds( amount *num.Uint, from string, fromAccountType types.AccountType, + fromDerivedKey *string, to string, ) error { assetType := asset.ToAssetType() - theoreticalFee := e.calculateFeeTransferForTransfer(assetType, amount, from, fromAccountType, to) + theoreticalFee := e.calculateFeeTransferForTransfer(assetType, amount, from, fromAccountType, fromDerivedKey, to) feeAmount, _ := e.EstimateFeeDiscount(assetType.ID, from, theoreticalFee) - return e.ensureEnoughFundsForTransfer(assetType, amount, from, fromAccountType, feeAmount) + return e.ensureEnoughFundsForTransfer(assetType, amount, from, fromAccountType, fromDerivedKey, feeAmount) } func (e *Engine) ensureEnoughFundsForTransfer( @@ -293,6 +318,7 @@ func (e *Engine) ensureEnoughFundsForTransfer( amount *num.Uint, from string, fromAccountType types.AccountType, + fromDerivedKey *string, feeAmount *num.Uint, ) error { var ( @@ -307,6 +333,11 @@ func (e *Engine) ensureEnoughFundsForTransfer( return err } case types.AccountTypeVestedRewards: + // sending from sub account to owners general account + if fromDerivedKey != nil { + from = *fromDerivedKey + } + account, err = e.col.GetPartyVestedRewardAccount(from, asset.ID) if err != nil { return err diff --git a/core/blockchain/abci/abci.go b/core/blockchain/abci/abci.go index eddb59a4826..22a07bcab94 100644 --- a/core/blockchain/abci/abci.go +++ b/core/blockchain/abci/abci.go @@ -22,6 +22,7 @@ import ( "code.vegaprotocol.io/vega/core/blockchain" vgcontext "code.vegaprotocol.io/vega/libs/context" + v1 "code.vegaprotocol.io/vega/protos/vega/commands/v1" "github.com/cometbft/cometbft/abci/types" ) @@ -45,6 +46,11 @@ func (app *App) InitChain(_ context.Context, req *types.RequestInitChain) (*type return &types.ResponseInitChain{}, nil } +func (app *App) GetTx(tx []byte) (Tx, error) { + txx, _, err := app.getTx(tx) + return txx, err +} + // PrepareProposal will take the given transactions from the mempool and attempts to prepare a // proposal from them when it's our turn to do so while keeping the size, gas, pow, and spam constraints. func (app *App) PrepareProposal(_ context.Context, req *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) { @@ -65,7 +71,7 @@ func (app *App) PrepareProposal(_ context.Context, req *types.RequestPrepareProp } // let the application decide on the order and the number of transactions it wants to pick up for this block - res := &types.ResponsePrepareProposal{Txs: app.OnPrepareProposal(txs, rawTxs)} + res := &types.ResponsePrepareProposal{Txs: app.OnPrepareProposal(uint64(req.Height), txs, rawTxs)} return res, nil } @@ -88,7 +94,7 @@ func (app *App) ProcessProposal(_ context.Context, req *types.RequestProcessProp txs = append(txs, tx) } // let the application verify the block - if !app.OnProcessProposal(txs) { + if !app.OnProcessProposal(uint64(req.Height), txs) { return &types.ResponseProcessProposal{Status: types.ResponseProcessProposal_REJECT}, nil } return &types.ResponseProcessProposal{Status: types.ResponseProcessProposal_ACCEPT}, nil @@ -326,6 +332,20 @@ func getBaseTxEvents(tx Tx) []types.Event { }) } + var sourceChainID string + if m, ok := cmd.(v1.ChainEvent); ok { + if e, ok := m.Event.(interface{ GetChainId() string }); ok { + sourceChainID = e.GetChainId() + } + } + if len(sourceChainID) > 0 { + commandAttributes = append(commandAttributes, types.EventAttribute{ + Key: "source-chain-id", + Value: sourceChainID, + Index: true, + }) + } + if len(commandAttributes) > 0 { base[1].Attributes = append(base[1].Attributes, commandAttributes...) } diff --git a/core/blockchain/abci/types.go b/core/blockchain/abci/types.go index 80e7ae718ef..b5edc57f79b 100644 --- a/core/blockchain/abci/types.go +++ b/core/blockchain/abci/types.go @@ -49,8 +49,8 @@ type Codec interface { // ABCI hooks. type ( - PrepareProposalHandler func(txs []Tx, raWtxs [][]byte) [][]byte - ProcessProposalHandler func(txs []Tx) bool + PrepareProposalHandler func(height uint64, txs []Tx, raWtxs [][]byte) [][]byte + ProcessProposalHandler func(height uint64, txs []Tx) bool OnInitChainHandler func(*types.RequestInitChain) (*types.ResponseInitChain, error) OnBeginBlockHandler func(uint64, string, time.Time, string, []Tx) context.Context OnEndBlockHandler func(blockHeight uint64) (types.ValidatorUpdates, types1.ConsensusParams) diff --git a/core/blockchain/nullchain/mocks/mocks.go b/core/blockchain/nullchain/mocks/mocks.go index 17b4a0999c8..3ac68ff99d3 100644 --- a/core/blockchain/nullchain/mocks/mocks.go +++ b/core/blockchain/nullchain/mocks/mocks.go @@ -132,3 +132,18 @@ func (mr *MockApplicationServiceMockRecorder) InitChain(arg0, arg1 interface{}) mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "InitChain", reflect.TypeOf((*MockApplicationService)(nil).InitChain), arg0, arg1) } + +// PrepareProposal mocks base method. +func (m *MockApplicationService) PrepareProposal(arg0 context.Context, arg1 *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PrepareProposal", arg0, arg1) + ret0, _ := ret[0].(*types.ResponsePrepareProposal) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PrepareProposal indicates an expected call of PrepareProposal. +func (mr *MockApplicationServiceMockRecorder) PrepareProposal(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PrepareProposal", reflect.TypeOf((*MockApplicationService)(nil).PrepareProposal), arg0, arg1) +} diff --git a/core/blockchain/nullchain/nullchain.go b/core/blockchain/nullchain/nullchain.go index 9dda90a4d15..2e168470521 100644 --- a/core/blockchain/nullchain/nullchain.go +++ b/core/blockchain/nullchain/nullchain.go @@ -55,6 +55,7 @@ type TimeService interface { type ApplicationService interface { InitChain(context.Context, *abci.RequestInitChain) (*abci.ResponseInitChain, error) + PrepareProposal(_ context.Context, req *abci.RequestPrepareProposal) (*abci.ResponsePrepareProposal, error) FinalizeBlock(context.Context, *abci.RequestFinalizeBlock) (*abci.ResponseFinalizeBlock, error) Commit(context.Context, *abci.RequestCommit) (*abci.ResponseCommit, error) Info(context.Context, *abci.RequestInfo) (*abci.ResponseInfo, error) @@ -187,22 +188,35 @@ func (n *NullBlockchain) processBlock() { n.log.Debugf("processing block %d with %d transactions", n.blockHeight, len(n.pending)) } + // prepare it first + ctx := context.Background() + proposal, err := n.app.PrepareProposal(ctx, + &abci.RequestPrepareProposal{ + Height: n.blockHeight, + Time: n.now, + Txs: n.pending, + }) + if err != nil { + // core always returns nil so we are safe really + panic("nullchain cannot handle failure to prepare a proposal") + } + resp := &abci.ResponseFinalizeBlock{} if n.replayer != nil && n.cfg.Replay.Record { - n.replayer.startBlock(n.blockHeight, n.now.UnixNano(), n.pending) + n.replayer.startBlock(n.blockHeight, n.now.UnixNano(), proposal.Txs) defer func() { n.replayer.saveBlock(resp.AppHash) }() } - resp, _ = n.app.FinalizeBlock(context.Background(), &abci.RequestFinalizeBlock{ + resp, _ = n.app.FinalizeBlock(ctx, &abci.RequestFinalizeBlock{ Height: n.blockHeight, Time: n.now, Hash: vgcrypto.Hash([]byte(strconv.FormatInt(n.blockHeight+n.now.UnixNano(), 10))), - Txs: n.pending, + Txs: proposal.Txs, }) n.pending = n.pending[:0] - n.app.Commit(context.Background(), &abci.RequestCommit{}) + n.app.Commit(ctx, &abci.RequestCommit{}) // Increment time, blockheight, ready to start a new block n.blockHeight++ diff --git a/core/blockchain/nullchain/nullchain_test.go b/core/blockchain/nullchain/nullchain_test.go index 9588b309b84..9fa4a52b133 100644 --- a/core/blockchain/nullchain/nullchain_test.go +++ b/core/blockchain/nullchain/nullchain_test.go @@ -322,6 +322,15 @@ func getTestUnstartedNullChain(t *testing.T, txnPerBlock uint64, d time.Duration n.SetABCIApp(app) require.NotNil(t, n) + app.EXPECT().PrepareProposal(gomock.Any(), gomock.Any()).DoAndReturn( + func(_ context.Context, req *abci.RequestPrepareProposal) (*abci.ResponsePrepareProposal, error) { + ret := &abci.ResponsePrepareProposal{ + Txs: req.Txs, + } + return ret, nil + }, + ).AnyTimes() + return &testNullBlockChain{ chain: n, ctrl: ctrl, diff --git a/core/bridges/erc20_logic_view.go b/core/bridges/erc20_logic_view.go index 8de11bcd841..92bc8fe93a4 100644 --- a/core/bridges/erc20_logic_view.go +++ b/core/bridges/erc20_logic_view.go @@ -79,6 +79,10 @@ func NewERC20LogicView( } } +func (e *ERC20LogicView) CollateralBridgeAddress() string { + return e.clt.CollateralBridgeAddress().Hex() +} + // FindAsset will try to find an asset and validate it's details on ethereum. func (e *ERC20LogicView) FindAsset( asset *types.AssetDetails, diff --git a/core/broker/broker.go b/core/broker/broker.go index 87af3dda62c..241ffb750e1 100644 --- a/core/broker/broker.go +++ b/core/broker/broker.go @@ -55,6 +55,8 @@ type SocketClient interface { type FileClientSend interface { SendBatch(events []events.Event) error + Replace(*FileClient) + Close() error } type subscription struct { @@ -128,6 +130,46 @@ func New(ctx context.Context, log *logging.Logger, config Config, stats Stats) ( return b, nil } +func (b *Broker) ReloadConf(config Config) { + // check if we need to update the log level. + if newLvl := config.Level.Get(); newLvl != b.config.Level.Get() { + b.log.SetLevel(newLvl) + b.config.Level = config.Level + } + // if the config has enabled the file client, check if the config is different, and replace or activate the file client. + if config.File.Enabled && config.File != b.config.File { + fc, err := NewFileClient(b.log, &config.File) + if err != nil { + // we can't instantiate the file client, though the config is updated - treat this as a fatal error? + b.log.Fatal("Could not instantiate file client", logging.Error(err)) + } + if b.fileClient != nil { + b.fileClient.Replace(fc) + } else { + b.fileClient = fc + } + // update the conifg + b.config.File = config.File + } else if !config.File.Enabled && b.fileClient != nil { + // we were streaming to a file, not anymore, so close the file and set the field to nil. + oldFC := b.fileClient + b.fileClient = nil + if err := oldFC.Close(); err != nil { + b.log.Error("Disabled file streaming, but file was not closed properly", logging.Error(err)) + } + b.config.File = config.File + } + // we only allow switching socket config on if it isn't already. Switching sockets is a bit of a pain. + if config.Socket.Enabled && !b.config.Socket.Enabled { + sc, err := newSocketClient(b.ctx, b.log, &config.Socket) + if err != nil { + b.log.Fatal("Could not instantiate new socket client", logging.Error(err)) + } + b.socketClient = sc + b.config.Socket = config.Socket + } +} + func (b *Broker) OnTick(ctx context.Context, _ time.Time) { if len(b.staged) == 0 { return diff --git a/core/broker/broker_test.go b/core/broker/broker_test.go index b02a8682bc6..5bad99a4c42 100644 --- a/core/broker/broker_test.go +++ b/core/broker/broker_test.go @@ -120,6 +120,81 @@ func TestSendEvent(t *testing.T) { t.Run("Send only to typed subscriber (also tests TxErrEvents are skipped)", testEventTypeSubscription) } +func TestFileStreaming(t *testing.T) { + tstBroker := getBroker(t) + defer tstBroker.Finish() + // create a temp file to use, close it so the opening is definitely handled by the file client, but remove it after the tests. + tmp, err := os.CreateTemp("", "file_client_tmp") + require.NoError(t, err) + tmpName := tmp.Name() + require.NoError(t, tmp.Close()) + defer os.Remove(tmpName) + cfg := broker.NewDefaultConfig() + // current file contents: + content, err := os.ReadFile(tmpName) + require.NoError(t, err) + tmp2, err := os.CreateTemp("", "file_client_tmp_2") + require.NoError(t, err) + tmp2Name := tmp2.Name() + defer os.Remove(tmp2Name) + require.NoError(t, tmp2.Close()) + content2, err := os.ReadFile(tmp2Name) + require.NoError(t, err) + require.Equal(t, content, content2) + t.Run("Reload config, toggling file streaming", func(t *testing.T) { + cfg.File.Enabled = true + cfg.File.File = tmpName + tstBroker.ReloadConf(cfg) + batchSendTest(t, tstBroker) + // now disable file streaming (closes the temp file) + cfg.File.Enabled = false + cfg.File.File = "" + tstBroker.ReloadConf(cfg) + newContent, err := os.ReadFile(tmpName) + require.NoError(t, err) + require.NotEqual(t, newContent, content) + require.True(t, len(content) < len(newContent)) + }) + t.Run("Reload config, switch file output", func(t *testing.T) { + cfg.File.Enabled = true + cfg.File.File = tmpName + batchSendTest(t, tstBroker) + cfg.File.File = tmp2Name + tstBroker.ReloadConf(cfg) + // turn the file streaming off + cfg.File.Enabled = false + cfg.File.File = "" + tstBroker.ReloadConf(cfg) + tmpCont, err := os.ReadFile(tmpName) + require.NoError(t, err) + tmp2Cont, err := os.ReadFile(tmp2Name) + require.NoError(t, err) + require.NotEqual(t, tmpCont, tmp2Cont) + require.Equal(t, tmp2Cont, content2) + }) + t.Run("Reload Config, switch file output, but write to the new file", func(t *testing.T) { + cfg.File.Enabled = true + cfg.File.File = tmpName + tstBroker.ReloadConf(cfg) + // send another batch, this doubles the data in the file because we used tmpName in tests above + batchSendTest(t, tstBroker) + cfg.File.File = tmp2Name + tstBroker.ReloadConf(cfg) + // send the data once here... + batchSendTest(t, tstBroker) + // turn the file streaming off (optional step) + cfg.File.Enabled = false + cfg.File.File = "" + tstBroker.ReloadConf(cfg) + tmpCont, err := os.ReadFile(tmpName) + require.NoError(t, err) + tmp2Cont, err := os.ReadFile(tmp2Name) + require.NoError(t, err) + require.NotEqual(t, tmpCont, tmp2Cont) + require.NotEqual(t, tmp2Cont, content2) + }) +} + func testSequenceIDGenSeveralBlocksOrdered(t *testing.T) { t.Parallel() tstBroker := getBroker(t) @@ -341,13 +416,16 @@ func testUnsubscribeAutomaticallyIfSubscriberIsClosed(t *testing.T) { func testSendBatch(t *testing.T) { t.Parallel() tstBroker := getBroker(t) + defer tstBroker.Finish() + batchSendTest(t, tstBroker) +} + +func batchSendTest(t *testing.T, tstBroker *brokerTst) { + t.Helper() sub := mocks.NewMockSubscriber(tstBroker.ctrl) cancelCh := make(chan struct{}) - defer func() { - tstBroker.Finish() - close(cancelCh) - }() - sub.EXPECT().Types().Times(1).Return(nil) + defer close(cancelCh) + sub.EXPECT().Types().Times(2).Return(nil) sub.EXPECT().Ack().AnyTimes().Return(true) sub.EXPECT().SetID(gomock.Any()).Times(1) k1 := tstBroker.Subscribe(sub) @@ -373,6 +451,7 @@ func testSendBatch(t *testing.T) { require.Equal(t, uint64(3), tstBroker.stats.CurrentEventsInBatch()) tstBroker.stats.NewBatch() require.Equal(t, uint64(3), tstBroker.stats.TotalEventsLastBatch()) + tstBroker.Unsubscribe(k1) } func testSendBatchChannel(t *testing.T) { @@ -865,7 +944,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/file_client.go b/core/broker/file_client.go index bfa0140e16a..bff6bdcaf38 100644 --- a/core/broker/file_client.go +++ b/core/broker/file_client.go @@ -118,6 +118,15 @@ func WriteRawToBufferFile(bufferFile *os.File, bufferSeqNum uint64, rawEvent []b return nil } +// Replace - in case of a config change, just replace the file we're writing to with the new one. +func (fc *FileClient) Replace(newFC *FileClient) { + fc.mut.Lock() + defer fc.mut.Unlock() + fc.config = newFC.config + _ = fc.file.Close() + fc.file = newFC.file +} + func (fc *FileClient) Close() error { return fc.file.Close() } diff --git a/core/processor/ratelimit/config.go b/core/broker/waiter_race_test.go similarity index 66% rename from core/processor/ratelimit/config.go rename to core/broker/waiter_race_test.go index 342d4a679f5..1173a8f578d 100644 --- a/core/processor/ratelimit/config.go +++ b/core/broker/waiter_race_test.go @@ -13,20 +13,11 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -package ratelimit +//go:build race +// +build race -type Config struct { - // How many requests - Requests int `description:" " long:"requests"` +package broker_test - // In the last `PerNBlocks` blocks - PerNBlocks int `description:" " long:"per-n-blocks"` -} +import "time" -// NewDefaultConfig allows 500 requests in the last 10 blocks. -func NewDefaultConfig() Config { - return Config{ - Requests: 500, - PerNBlocks: 10, - } -} +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/client/eth/client_wrapper.go b/core/client/eth/client_wrapper.go index 1aa50ce3ddf..7927f3adfbc 100644 --- a/core/client/eth/client_wrapper.go +++ b/core/client/eth/client_wrapper.go @@ -18,6 +18,7 @@ package eth import ( "context" "math/big" + "regexp" "time" "code.vegaprotocol.io/vega/core/metrics" @@ -82,17 +83,29 @@ func newEthClientWrapper(clt ETHClient) *ethClientWrapper { func (c *ethClientWrapper) ChainID(ctx context.Context) (*big.Int, error) { metrics.EthereumRPCCallCounterInc("chain_id") - return c.clt.ChainID(ctx) + id, err := c.clt.ChainID(ctx) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return id, nil } func (c *ethClientWrapper) NetworkID(ctx context.Context) (*big.Int, error) { metrics.EthereumRPCCallCounterInc("network_id") - return c.clt.NetworkID(ctx) + id, err := c.clt.NetworkID(ctx) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return id, nil } func (c *ethClientWrapper) BlockByHash(ctx context.Context, hash ethcommon.Hash) (*ethtypes.Block, error) { metrics.EthereumRPCCallCounterInc("block_by_hash") - return c.clt.BlockByHash(ctx, hash) + byHash, err := c.clt.BlockByHash(ctx, hash) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return byHash, nil } func (c *ethClientWrapper) HeaderByNumber(ctx context.Context, number *big.Int) (*ethtypes.Header, error) { @@ -107,7 +120,7 @@ func (c *ethClientWrapper) HeaderByNumber(ctx context.Context, number *big.Int) metrics.EthereumRPCCallCounterInc("header_by_number") header, err := c.clt.HeaderByNumber(ctx, number) if err != nil { - return nil, err + return nil, ErrorWithStrippedSecrets{err: err} } c.headerByNumberCache.Add(header.Number.String(), ethtypes.CopyHeader(header)) @@ -117,74 +130,143 @@ func (c *ethClientWrapper) HeaderByNumber(ctx context.Context, number *big.Int) func (c *ethClientWrapper) BlockByNumber(ctx context.Context, number *big.Int) (*ethtypes.Block, error) { metrics.EthereumRPCCallCounterInc("block_by_number") - return c.clt.BlockByNumber(ctx, number) + byNumber, err := c.clt.BlockByNumber(ctx, number) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return byNumber, nil } func (c *ethClientWrapper) HeaderByHash(ctx context.Context, hash ethcommon.Hash) (*ethtypes.Header, error) { metrics.EthereumRPCCallCounterInc("header_by_hash") - return c.clt.HeaderByHash(ctx, hash) + byHash, err := c.clt.HeaderByHash(ctx, hash) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return byHash, nil } func (c *ethClientWrapper) SubscribeNewHead(ctx context.Context, ch chan<- *ethtypes.Header) (ethereum.Subscription, error) { - return c.clt.SubscribeNewHead(ctx, ch) + head, err := c.clt.SubscribeNewHead(ctx, ch) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return head, nil } func (c *ethClientWrapper) TransactionCount(ctx context.Context, blockHash ethcommon.Hash) (uint, error) { metrics.EthereumRPCCallCounterInc("transaction_count") - return c.clt.TransactionCount(ctx, blockHash) + count, err := c.clt.TransactionCount(ctx, blockHash) + if err != nil { + return 0, ErrorWithStrippedSecrets{err: err} + } + return count, nil } func (c *ethClientWrapper) TransactionInBlock(ctx context.Context, blockHash ethcommon.Hash, index uint) (*ethtypes.Transaction, error) { metrics.EthereumRPCCallCounterInc("transaction_in_block") - return c.clt.TransactionInBlock(ctx, blockHash, index) + block, err := c.clt.TransactionInBlock(ctx, blockHash, index) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return block, nil } func (c *ethClientWrapper) CodeAt(ctx context.Context, contract ethcommon.Address, blockNumber *big.Int) ([]byte, error) { metrics.EthereumRPCCallCounterInc("code_at") - return c.clt.CodeAt(ctx, contract, blockNumber) + at, err := c.clt.CodeAt(ctx, contract, blockNumber) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return at, nil } func (c *ethClientWrapper) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { metrics.EthereumRPCCallCounterInc("call_contract") - return c.clt.CallContract(ctx, call, blockNumber) + contract, err := c.clt.CallContract(ctx, call, blockNumber) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return contract, nil } func (c *ethClientWrapper) EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) { metrics.EthereumRPCCallCounterInc("estimate_gas") - return c.clt.EstimateGas(ctx, call) + estimateGas, err := c.clt.EstimateGas(ctx, call) + if err != nil { + return 0, ErrorWithStrippedSecrets{err: err} + } + return estimateGas, nil } func (c *ethClientWrapper) PendingCodeAt(ctx context.Context, account ethcommon.Address) ([]byte, error) { metrics.EthereumRPCCallCounterInc("pending_code_at") - return c.clt.PendingCodeAt(ctx, account) + at, err := c.clt.PendingCodeAt(ctx, account) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return at, nil } func (c *ethClientWrapper) PendingNonceAt(ctx context.Context, account ethcommon.Address) (uint64, error) { metrics.EthereumRPCCallCounterInc("pending_nonce_at") - return c.clt.PendingNonceAt(ctx, account) + at, err := c.clt.PendingNonceAt(ctx, account) + if err != nil { + return 0, ErrorWithStrippedSecrets{err: err} + } + return at, nil } func (c *ethClientWrapper) SendTransaction(ctx context.Context, tx *ethtypes.Transaction) error { metrics.EthereumRPCCallCounterInc("send_transaction") - return c.clt.SendTransaction(ctx, tx) + err := c.clt.SendTransaction(ctx, tx) + return ErrorWithStrippedSecrets{err: err} } func (c *ethClientWrapper) SuggestGasPrice(ctx context.Context) (*big.Int, error) { metrics.EthereumRPCCallCounterInc("suggest_gas_price") - return c.clt.SuggestGasPrice(ctx) + price, err := c.clt.SuggestGasPrice(ctx) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return price, nil } func (c *ethClientWrapper) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { metrics.EthereumRPCCallCounterInc("suggest_gas_tip_cap") - return c.clt.SuggestGasTipCap(ctx) + tipCap, err := c.clt.SuggestGasTipCap(ctx) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return tipCap, nil } func (c *ethClientWrapper) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]ethtypes.Log, error) { metrics.EthereumRPCCallCounterInc("filter_logs") - return c.clt.FilterLogs(ctx, query) + logs, err := c.clt.FilterLogs(ctx, query) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return logs, nil } func (c *ethClientWrapper) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- ethtypes.Log) (ethereum.Subscription, error) { metrics.EthereumRPCCallCounterInc("subscribe_filter_logs") - return c.clt.SubscribeFilterLogs(ctx, query, ch) + logs, err := c.clt.SubscribeFilterLogs(ctx, query, ch) + if err != nil { + return nil, ErrorWithStrippedSecrets{err: err} + } + return logs, nil +} + +// ErrorWithStrippedSecrets is an extremely naïve implementation of an error that +// will strip the API token from a URL. +type ErrorWithStrippedSecrets struct { + err error +} + +func (e ErrorWithStrippedSecrets) Error() string { + return regexp. + MustCompile(`(?i)(apitoken|token|apikey|key)=(.+)"`). + ReplaceAllString(e.err.Error(), "$1=xxx\"") } diff --git a/core/client/eth/client_wrapper_for_test.go b/core/client/eth/client_wrapper_for_test.go new file mode 100644 index 00000000000..68a839b743c --- /dev/null +++ b/core/client/eth/client_wrapper_for_test.go @@ -0,0 +1,20 @@ +// 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 eth + +func NewErrorWithStrippedSecrets(err error) *ErrorWithStrippedSecrets { + return &ErrorWithStrippedSecrets{err: err} +} diff --git a/core/client/eth/client_wrapper_test.go b/core/client/eth/client_wrapper_test.go new file mode 100644 index 00000000000..d19d70af1fe --- /dev/null +++ b/core/client/eth/client_wrapper_test.go @@ -0,0 +1,39 @@ +// 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 eth_test + +import ( + "fmt" + "testing" + + "code.vegaprotocol.io/vega/core/client/eth" + + "github.com/stretchr/testify/assert" +) + +func TestStrippedError(t *testing.T) { + t.Run("when there is a secret in URL", func(t *testing.T) { + origErr := fmt.Errorf("Post \\\"https://arbitrum.api.onfinality.io/rpc?token=<<<<<<>>>>>\": read tcp 123.222.121.111:49122->145.222.111.111:443: read: connection reset by peer") + err := eth.NewErrorWithStrippedSecrets(origErr) + assert.Equal(t, "Post \\\"https://arbitrum.api.onfinality.io/rpc?token=xxx\": read tcp 123.222.121.111:49122->145.222.111.111:443: read: connection reset by peer", err.Error()) + }) + + t.Run("when there is no secret in URL", func(t *testing.T) { + origErr := fmt.Errorf("Post \\\"https://arbitrum.api.onfinality.io/rpc\": read tcp 123.222.121.111:49122->145.222.111.111:443: read: connection reset by peer") + err := eth.NewErrorWithStrippedSecrets(origErr) + assert.Equal(t, "Post \\\"https://arbitrum.api.onfinality.io/rpc\": read tcp 123.222.121.111:49122->145.222.111.111:443: read: connection reset by peer", err.Error()) + }) +} diff --git a/core/client/eth/ethereum_confirmations.go b/core/client/eth/ethereum_confirmations.go index 5a559cf113d..f9d1ef9d0a3 100644 --- a/core/client/eth/ethereum_confirmations.go +++ b/core/client/eth/ethereum_confirmations.go @@ -109,6 +109,11 @@ func (e *EthereumConfirmations) Check(block uint64) error { return err } + // if finality state is "latest" we do not need to check as this will already be done by the confirmations count + if e.finState == nil { + return nil + } + finalized, err := e.finalizedHeight(context.Background()) if err != nil { return err diff --git a/core/collateral/engine.go b/core/collateral/engine.go index e69042d4d8f..39640306389 100644 --- a/core/collateral/engine.go +++ b/core/collateral/engine.go @@ -89,8 +89,9 @@ type TimeService interface { // Engine is handling the power of the collateral. type Engine struct { Config - log *logging.Logger - cfgMu sync.Mutex + log *logging.Logger + cfgMu sync.Mutex + cacheLock sync.RWMutex accs map[string]*types.Account // map of partyID -> account ID -> account @@ -104,6 +105,10 @@ type Engine struct { partiesAccsBalanceCache map[string]*num.Uint partiesAccsBalanceCacheLock sync.RWMutex + // a block cache of the total value of general + margin + order margin accounts in quantum + partyMarketCache map[string]map[string]*num.Uint + partyAssetCache map[string]map[string]*num.Uint + idbuf []byte // asset ID to asset @@ -144,10 +149,106 @@ func New(log *logging.Logger, conf Config, ts TimeService, broker Broker) *Engin vesting: map[string]map[string]*num.Uint{}, partiesAccsBalanceCache: map[string]*num.Uint{}, nextBalancesSnapshot: time.Time{}, + partyAssetCache: map[string]map[string]*num.Uint{}, + partyMarketCache: map[string]map[string]*num.Uint{}, + } +} + +func (e *Engine) updatePartyAssetCache() { + e.cacheLock.Lock() + defer e.cacheLock.Unlock() + e.partyAssetCache = map[string]map[string]*num.Uint{} + e.partyMarketCache = map[string]map[string]*num.Uint{} + // initialise party market and general accounts + for k, v := range e.partiesAccs { + if k == "*" { + continue + } + general := map[string]*num.Uint{} + marketAccounts := map[string]*num.Uint{} + for _, a := range v { + if a.Type != types.AccountTypeGeneral && a.Type != types.AccountTypeHolding && a.Type != types.AccountTypeMargin && a.Type != types.AccountTypeOrderMargin { + continue + } + if a.Type == types.AccountTypeGeneral { + general[a.Asset] = a.Balance.Clone() + } else { + if _, ok := marketAccounts[a.MarketID]; !ok { + marketAccounts[a.MarketID] = num.UintZero() + } + marketAccounts[a.MarketID].AddSum(a.Balance) + } + } + e.partyAssetCache[k] = general + e.partyMarketCache[k] = marketAccounts + } +} + +func (e *Engine) CheckOrderSpamAllMarkets(party string) error { + e.cacheLock.RLock() + defer e.cacheLock.RUnlock() + if _, ok := e.partyAssetCache[party]; !ok { + return fmt.Errorf("party " + party + " is not eligible to submit order transaction with no market in scope") + } else { + for _, asts := range e.partyAssetCache { + for _, balance := range asts { + if !balance.IsZero() { + return nil + } + } + } + } + if marketBalances, ok := e.partyMarketCache[party]; ok { + for _, marketBalance := range marketBalances { + if !marketBalance.IsZero() { + return nil + } + } + } + return fmt.Errorf("party " + party + " is not eligible to submit order transaction with no market in scope") +} + +func (e *Engine) CheckOrderSpam(party, market string, assets []string) error { + e.cacheLock.RLock() + defer e.cacheLock.RUnlock() + + if e.log.IsDebug() { + e.log.Debug("CheckOrderSpam", logging.String("party", party), logging.String("market", market), logging.Strings("assets", assets)) } + if assetBalances, ok := e.partyAssetCache[party]; !ok { + return fmt.Errorf("party " + party + " is not eligible to submit order transactions in market " + market + " (no general account in no asset)") + } else { + found := false + for _, ast := range assets { + if balance, ok := assetBalances[ast]; ok { + found = true + if !balance.IsZero() { + return nil + } + } + } + if !found { + if e.log.IsDebug() { + for ast, balance := range e.partyAssetCache[party] { + e.log.Debug("party asset cache", logging.String("party", party), logging.String("asset", ast), logging.String("balance", balance.String())) + } + } + return fmt.Errorf("party " + party + " is not eligible to submit order transactions in market " + market + " (no general account found)") + } + } + + if marketBalances, ok := e.partyMarketCache[party]; ok { + if marketBalance, ok := marketBalances[market]; ok && !marketBalance.IsZero() { + return nil + } else { + return fmt.Errorf("party " + party + " is not eligible to submit order transactions in market " + market + " (no general account balance in asset and no market accounts found)") + } + } + return fmt.Errorf("party " + party + " is not eligible to submit order transactions in market " + market + " (no general account balance in asset and no balance in market accounts)") } func (e *Engine) BeginBlock(ctx context.Context) { + e.updatePartyAssetCache() // FIXME(jeremy): to be removed after the migration from // 72.x to 73, this will ensure all per assets accounts are being // created after the restart @@ -219,8 +320,8 @@ func (e *Engine) GetPartyBalance(party string) *num.Uint { return num.UintZero() } -func (e *Engine) GetAllVestingQuantumBalance(party string) *num.Uint { - balance := num.UintZero() +func (e *Engine) GetAllVestingQuantumBalance(party string) num.Decimal { + balance := num.DecimalZero() for asset, details := range e.enabledAssets { // vesting balance @@ -229,14 +330,14 @@ func (e *Engine) GetAllVestingQuantumBalance(party string) *num.Uint { quantum = details.Details.Quantum } if acc, ok := e.accs[e.accountID(noMarket, party, asset, types.AccountTypeVestingRewards)]; ok { - quantumBalance, _ := num.UintFromDecimal(acc.Balance.ToDecimal().Div(quantum)) - balance.AddSum(quantumBalance) + quantumBalance := acc.Balance.ToDecimal().Div(quantum) + balance = balance.Add(quantumBalance) } // vested balance if acc, ok := e.accs[e.accountID(noMarket, party, asset, types.AccountTypeVestedRewards)]; ok { - quantumBalance, _ := num.UintFromDecimal(acc.Balance.ToDecimal().Div(quantum)) - balance.AddSum(quantumBalance) + quantumBalance := acc.Balance.ToDecimal().Div(quantum) + balance = balance.Add(quantumBalance) } } @@ -863,9 +964,7 @@ func (e *Engine) TransferRewards(ctx context.Context, rewardAccountID string, tr return responses, nil } -func (e *Engine) TransferVestedRewards( - ctx context.Context, transfers []*types.Transfer, -) ([]*types.LedgerMovement, error) { +func (e *Engine) TransferVestedRewards(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovement, error) { if len(transfers) == 0 { return nil, nil } @@ -3576,6 +3675,282 @@ func (e *Engine) CreatePartyMarginAccount(ctx context.Context, partyID, marketID return marginID, nil } +// CreatePartyAMMSubAccounts ... +func (e *Engine) CreatePartyAMMsSubAccounts( + ctx context.Context, + party, ammKey, asset, market string, +) (general *types.Account, margin *types.Account, err error) { + generalID, err := e.CreatePartyGeneralAccount(ctx, ammKey, asset) + if err != nil { + return nil, nil, err + } + + marginID, err := e.CreatePartyMarginAccount(ctx, ammKey, market, asset) + if err != nil { + return nil, nil, err + } + + _, err = e.CreatePartyLiquidityFeeAccount(ctx, ammKey, 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.TransferTypeAMMLow: + // 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.TransferTypeAMMHigh: + 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.TransferTypeAMMRelease, + 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 != nil && 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.TransferTypeAMMRelease, + 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.TransferTypeAMMRelease, + 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) @@ -3640,10 +4015,10 @@ func (e *Engine) CreatePartyGeneralAccount(ctx context.Context, partyID, asset s return generalID, nil } -// GetOrCreatePartyVestingAccount create the general account for a party. +// GetOrCreatePartyVestingRewardAccount create the general account for a party. func (e *Engine) GetOrCreatePartyVestingRewardAccount(ctx context.Context, partyID, asset string) *types.Account { if !e.AssetExists(asset) { - e.log.Panic("trying to use a nonexisting asset for reward accounts, something went very wrong somewhere", + e.log.Panic("trying to use a non-existent asset for reward accounts, something went very wrong somewhere", logging.String("asset-id", asset)) } @@ -3673,7 +4048,7 @@ func (e *Engine) GetPartyVestedRewardAccount(partyID, asset string) (*types.Acco return e.GetAccountByID(vested) } -// GetOrCreatePartyVestedAccount create the general account for a party. +// GetOrCreatePartyVestedRewardAccount create the general account for a party. func (e *Engine) GetOrCreatePartyVestedRewardAccount(ctx context.Context, partyID, asset string) *types.Account { if !e.AssetExists(asset) { e.log.Panic("trying to use a nonexisting asset for reward accounts, something went very wrong somewhere", diff --git a/core/collateral/engine_test.go b/core/collateral/engine_test.go index 6878a6f3518..d418e8a015f 100644 --- a/core/collateral/engine_test.go +++ b/core/collateral/engine_test.go @@ -149,7 +149,7 @@ func TestGetAllVestingQuantumBalance(t *testing.T) { party := "party1" balance := eng.GetAllVestingQuantumBalance(party) - assert.Equal(t, int(balance.Uint64()), 0) + assert.Equal(t, balance.String(), "0") assetT := types.Asset{ ID: "USDC", @@ -179,7 +179,7 @@ func TestGetAllVestingQuantumBalance(t *testing.T) { ) balance = eng.GetAllVestingQuantumBalance(party) - assert.Equal(t, int(balance.Uint64()), 100) + assert.Equal(t, balance.String(), "100") // add some more of the other account // now add some balance to an asset @@ -190,7 +190,7 @@ func TestGetAllVestingQuantumBalance(t *testing.T) { ) balance = eng.GetAllVestingQuantumBalance(party) - assert.Equal(t, int(balance.Uint64()), 103) + assert.Equal(t, balance.String(), "103.1666666666666667") } func testClearFeeAccounts(t *testing.T) { diff --git a/core/datasource/external/ethcall/engine.go b/core/datasource/external/ethcall/engine.go index 8a633ce28e1..be731d0e70d 100644 --- a/core/datasource/external/ethcall/engine.go +++ b/core/datasource/external/ethcall/engine.go @@ -321,7 +321,7 @@ func (e *Engine) Poll(ctx context.Context, wallTime time.Time) { if call.triggered(prevEthBlock, nextEthBlockIsh) { res, err := call.Call(ctx, e.client, nextEthBlock.Number.Uint64()) if err != nil { - e.log.Error("failed to call contract", logging.Error(err), logging.Uint64("chain-id", e.chainID.Load())) + e.log.Error("failed to call contract", logging.Error(err), logging.String("spec-id", specID), logging.Uint64("chain-id", e.chainID.Load())) event := makeErrorChainEvent(err.Error(), specID, nextEthBlockIsh, e.chainID.Load()) e.forwarder.ForwardFromSelf(event) e.lastSent = nextEthBlockIsh diff --git a/core/events/amm_pool.go b/core/events/amm_pool.go new file mode 100644 index 00000000000..77205240a88 --- /dev/null +++ b/core/events/amm_pool.go @@ -0,0 +1,111 @@ +// 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.AMM +} + +type AMMCurve struct { + VirtualLiquidity num.Decimal + TheoreticalPosition num.Decimal +} + +func (a *AMMCurve) ToProtoEvent() *eventspb.AMM_Curve { + if a == nil { + return nil + } + + return &eventspb.AMM_Curve{ + VirtualLiquidity: a.VirtualLiquidity.String(), + TheoreticalPosition: a.TheoreticalPosition.String(), + } +} + +func NewAMMPoolEvent( + ctx context.Context, + party, market, ammParty, poolID string, + commitment *num.Uint, + p *types.ConcentratedLiquidityParameters, + status types.AMMPoolStatus, + statusReason types.AMMStatusReason, + fees num.Decimal, + lowerCurve *AMMCurve, + upperCurve *AMMCurve, +) *AMMPool { + return &AMMPool{ + Base: newBase(ctx, AMMPoolEvent), + pool: &eventspb.AMM{ + Id: poolID, + PartyId: party, + MarketId: market, + AmmPartyId: ammParty, + Commitment: commitment.String(), + Parameters: p.ToProtoEvent(), + Status: status, + StatusReason: statusReason, + ProposedFee: fees.String(), + LowerCurve: lowerCurve.ToProtoEvent(), + UpperCurve: upperCurve.ToProtoEvent(), + }, + } +} + +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.AMM { + return p.pool +} + +func (p AMMPool) Proto() eventspb.AMM { + return *p.pool +} + +func (p AMMPool) StreamMessage() *eventspb.BusEvent { + busEvent := newBusEventFromBase(p.Base) + busEvent.Event = &eventspb.BusEvent_Amm{ + Amm: p.pool, + } + + return busEvent +} + +func AMMPoolEventFromStream(ctx context.Context, be *eventspb.BusEvent) *AMMPool { + pool := &AMMPool{ + Base: newBaseFromBusEvent(ctx, AMMPoolEvent, be), + pool: be.GetAmm(), + } + return pool +} diff --git a/core/events/bus.go b/core/events/bus.go index e127cacea4d..bc21bac0741 100644 --- a/core/events/bus.go +++ b/core/events/bus.go @@ -172,6 +172,8 @@ const ( TeamsStatsUpdatedEvent TimeWeightedNotionalPositionUpdatedEvent CancelledOrdersEvent + GameScoresEvent + AMMPoolEvent ) var ( @@ -273,6 +275,8 @@ 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_GAME_SCORES: GameScoresEvent, + eventspb.BusEventType_BUS_EVENT_TYPE_AMM: AMMPoolEvent, // If adding a type here, please also add it to datanode/broker/convert.go } @@ -365,6 +369,8 @@ 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, + GameScoresEvent: eventspb.BusEventType_BUS_EVENT_TYPE_GAME_SCORES, + AMMPoolEvent: eventspb.BusEventType_BUS_EVENT_TYPE_AMM, // If adding a type here, please also add it to datanode/broker/convert.go } @@ -456,6 +462,8 @@ var ( TeamsStatsUpdatedEvent: "TeamsStatsUpdatedEvent", TimeWeightedNotionalPositionUpdatedEvent: "TimeWeightedNotionalPositionUpdatedEvent", CancelledOrdersEvent: "CancelledOrdersEvent", + GameScoresEvent: "GameScoresEvent", + AMMPoolEvent: "AMMPoolEvent", } ) diff --git a/core/events/game_scores.go b/core/events/game_scores.go new file mode 100644 index 00000000000..cb5e981ec98 --- /dev/null +++ b/core/events/game_scores.go @@ -0,0 +1,143 @@ +// 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" + "time" + + "code.vegaprotocol.io/vega/core/types" + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" +) + +type GameScores struct { + *Base + pb eventspb.GameScores +} + +func (gs *GameScores) GameScoreEvent() eventspb.GameScores { + return gs.pb +} + +func NewPartyGameScoresEvent(ctx context.Context, epoch int64, gameID string, time time.Time, partyScores []*types.PartyContributionScore) *GameScores { + ps := make([]*eventspb.GamePartyScore, 0, len(partyScores)) + for _, partyScore := range partyScores { + var ov, sb, tfp string + if partyScore.OpenVolume != nil { + ov = partyScore.OpenVolume.String() + } + if partyScore.StakingBalance != nil { + sb = partyScore.StakingBalance.String() + } + if partyScore.TotalFeesPaid != nil { + tfp = partyScore.TotalFeesPaid.String() + } + + ps = append(ps, &eventspb.GamePartyScore{ + GameId: gameID, + Epoch: epoch, + Time: time.UnixNano(), + Party: partyScore.Party, + Score: partyScore.Score.String(), + IsEligible: partyScore.IsEligible, + OpenVolume: ov, + StakingBalance: sb, + TotalFeesPaid: tfp, + }) + } + + return &GameScores{ + Base: newBase(ctx, GameScoresEvent), + pb: eventspb.GameScores{ + PartyScores: ps, + }, + } +} + +func NewTeamGameScoresEvent(ctx context.Context, epoch int64, gameID string, time time.Time, teamScores []*types.PartyContributionScore, teamPartyScores map[string][]*types.PartyContributionScore) *GameScores { + ts := make([]*eventspb.GameTeamScore, 0, len(teamScores)) + ps := []*eventspb.GamePartyScore{} + for _, teamScore := range teamScores { + team := &eventspb.GameTeamScore{ + GameId: gameID, + Time: time.UnixNano(), + Epoch: epoch, + TeamId: teamScore.Party, + Score: teamScore.Score.String(), + } + for _, partyScore := range teamPartyScores[teamScore.Party] { + var rank *uint64 + if partyScore.RankingIndex >= 0 { + r := uint64(partyScore.RankingIndex) + rank = &r + } + var ov, sb, tfp string + if partyScore.OpenVolume != nil { + ov = partyScore.OpenVolume.String() + } + if partyScore.StakingBalance != nil { + sb = partyScore.StakingBalance.String() + } + if partyScore.TotalFeesPaid != nil { + tfp = partyScore.TotalFeesPaid.String() + } + ps = append(ps, &eventspb.GamePartyScore{ + GameId: gameID, + TeamId: &team.TeamId, + Time: time.UnixNano(), + Epoch: epoch, + Party: partyScore.Party, + Score: partyScore.Score.String(), + IsEligible: partyScore.IsEligible, + OpenVolume: ov, + StakingBalance: sb, + TotalFeesPaid: tfp, + Rank: rank, + }) + } + ts = append(ts, team) + } + + return &GameScores{ + Base: newBase(ctx, GameScoresEvent), + pb: eventspb.GameScores{ + PartyScores: ps, + TeamScores: ts, + }, + } +} + +func (gs *GameScores) Proto() eventspb.GameScores { + return gs.pb +} + +func (gs *GameScores) StreamMessage() *eventspb.BusEvent { + busEvent := newBusEventFromBase(gs.Base) + cpy := gs.pb + busEvent.Event = &eventspb.BusEvent_GameScores{ + GameScores: &cpy, + } + + return busEvent +} + +func GameScoresEventFromStream(ctx context.Context, be *eventspb.BusEvent) *GameScores { + m := be.GetGameScores() + return &GameScores{ + Base: newBaseFromBusEvent(ctx, GameScoresEvent, be), + pb: *m, + } +} diff --git a/core/events/party.go b/core/events/party.go index 43e12b2183e..5bb852503d1 100644 --- a/core/events/party.go +++ b/core/events/party.go @@ -23,6 +23,7 @@ import ( vegapb "code.vegaprotocol.io/vega/protos/vega" eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" + "golang.org/x/exp/maps" "golang.org/x/exp/slices" ) @@ -98,13 +99,25 @@ func NewPartyProfileUpdatedEvent(ctx context.Context, p *types.PartyProfile) *Pa return strings.Compare(a.Key, b.Key) }) + // Ensure deterministic order in event. + slices.SortStableFunc(metadata, func(a, b *vegapb.Metadata) int { + return strings.Compare(a.Key, b.Key) + }) + + derivedKeys := maps.Keys(p.DerivedKeys) + + slices.SortStableFunc(derivedKeys, func(a, b string) int { + return strings.Compare(a, b) + }) + return &PartyProfileUpdated{ Base: newBase(ctx, PartyProfileUpdatedEvent), e: eventspb.PartyProfileUpdated{ UpdatedProfile: &vegapb.PartyProfile{ - PartyId: p.PartyID.String(), - Alias: p.Alias, - Metadata: metadata, + PartyId: p.PartyID.String(), + Alias: p.Alias, + Metadata: metadata, + DerivedKeys: derivedKeys, }, }, } diff --git a/core/events/transaction_result.go b/core/events/transaction_result.go index 7d189369e37..6187393e336 100644 --- a/core/events/transaction_result.go +++ b/core/events/transaction_result.go @@ -82,6 +82,8 @@ func NewTransactionResultEventFailure( func (t *TransactionResult) setTx(tx interface{}) *TransactionResult { switch tv := tx.(type) { + case *commandspb.DelayedTransactionsWrapper: + break case *commandspb.OrderSubmission: t.evt.Transaction = &eventspb.TransactionResult_OrderSubmission{ OrderSubmission: tv, @@ -198,6 +200,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/evtforward/engine.go b/core/evtforward/engine.go index 1dc0a16095d..1853af7ffcb 100644 --- a/core/evtforward/engine.go +++ b/core/evtforward/engine.go @@ -79,6 +79,14 @@ func (e *Engine) UpdateMultisigControlStartingBlock(b uint64) { e.ethEngine.UpdateMultiSigControlStartingBlock(b) } +func (e *Engine) VerifyHeartbeat(ctx context.Context, height uint64, chainID string, contract string, blockTime uint64) error { + return e.ethEngine.VerifyHeartbeat(ctx, height, chainID, contract, blockTime) +} + +func (e *Engine) UpdateStartingBlock(address string, block uint64) { + e.ethEngine.UpdateStartingBlock(address, block) +} + func (e *Engine) SetupEthereumEngine( client ethereum.Client, forwarder ethereum.Forwarder, @@ -127,7 +135,9 @@ func (e *Engine) SetupEthereumEngine( ethCfg.StakingBridge(), ethCfg.VestingBridge(), ethCfg.MultiSigControl(), + ethCfg.CollateralBridge(), ethCfg.ChainID(), + ethCfg.BlockTime(), ) e.UpdateCollateralStartingBlock(filterer.CurrentHeight(context.Background())) @@ -196,7 +206,9 @@ func (e *Engine) SetupSecondaryEthereumEngine( types.EthereumContract{}, types.EthereumContract{}, ethCfg.MultiSigControl(), + ethCfg.CollateralBridge(), ethCfg.ChainID(), + ethCfg.BlockTime(), ) e.UpdateCollateralStartingBlock(filterer.CurrentHeight(context.Background())) @@ -260,6 +272,12 @@ func (e *NoopEngine) UpdateStakingStartingBlock(b uint64) {} func (e *NoopEngine) UpdateMultisigControlStartingBlock(b uint64) {} +func (e *NoopEngine) VerifyHeartbeat(_ context.Context, _ uint64, _ string, _ string, _ uint64) error { + return nil +} + +func (e *NoopEngine) UpdateStartingBlock(_ string, _ uint64) {} + func (e *NoopEngine) SetupEthereumEngine( _ ethereum.Client, _ ethereum.Forwarder, diff --git a/core/evtforward/ethereum/config.go b/core/evtforward/ethereum/config.go index 8d92a5fa1b8..440aaa412c7 100644 --- a/core/evtforward/ethereum/config.go +++ b/core/evtforward/ethereum/config.go @@ -23,6 +23,7 @@ import ( ) const ( + defaultHeartbeatInterval = 1 * time.Hour defaultDurationBetweenTwoRetry = 20 * time.Second maxEthereumBlocks = 10000 // chosen because one of the validators wanted to use quicknode, and this is their limit ) @@ -30,18 +31,20 @@ const ( type Config struct { // Level specifies the logging level of the Ethereum implementation of the // Event Forwarder. - Level encoding.LogLevel `long:"log-level"` - MaxEthereumBlocks uint64 `long:"max-ethereum-blocks"` - PollEventRetryDuration encoding.Duration - ChainID string - SkipClientVerification bool + Level encoding.LogLevel `long:"log-level"` + MaxEthereumBlocks uint64 `long:"max-ethereum-blocks"` + PollEventRetryDuration encoding.Duration + ChainID string + SkipClientVerification bool + HeartbeatIntervalForTestOnlyDoNotChange encoding.Duration } func NewDefaultConfig() Config { return Config{ - Level: encoding.LogLevel{Level: logging.InfoLevel}, - PollEventRetryDuration: encoding.Duration{Duration: defaultDurationBetweenTwoRetry}, - MaxEthereumBlocks: maxEthereumBlocks, + Level: encoding.LogLevel{Level: logging.InfoLevel}, + PollEventRetryDuration: encoding.Duration{Duration: defaultDurationBetweenTwoRetry}, + MaxEthereumBlocks: maxEthereumBlocks, + HeartbeatIntervalForTestOnlyDoNotChange: encoding.Duration{Duration: defaultHeartbeatInterval}, } } @@ -53,4 +56,8 @@ func (c *Config) setDefaults() { if c.PollEventRetryDuration.Duration == 0 { c.PollEventRetryDuration.Duration = defaultDurationBetweenTwoRetry } + + if c.HeartbeatIntervalForTestOnlyDoNotChange.Duration == 0 { + c.HeartbeatIntervalForTestOnlyDoNotChange.Duration = defaultHeartbeatInterval + } } diff --git a/core/evtforward/ethereum/engine.go b/core/evtforward/ethereum/engine.go index f8fc0c383aa..c928602800b 100644 --- a/core/evtforward/ethereum/engine.go +++ b/core/evtforward/ethereum/engine.go @@ -17,10 +17,13 @@ package ethereum import ( "context" + "errors" + "sync" "time" "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/logging" + "code.vegaprotocol.io/vega/protos/vega" commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" ) @@ -28,6 +31,8 @@ const ( engineLogger = "engine" ) +var ErrInvalidHeartbeat = errors.New("forwarded heartbeat is invalid") + //go:generate go run github.com/golang/mock/mockgen -destination mocks/forwarder_mock.go -package mocks code.vegaprotocol.io/vega/core/evtforward/ethereum Forwarder type Forwarder interface { ForwardFromSelf(*commandspb.ChainEvent) @@ -40,6 +45,14 @@ type Filterer interface { FilterVestingEvents(ctx context.Context, startAt, stopAt uint64, cb OnEventFound) FilterMultisigControlEvents(ctx context.Context, startAt, stopAt uint64, cb OnEventFound) CurrentHeight(context.Context) uint64 + GetEthTime(ctx context.Context, atBlock uint64) (uint64, error) +} + +// Contract wrapper around EthereumContract to keep track of the block heights we've checked. +type Contract struct { + types.EthereumContract + next uint64 // the block height we will next check for events, all block heights less than this will have events sent in + last uint64 // the block height we last sent out an event for this contract, including heartbeats } type Engine struct { @@ -50,17 +63,18 @@ type Engine struct { filterer Filterer forwarder Forwarder - nextCollateralBlockNumber uint64 - nextMultiSigControlBlockNumber uint64 - nextStakingBlockNumber uint64 - nextVestingBlockNumber uint64 - chainID string - shouldFilterVestingBridge bool - shouldFilterStakingBridge bool + stakingDeployment *Contract + vestingDeployment *Contract + collateralDeployment *Contract + multisigDeployment *Contract + mu sync.Mutex cancelEthereumQueries context.CancelFunc + + // the number of blocks between heartbeats + heartbeatInterval uint64 } type fwdWrapper struct { @@ -90,7 +104,9 @@ func NewEngine( stakingDeployment types.EthereumContract, vestingDeployment types.EthereumContract, multiSigDeployment types.EthereumContract, + collateralDeployment types.EthereumContract, chainID string, + blockTime time.Duration, ) *Engine { l := log.Named(engineLogger) @@ -99,32 +115,36 @@ func NewEngine( // if they are left out cfg.setDefaults() + // calculate the number of blocks in an hour, this will be the interval we send out heartbeats + heartbeatTime := cfg.HeartbeatIntervalForTestOnlyDoNotChange.Duration + heartbeatInterval := heartbeatTime.Seconds() / blockTime.Seconds() + return &Engine{ - cfg: cfg, - log: l, - poller: newPoller(cfg.PollEventRetryDuration.Get()), - filterer: filterer, - forwarder: fwdWrapper{forwarder, chainID}, - shouldFilterStakingBridge: stakingDeployment.HasAddress(), - nextStakingBlockNumber: stakingDeployment.DeploymentBlockHeight(), - shouldFilterVestingBridge: vestingDeployment.HasAddress(), - nextVestingBlockNumber: vestingDeployment.DeploymentBlockHeight(), - nextMultiSigControlBlockNumber: multiSigDeployment.DeploymentBlockHeight(), - chainID: chainID, + cfg: cfg, + log: l, + poller: newPoller(cfg.PollEventRetryDuration.Get()), + filterer: filterer, + forwarder: fwdWrapper{forwarder, chainID}, + stakingDeployment: &Contract{stakingDeployment, 0, 0}, + vestingDeployment: &Contract{vestingDeployment, 0, 0}, + multisigDeployment: &Contract{multiSigDeployment, 0, 0}, + collateralDeployment: &Contract{collateralDeployment, 0, 0}, + chainID: chainID, + heartbeatInterval: uint64(heartbeatInterval), } } func (e *Engine) UpdateCollateralStartingBlock(b uint64) { - e.nextCollateralBlockNumber = b + e.collateralDeployment.next = b } func (e *Engine) UpdateStakingStartingBlock(b uint64) { - e.nextStakingBlockNumber = b - e.nextVestingBlockNumber = b + e.vestingDeployment.next = b + e.stakingDeployment.next = b } func (e *Engine) UpdateMultiSigControlStartingBlock(b uint64) { - e.nextMultiSigControlBlockNumber = b + e.multisigDeployment.next = b } func (e *Engine) ReloadConf(cfg Config) { @@ -154,9 +174,9 @@ func (e *Engine) Start() { if e.log.IsDebug() { e.log.Debug("Clock is ticking, gathering Ethereum events", logging.String("chain-id", e.chainID), - logging.Uint64("next-collateral-block-number", e.nextCollateralBlockNumber), - logging.Uint64("next-multisig-control-block-number", e.nextMultiSigControlBlockNumber), - logging.Uint64("next-staking-block-number", e.nextStakingBlockNumber), + logging.Uint64("next-collateral-block-number", e.collateralDeployment.next), + logging.Uint64("next-multisig-control-block-number", e.multisigDeployment.next), + logging.Uint64("next-staking-block-number", e.stakingDeployment.next), ) } e.gatherEvents(ctx) @@ -180,42 +200,168 @@ func min(a, b uint64) uint64 { func (e *Engine) gatherEvents(ctx context.Context) { nBlocks := e.cfg.MaxEthereumBlocks currentHeight := e.filterer.CurrentHeight(ctx) + e.mu.Lock() + defer e.mu.Unlock() // Ensure we are not issuing a filtering request for non-existing block. - if ok, nextHeight := issueFilteringRequest(e.nextCollateralBlockNumber, currentHeight, nBlocks); ok { - e.filterer.FilterCollateralEvents(ctx, e.nextCollateralBlockNumber, nextHeight, func(event *commandspb.ChainEvent) { + if ok, nextHeight := issueFilteringRequest(e.collateralDeployment.next, currentHeight, nBlocks); ok { + e.filterer.FilterCollateralEvents(ctx, e.collateralDeployment.next, nextHeight, func(event *commandspb.ChainEvent, h uint64) { e.forwarder.ForwardFromSelf(event) + e.collateralDeployment.last = h }) - e.nextCollateralBlockNumber = nextHeight + 1 + e.collateralDeployment.next = nextHeight + 1 + e.sendHeartbeat(e.collateralDeployment) } // Ensure we are not issuing a filtering request for non-existing block. - if e.shouldFilterStakingBridge { - if ok, nextHeight := issueFilteringRequest(e.nextStakingBlockNumber, currentHeight, nBlocks); ok { - e.filterer.FilterStakingEvents(ctx, e.nextStakingBlockNumber, nextHeight, func(event *commandspb.ChainEvent) { + if e.stakingDeployment.HasAddress() { + if ok, nextHeight := issueFilteringRequest(e.stakingDeployment.next, currentHeight, nBlocks); ok { + e.filterer.FilterStakingEvents(ctx, e.stakingDeployment.next, nextHeight, func(event *commandspb.ChainEvent, h uint64) { e.forwarder.ForwardFromSelf(event) + e.stakingDeployment.last = h }) - e.nextStakingBlockNumber = nextHeight + 1 + e.stakingDeployment.next = nextHeight + 1 + e.sendHeartbeat(e.stakingDeployment) } } // Ensure we are not issuing a filtering request for non-existing block. - if e.shouldFilterVestingBridge { - if ok, nextHeight := issueFilteringRequest(e.nextVestingBlockNumber, currentHeight, nBlocks); ok { - e.filterer.FilterVestingEvents(ctx, e.nextVestingBlockNumber, nextHeight, func(event *commandspb.ChainEvent) { + if e.vestingDeployment.HasAddress() { + if ok, nextHeight := issueFilteringRequest(e.vestingDeployment.next, currentHeight, nBlocks); ok { + e.filterer.FilterVestingEvents(ctx, e.vestingDeployment.next, nextHeight, func(event *commandspb.ChainEvent, h uint64) { e.forwarder.ForwardFromSelf(event) + e.vestingDeployment.last = h }) - e.nextVestingBlockNumber = nextHeight + 1 + e.vestingDeployment.next = nextHeight + 1 + e.sendHeartbeat(e.vestingDeployment) } } // Ensure we are not issuing a filtering request for non-existing block. - if ok, nextHeight := issueFilteringRequest(e.nextMultiSigControlBlockNumber, currentHeight, nBlocks); ok { - e.filterer.FilterMultisigControlEvents(ctx, e.nextMultiSigControlBlockNumber, nextHeight, func(event *commandspb.ChainEvent) { + if ok, nextHeight := issueFilteringRequest(e.multisigDeployment.next, currentHeight, nBlocks); ok { + e.filterer.FilterMultisigControlEvents(ctx, e.multisigDeployment.next, nextHeight, func(event *commandspb.ChainEvent, h uint64) { e.forwarder.ForwardFromSelf(event) + e.multisigDeployment.last = h }) - e.nextMultiSigControlBlockNumber = nextHeight + 1 + e.multisigDeployment.next = nextHeight + 1 + e.sendHeartbeat(e.multisigDeployment) + } +} + +// sendHeartbeat checks whether it has been more than and hour since the validator sent a chain event for the given contract +// and if it has will send a heartbeat chain event so that core has an recent view on the last block checked for new events. +func (e *Engine) sendHeartbeat(contract *Contract) { + // how many heartbeat intervals between the last sent event, and the block height we're checking next + n := (contract.next - contract.last) / e.heartbeatInterval + if n == 0 { + return + } + + height := contract.last + n*e.heartbeatInterval + time, err := e.filterer.GetEthTime(context.Background(), height) + if err != nil { + e.log.Error("unable to find eth-time for contract heartbeat", + logging.Uint64("height", height), + logging.String("chain-id", e.chainID), + logging.Error(err), + ) + return + } + + e.forwarder.ForwardFromSelf( + &commandspb.ChainEvent{ + TxId: "internal", // NA + Nonce: 0, // NA + Event: &commandspb.ChainEvent_Heartbeat{ + Heartbeat: &vega.ERC20Heartbeat{ + ContractAddress: contract.HexAddress(), + BlockHeight: height, + SourceChainId: e.chainID, + BlockTime: time, + }, + }, + }, + ) + contract.last = height +} + +// VerifyHeart checks that the block height of the heartbeat exists and contains the correct block time. It also +// checks that this node has checked the logs of the given contract address up to at least the given height. +func (e *Engine) VerifyHeartbeat(ctx context.Context, height uint64, chainID string, address string, blockTime uint64) error { + e.mu.Lock() + defer e.mu.Unlock() + + t, err := e.filterer.GetEthTime(ctx, height) + if err != nil { + return err + } + + if t != blockTime { + return ErrInvalidHeartbeat + } + + var lastChecked uint64 + if e.collateralDeployment.HexAddress() == address { + lastChecked = e.collateralDeployment.next - 1 } + + if e.multisigDeployment.HexAddress() == address { + lastChecked = e.multisigDeployment.next - 1 + } + + if e.stakingDeployment.HexAddress() == address { + lastChecked = e.stakingDeployment.next - 1 + } + + if e.vestingDeployment.HexAddress() == address { + lastChecked = e.vestingDeployment.next - 1 + } + + // if the heartbeat block height is higher than the last block *this* node has checked for logs + // on the contract, then fail the verification + if lastChecked < height { + return ErrInvalidHeartbeat + } + return nil +} + +// UpdateStartingBlock sets the height that we should starting looking for new events from for the given bridge contract address. +func (e *Engine) UpdateStartingBlock(address string, block uint64) { + e.mu.Lock() + defer e.mu.Unlock() + + if block == 0 { + return + } + + if e.collateralDeployment.HexAddress() == address { + e.collateralDeployment.last = block + e.collateralDeployment.next = block + return + } + + if e.multisigDeployment.HexAddress() == address { + e.multisigDeployment.last = block + e.multisigDeployment.next = block + return + } + + if e.stakingDeployment.HexAddress() == address { + e.stakingDeployment.last = block + e.stakingDeployment.next = block + return + } + + if e.vestingDeployment.HexAddress() == address { + e.vestingDeployment.last = block + e.vestingDeployment.next = block + return + } + + e.log.Warn("unexpected contract address starting block", + logging.String("chain-id", e.chainID), + logging.String("contract-address", address), + ) } // Stop stops the engine, its polling and event forwarding. diff --git a/core/evtforward/ethereum/filterer.go b/core/evtforward/ethereum/filterer.go index f9868eb2445..0396bce46ca 100644 --- a/core/evtforward/ethereum/filterer.go +++ b/core/evtforward/ethereum/filterer.go @@ -63,7 +63,7 @@ type Assets interface { GetVegaIDFromEthereumAddress(string) string } -type OnEventFound func(*commandspb.ChainEvent) +type OnEventFound func(*commandspb.ChainEvent, uint64) type Client interface { ethbind.ContractFilterer @@ -186,6 +186,20 @@ func (f *LogFilterer) CurrentHeight(ctx context.Context) uint64 { return *currentHeight } +func (f *LogFilterer) GetEthTime(ctx context.Context, atBlock uint64) (uint64, error) { + blockNum := big.NewInt(0).SetUint64(atBlock) + header, err := f.client.HeaderByNumber(ctx, blockNum) + if err != nil { + return 0, fmt.Errorf("failed to get block header: %w", err) + } + + if header == nil { + return 0, fmt.Errorf("nil block header: %w", err) + } + + return header.Time, nil +} + // FilterCollateralEvents retrieves the events from the collateral bridge on // Ethereum starting at startAt, transform them into ChainEvent, and pass it to // the OnEventFound callback. @@ -197,7 +211,7 @@ func (f *LogFilterer) FilterCollateralEvents(ctx context.Context, startAt, stopA var event *types.ChainEvent for _, log := range logs { event = f.toCollateralChainEvent(log) - cb(event) + cb(event, log.BlockNumber) } } @@ -214,7 +228,7 @@ func (f *LogFilterer) FilterStakingEvents(ctx context.Context, startAt, stopAt u for _, log := range logs { blockTime := blockTimesFetcher.TimeForBlock(ctx, log.BlockNumber) event = f.toStakingChainEvent(log, blockTime) - cb(event) + cb(event, log.BlockNumber) } } @@ -231,7 +245,7 @@ func (f *LogFilterer) FilterVestingEvents(ctx context.Context, startAt, stopAt u for _, log := range logs { blockTime := blockTimesFetcher.TimeForBlock(ctx, log.BlockNumber) event = f.toStakingChainEvent(log, blockTime) - cb(event) + cb(event, log.BlockNumber) } } @@ -244,7 +258,7 @@ func (f *LogFilterer) FilterMultisigControlEvents(ctx context.Context, startAt, for _, log := range logs { blockTime := blockTimesFetcher.TimeForBlock(ctx, log.BlockNumber) event = f.toMultisigControlChainEvent(log, blockTime) - cb(event) + cb(event, log.BlockNumber) } } diff --git a/core/evtforward/ethereum/mocks/filterer_mock.go b/core/evtforward/ethereum/mocks/filterer_mock.go index 5062f235a5b..a1896704d56 100644 --- a/core/evtforward/ethereum/mocks/filterer_mock.go +++ b/core/evtforward/ethereum/mocks/filterer_mock.go @@ -96,3 +96,18 @@ func (mr *MockFiltererMockRecorder) FilterVestingEvents(arg0, arg1, arg2, arg3 i mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FilterVestingEvents", reflect.TypeOf((*MockFilterer)(nil).FilterVestingEvents), arg0, arg1, arg2, arg3) } + +// GetEthTime mocks base method. +func (m *MockFilterer) GetEthTime(arg0 context.Context, arg1 uint64) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEthTime", arg0, arg1) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEthTime indicates an expected call of GetEthTime. +func (mr *MockFiltererMockRecorder) GetEthTime(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEthTime", reflect.TypeOf((*MockFilterer)(nil).GetEthTime), arg0, arg1) +} diff --git a/core/evtforward/mocks/witness_mock.go b/core/evtforward/mocks/witness_mock.go new file mode 100644 index 00000000000..ced6348770a --- /dev/null +++ b/core/evtforward/mocks/witness_mock.go @@ -0,0 +1,64 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: code.vegaprotocol.io/vega/core/datasource/external/ethverifier (interfaces: Witness) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + reflect "reflect" + time "time" + + validators "code.vegaprotocol.io/vega/core/validators" + gomock "github.com/golang/mock/gomock" +) + +// MockWitness is a mock of Witness interface. +type MockWitness struct { + ctrl *gomock.Controller + recorder *MockWitnessMockRecorder +} + +// MockWitnessMockRecorder is the mock recorder for MockWitness. +type MockWitnessMockRecorder struct { + mock *MockWitness +} + +// NewMockWitness creates a new mock instance. +func NewMockWitness(ctrl *gomock.Controller) *MockWitness { + mock := &MockWitness{ctrl: ctrl} + mock.recorder = &MockWitnessMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockWitness) EXPECT() *MockWitnessMockRecorder { + return m.recorder +} + +// RestoreResource mocks base method. +func (m *MockWitness) RestoreResource(arg0 validators.Resource, arg1 func(interface{}, bool)) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RestoreResource", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// RestoreResource indicates an expected call of RestoreResource. +func (mr *MockWitnessMockRecorder) RestoreResource(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RestoreResource", reflect.TypeOf((*MockWitness)(nil).RestoreResource), arg0, arg1) +} + +// StartCheckWithDelay mocks base method. +func (m *MockWitness) StartCheckWithDelay(arg0 validators.Resource, arg1 func(interface{}, bool), arg2 time.Time, arg3 int64) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StartCheckWithDelay", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(error) + return ret0 +} + +// StartCheckWithDelay indicates an expected call of StartCheckWithDelay. +func (mr *MockWitnessMockRecorder) StartCheckWithDelay(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartCheckWithDelay", reflect.TypeOf((*MockWitness)(nil).StartCheckWithDelay), arg0, arg1, arg2, arg3) +} diff --git a/core/evtforward/tracker.go b/core/evtforward/tracker.go new file mode 100644 index 00000000000..e5e40dc3285 --- /dev/null +++ b/core/evtforward/tracker.go @@ -0,0 +1,346 @@ +// 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 evtforward + +import ( + "context" + "encoding/hex" + "fmt" + "sort" + "strconv" + "time" + + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/core/validators" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + "code.vegaprotocol.io/vega/libs/proto" + "code.vegaprotocol.io/vega/logging" + snapshotpb "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" + + "golang.org/x/exp/maps" +) + +//go:generate go run github.com/golang/mock/mockgen -destination mocks/witness_mock.go -package mocks code.vegaprotocol.io/vega/core/datasource/external/ethverifier Witness +type Witness interface { + StartCheck(validators.Resource, func(interface{}, bool), time.Time) error + RestoreResource(validators.Resource, func(interface{}, bool)) error +} + +type EVMEngine interface { + VerifyHeartbeat(context context.Context, height uint64, chainID string, contract string, blockTime uint64) error + UpdateStartingBlock(string, uint64) +} + +type bridge struct { + // map from contract address -> block height of the last seen address + contractAddresses map[string]uint64 + engine EVMEngine +} + +type Tracker struct { + log *logging.Logger + witness Witness + timeService TimeService + + // map from chain-id -> bridge contract information + bridges map[string]*bridge + + pendingHeartbeats []*pendingHeartbeat + finalizedHeartbeats []*pendingHeartbeat +} + +type pendingHeartbeat struct { + height uint64 + blockTime uint64 + chainID string + contractAddress string + check func(ctx context.Context) error +} + +func (p pendingHeartbeat) GetID() string { + h := strconv.FormatUint(p.height, 10) + t := strconv.FormatUint(p.blockTime, 10) + bytes := []byte(h + t + p.chainID + p.contractAddress) + return hex.EncodeToString(vgcrypto.Hash(bytes)) +} + +func (p pendingHeartbeat) GetChainID() string { + return p.chainID +} + +func (p pendingHeartbeat) GetType() types.NodeVoteType { + return types.NodeVoteTypeEthereumHeartbeat +} + +func (p *pendingHeartbeat) Check(ctx context.Context) error { return p.check(ctx) } + +func NewTracker(log *logging.Logger, witness Witness, ts TimeService) *Tracker { + return &Tracker{ + log: log, + bridges: map[string]*bridge{}, + timeService: ts, + witness: witness, + } +} + +func (t *Tracker) RegisterForwarder(fwd EVMEngine, chainID string, addresses ...string) { + contracts := map[string]uint64{} + for _, address := range addresses { + contracts[address] = 0 + } + + t.bridges[chainID] = &bridge{ + engine: fwd, + contractAddresses: contracts, + } +} + +func (t *Tracker) ProcessHeartbeat(address, chainID string, height uint64, blockTime uint64) error { + // check if the heartbeat is too old, we don't care if we've already seen something at a higher block height + + bridge, ok := t.bridges[chainID] + if !ok { + return fmt.Errorf("bridge does not exist for chain-id: %s", chainID) + } + + last, ok := bridge.contractAddresses[address] + if !ok { + return fmt.Errorf("contract address does not correspond to a bridge contract: %s", address) + } + + if height <= last { + return fmt.Errorf("heartbeat is stale") + } + + fwd := bridge.engine + + // continue with verification + pending := &pendingHeartbeat{ + height: height, + blockTime: blockTime, + chainID: chainID, + contractAddress: address, + check: func(ctx context.Context) error { return fwd.VerifyHeartbeat(ctx, height, chainID, address, blockTime) }, + } + + t.pendingHeartbeats = append(t.pendingHeartbeats, pending) + + t.log.Info("bridge heartbeat received, starting validation", + logging.String("chain-id", chainID), + logging.String("contract-address", address), + logging.Uint64("height", height), + ) + + err := t.witness.StartCheck( + pending, t.onVerified, t.timeService.GetTimeNow().Add(30*time.Minute)) + if err != nil { + t.log.Error("could not start witness routine", logging.String("id", pending.GetID())) + t.removeHeartbeat(pending.GetID()) + } + return nil +} + +func (t *Tracker) removeHeartbeat(id string) error { + for i, v := range t.pendingHeartbeats { + if v.GetID() == id { + t.pendingHeartbeats = t.pendingHeartbeats[:i+copy(t.pendingHeartbeats[i:], t.pendingHeartbeats[i+1:])] + return nil + } + } + return fmt.Errorf("could not remove heartbeat: %s", id) +} + +func (t *Tracker) onVerified(event interface{}, ok bool) { + pv, isHeartbeat := event.(*pendingHeartbeat) + if !isHeartbeat { + t.log.Errorf("expected pending heartbeat: %T", event) + return + } + + if err := t.removeHeartbeat(pv.GetID()); err != nil { + t.log.Error("could not remove pending heartbeat", logging.Error(err)) + } + + if ok { + t.finalizedHeartbeats = append(t.finalizedHeartbeats, pv) + } +} + +// UpdateContractBlock if an external engine has processed a chain-event for the contract at this address +// then the last-seen block for the contract is updated. +func (t *Tracker) UpdateContractBlock(address, chainID string, height uint64) { + bridge, ok := t.bridges[chainID] + if !ok { + return + } + + lastSeen, ok := bridge.contractAddresses[address] + if !ok || lastSeen < height { + bridge.contractAddresses[address] = height + } +} + +func (t *Tracker) OnTick(ctx context.Context, tt time.Time) { + for _, heartbeat := range t.finalizedHeartbeats { + bridge := t.bridges[heartbeat.chainID] + + lastSeen, ok := bridge.contractAddresses[heartbeat.contractAddress] + if !ok || lastSeen < heartbeat.height { + bridge.contractAddresses[heartbeat.contractAddress] = heartbeat.height + } + } + t.finalizedHeartbeats = nil +} + +func (t *Tracker) serialise() ([]byte, error) { + pending := make([]*snapshotpb.EVMFwdPendingHeartbeat, 0, len(t.pendingHeartbeats)) + for _, p := range t.pendingHeartbeats { + pending = append(pending, + &snapshotpb.EVMFwdPendingHeartbeat{ + BlockHeight: p.height, + BlockTime: p.blockTime, + ContractAddress: p.contractAddress, + ChainId: p.chainID, + }, + ) + } + + lastSeen := make([]*snapshotpb.EVMFwdLastSeen, 0, len(t.bridges)) + + chainIDs := maps.Keys(t.bridges) + sort.Strings(chainIDs) + + for _, cid := range chainIDs { + seenBlocks := t.bridges[cid].contractAddresses + contracts := maps.Keys(t.bridges[cid].contractAddresses) + sort.Strings(contracts) + for _, addr := range contracts { + t.log.Info("serialising last-seen contract block", + logging.String("chain-id", cid), + logging.String("contract-address", addr), + logging.Uint64("height", seenBlocks[addr]), + ) + lastSeen = append(lastSeen, + &snapshotpb.EVMFwdLastSeen{ + ChainId: cid, + ContractAddress: addr, + BlockHeight: seenBlocks[addr], + }, + ) + } + } + + pl := types.Payload{ + Data: &types.PayloadEVMFwdHeartbeats{ + EVMFwdHeartbeats: &snapshotpb.EVMFwdHeartbeats{ + PendingHeartbeats: pending, + LastSeen: lastSeen, + }, + }, + } + + return proto.Marshal(pl.IntoProto()) +} + +func (t *Tracker) restorePendingHeartbeats(_ context.Context, heartbeats []*snapshotpb.EVMFwdPendingHeartbeat) { + t.pendingHeartbeats = make([]*pendingHeartbeat, 0, len(heartbeats)) + + for _, hb := range heartbeats { + bridge, ok := t.bridges[hb.ChainId] + if !ok { + t.log.Panic("cannot restore pending heartbeat, bridge not registered", logging.String("chain-id", hb.ChainId)) + } + + pending := &pendingHeartbeat{ + height: hb.BlockHeight, + blockTime: hb.BlockTime, + chainID: hb.ChainId, + contractAddress: hb.ContractAddress, + check: func(ctx context.Context) error { + return bridge.engine.VerifyHeartbeat(ctx, hb.BlockHeight, hb.ChainId, hb.ContractAddress, hb.BlockTime) + }, + } + + t.pendingHeartbeats = append(t.pendingHeartbeats, pending) + + if err := t.witness.RestoreResource(pending, t.onVerified); err != nil { + t.log.Panic("unable to restore pending heartbeat resource", logging.String("ID", pending.GetID()), logging.Error(err)) + } + } +} + +func (t *Tracker) restoreLastSeen( + _ context.Context, + lastSeen []*snapshotpb.EVMFwdLastSeen, +) { + for _, ls := range lastSeen { + bridge, ok := t.bridges[ls.ChainId] + if !ok { + t.log.Panic("cannot restore last seen block, bridge not registered", logging.String("chain-id", ls.ChainId)) + } + bridge.contractAddresses[ls.ContractAddress] = ls.BlockHeight + t.log.Info("restored last seen block height", + logging.String("chain-id", ls.ChainId), + logging.String("contract-address", ls.ContractAddress), + logging.Uint64("last-seen", ls.BlockHeight), + ) + } +} + +func (t *Tracker) Namespace() types.SnapshotNamespace { + return types.EVMHeartbeatSnapshot +} + +func (t *Tracker) Keys() []string { + return []string{"all"} +} + +func (t *Tracker) Stopped() bool { + return false +} + +func (t *Tracker) GetState(_ string) ([]byte, []types.StateProvider, error) { + data, err := t.serialise() + return data, nil, err +} + +func (t *Tracker) LoadState(ctx context.Context, payload *types.Payload) ([]types.StateProvider, error) { + if t.Namespace() != payload.Data.Namespace() { + return nil, types.ErrInvalidSnapshotNamespace + } + + switch pl := payload.Data.(type) { + case *types.PayloadEVMFwdHeartbeats: + t.restorePendingHeartbeats(ctx, pl.EVMFwdHeartbeats.PendingHeartbeats) + t.restoreLastSeen(ctx, pl.EVMFwdHeartbeats.LastSeen) + return nil, nil + default: + return nil, types.ErrUnknownSnapshotType + } +} + +func (t *Tracker) OnStateLoaded(_ context.Context) error { + for _, bridge := range t.bridges { + for address, lastSeen := range bridge.contractAddresses { + t.log.Info("updating starting block after restore", + logging.String("address", address), + logging.Uint64("last-seen", lastSeen), + ) + bridge.engine.UpdateStartingBlock(address, lastSeen) + } + } + return nil +} diff --git a/core/execution/amm/engine.go b/core/execution/amm/engine.go new file mode 100644 index 00000000000..0e7daba27db --- /dev/null +++ b/core/execution/amm/engine.go @@ -0,0 +1,1022 @@ +// 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 ( + V1 = "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 + +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 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 +} + +func NewSqrter() *Sqrter { + return &Sqrter{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 u.IsZero() { + return num.DecimalZero() + } + + 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. + r := num.UintOne().Sqrt(u) + + // 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 + marketActivityTracker *common.MarketActivityTracker + + collateral Collateral + position Position + parties common.Parties + + marketID string + assetID string + 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 amm-party-ids to the party owning them. + ammParties map[string]string + + minCommitmentQuantum *num.Uint + maxCalculationLevels *num.Uint +} + +func New( + log *logging.Logger, + broker Broker, + collateral Collateral, + marketID string, + assetID string, + position Position, + priceFactor num.Decimal, + positionFactor num.Decimal, + marketActivityTracker *common.MarketActivityTracker, + parties common.Parties, +) *Engine { + return &Engine{ + log: log, + broker: broker, + collateral: collateral, + position: position, + marketID: marketID, + assetID: assetID, + marketActivityTracker: marketActivityTracker, + pools: map[string]*Pool{}, + poolsCpy: []*Pool{}, + ammParties: map[string]string{}, + minCommitmentQuantum: num.UintZero(), + rooter: &Sqrter{cache: map[string]num.Decimal{}}, + priceFactor: priceFactor, + positionFactor: positionFactor, + parties: parties, + } +} + +func NewFromProto( + log *logging.Logger, + broker Broker, + collateral Collateral, + marketID string, + assetID string, + position Position, + state *v1.AmmState, + priceFactor num.Decimal, + positionFactor num.Decimal, + marketActivityTracker *common.MarketActivityTracker, + parties common.Parties, +) (*Engine, error) { + e := New(log, broker, collateral, marketID, assetID, position, priceFactor, positionFactor, marketActivityTracker, parties) + + for _, v := range state.AmmPartyIds { + e.ammParties[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 { + p, err := NewPoolFromProto(log, e.rooter.sqrt, e.collateral, e.position, v.Pool, v.Party, priceFactor) + if err != nil { + return e, err + } + e.add(p) + } + + return e, nil +} + +func (e *Engine) IntoProto() *v1.AmmState { + state := &v1.AmmState{ + Sqrter: make([]*v1.StringMapEntry, 0, len(e.rooter.cache)), + AmmPartyIds: make([]*v1.StringMapEntry, 0, len(e.ammParties)), + 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.ammParties { + state.AmmPartyIds = append(state.AmmPartyIds, &v1.StringMapEntry{ + Key: k, + Value: v, + }) + } + sort.Slice(state.AmmPartyIds, func(i, j int) bool { return state.AmmPartyIds[i].Key < state.AmmPartyIds[j].Key }) + + for _, v := range e.poolsCpy { + state.Pools = append(state.Pools, &v1.PoolMapEntry{ + Party: v.owner, + Pool: v.IntoProto(), + }) + } + return state +} + +func (e *Engine) OnMinCommitmentQuantumUpdate(ctx context.Context, c *num.Uint) { + e.minCommitmentQuantum = c.Clone() +} + +func (e *Engine) OnMaxCalculationLevelsUpdate(ctx context.Context, c *num.Uint) { + e.maxCalculationLevels = c.Clone() + + for _, p := range e.poolsCpy { + p.maxCalculationLevels = e.maxCalculationLevels.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) { + rm := []string{} + 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 + rm = append(rm, p.owner) + } + for _, party := range rm { + e.remove(ctx, 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.marketID)) + + // any pools that for some reason have zero balance in their accounts will get stopped + rm := []string{} + for _, p := range e.poolsCpy { + if p.getBalance().IsZero() { + p.status = types.AMMPoolStatusStopped + rm = append(rm, p.owner) + } + } + for _, party := range rm { + e.remove(ctx, party) + } +} + +// 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.ammParties[c.Party()] + if !ok { + continue + } + p, ok := e.pools[owner] + if !ok { + e.log.Panic("could not find pool for owner, not possible", + logging.String("owner", c.Party()), + logging.String("owner", owner), + ) + } + p.status = types.AMMPoolStatusStopped + e.remove(ctx, owner) + } +} + +// 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 volume != 0 { + 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 volume != 0 { + if bestAsk == nil || ask.LT(bestAsk) { + bestAsk = ask + bestAskVolume = volume + } else if ask.EQ(bestAsk) { + bestAskVolume += volume + } + } + } + return bestBid, bestBidVolume, bestAsk, bestAskVolume +} + +// GetVolumeAtPrice returns the volumes across all registered AMM's that will uncross with with an order at the given price. +// Calling this function with price 1000 and side == sell will return the buy orders that will uncross. +func (e *Engine) GetVolumeAtPrice(price *num.Uint, side types.Side) uint64 { + vol := uint64(0) + for _, pool := range e.poolsCpy { + // get the pool's current price + fp := pool.BestPrice(nil) + volume := pool.TradableVolumeInRange(side, fp, price) + vol += volume + } + return vol +} + +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.GT(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.LT(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 + } + + // calculate the price the pool wil give for the trading volume + price := p.PriceForVolume(volume, agg.Side) + + if e.log.IsDebug() { + e.log.Debug("generated order at price", + logging.String("price", price.String()), + logging.Uint64("volume", volume), + logging.String("id", p.ID), + logging.String("side", types.OtherSide(agg.Side).String()), + ) + } + + // construct an order + o := p.makeOrder(volume, price, types.OtherSide(agg.Side), e.idgen) + + // fill in extra details + o.CreatedAt = agg.CreatedAt + + 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 + } + + // stop early trying to trade with itself, can happens during auction uncrossing + if agg.Party == p.AMMParty { + 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() + } +} + +// Create takes the definition of an AMM and returns it. It is not considered a participating AMM until Confirm as been called with it. +func (e *Engine) Create( + ctx context.Context, + submit *types.SubmitAMM, + deterministicID string, + riskFactors *types.RiskFactor, + scalingFactors *types.ScalingFactors, + slippage num.Decimal, +) (*Pool, error) { + idgen := idgeneration.New(deterministicID) + poolID := idgen.NextID() + + subAccount := DeriveAMMParty(submit.Party, submit.MarketID, V1, 0) + _, ok := e.pools[submit.Party] + if ok { + e.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, e.marketID, subAccount, poolID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMStatusReasonPartyAlreadyOwnsAPool, + submit.ProposedFee, nil, nil, + ), + ) + + return nil, ErrPartyAlreadyOwnAPool(e.marketID) + } + + if err := e.ensureCommitmentAmount(ctx, submit.Party, subAccount, submit.CommitmentAmount); err != nil { + reason := types.AMMStatusReasonCannotFillCommitment + if err == ErrCommitmentTooLow { + reason = types.AMMStatusReasonCommitmentTooLow + } + e.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, e.marketID, subAccount, poolID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, reason, + submit.ProposedFee, nil, nil, + ), + ) + return nil, err + } + + _, _, err := e.collateral.CreatePartyAMMsSubAccounts(ctx, submit.Party, subAccount, e.assetID, submit.MarketID) + if err != nil { + e.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, e.marketID, subAccount, poolID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMStatusReasonUnspecified, + submit.ProposedFee, nil, nil, + ), + ) + + return nil, err + } + + pool, err := NewPool( + e.log, + poolID, + subAccount, + e.assetID, + submit, + e.rooter.sqrt, + e.collateral, + e.position, + riskFactors, + scalingFactors, + slippage, + e.priceFactor, + e.positionFactor, + e.maxCalculationLevels, + ) + if err != nil { + e.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, e.marketID, subAccount, poolID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMStatusReasonCommitmentTooLow, + submit.ProposedFee, nil, nil, + ), + ) + + return nil, err + } + + e.log.Debug("AMM created", + logging.String("owner", submit.Party), + logging.String("poolID", pool.ID), + logging.String("marketID", e.marketID), + ) + return pool, nil +} + +// Confirm takes an AMM that was created earlier and now commits it to the engine as a functioning pool. +func (e *Engine) Confirm( + ctx context.Context, + pool *Pool, +) { + e.log.Debug("AMM confirmed", + logging.String("owner", pool.owner), + logging.String("marketID", e.marketID), + logging.String("poolID", pool.ID), + ) + + pool.status = types.AMMPoolStatusActive + pool.maxCalculationLevels = e.maxCalculationLevels + + e.add(pool) + e.sendUpdate(ctx, pool) + e.parties.AssignDeriveKey(ctx, types.PartyID(pool.owner), pool.AMMParty) +} + +// Amend takes the details of an amendment to an AMM and returns a copy of that pool with the updated curves along with the current pool. +// The changes are not taken place in the AMM engine until Confirm is called on the updated pool. +func (e *Engine) Amend( + ctx context.Context, + amend *types.AmendAMM, + riskFactors *types.RiskFactor, + scalingFactors *types.ScalingFactors, + slippage num.Decimal, +) (*Pool, *Pool, error) { + pool, ok := e.pools[amend.Party] + if !ok { + return nil, nil, ErrNoPoolMatchingParty + } + + if amend.CommitmentAmount != nil { + if err := e.ensureCommitmentAmount(ctx, amend.Party, pool.AMMParty, amend.CommitmentAmount); err != nil { + return nil, nil, err + } + } + + updated, err := pool.Update(amend, riskFactors, scalingFactors, slippage) + if err != nil { + return nil, nil, err + } + + // we need to remove the existing pool from the engine so that when calculating rebasing orders we do not + // trade with ourselves. + e.remove(ctx, amend.Party) + + e.log.Debug("AMM amended", + logging.String("owner", amend.Party), + logging.String("marketID", e.marketID), + logging.String("poolID", pool.ID), + ) + return updated, pool, 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.AMMCancellationMethodReduceOnly { + // 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) + e.log.Debug("AMM cancelled", + logging.String("owner", cancel.Party), + logging.String("poolID", pool.ID), + logging.String("marketID", e.marketID), + ) + return closeout, nil +} + +func (e *Engine) StopPool( + ctx context.Context, + key string, +) error { + party, ok := e.ammParties[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.sendUpdate(ctx, p) + e.marketActivityTracker.RemoveAMMParty(e.assetID, e.marketID, p.AMMParty) + } + return nil +} + +func (e *Engine) sendUpdate(ctx context.Context, pool *Pool) { + e.broker.Send( + events.NewAMMPoolEvent( + ctx, pool.owner, e.marketID, pool.AMMParty, pool.ID, + pool.Commitment, pool.Parameters, + pool.status, types.AMMStatusReasonUnspecified, + pool.ProposedFee, + &events.AMMCurve{ + VirtualLiquidity: pool.lower.l, + TheoreticalPosition: pool.lower.pv, + }, + &events.AMMCurve{ + VirtualLiquidity: pool.upper.l, + TheoreticalPosition: pool.upper.pv, + }, + ), + ) +} + +func (e *Engine) ensureCommitmentAmount( + _ context.Context, + party string, + subAccount string, + commitmentAmount *num.Uint, +) error { + quantum, _ := e.collateral.GetAssetQuantum(e.assetID) + quantumCommitment := commitmentAmount.ToDecimal().Div(quantum) + + if quantumCommitment.LessThan(e.minCommitmentQuantum.ToDecimal()) { + return ErrCommitmentTooLow + } + + total := num.UintZero() + + // check they have enough in their accounts, sub-margin + sub-general + general >= commitment + if a, err := e.collateral.GetPartyMarginAccount(e.marketID, subAccount, e.assetID); err == nil { + total.Add(total, a.Balance) + } + + if a, err := e.collateral.GetPartyGeneralAccount(subAccount, e.assetID); err == nil { + total.Add(total, a.Balance) + } + + if a, err := e.collateral.GetPartyGeneralAccount(party, e.assetID); err == nil { + total.Add(total, a.Balance) + } + + if total.LT(commitmentAmount) { + return fmt.Errorf("not enough collateral in general account") + } + + 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.owner, pool.AMMParty, 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.AMMParty); 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.AMMParty) + } + + ledgerMovements, closeout, err := e.collateral.SubAccountRelease(ctx, pool.owner, pool.AMMParty, 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, +) (*num.Uint, error) { + // first we get the current balance of both the margin, and general subAccount + subMargin, err := e.collateral.GetPartyMarginAccount( + e.marketID, subAccount, e.assetID) + 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.assetID) + 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.TransferTypeAMMLow + actualAmount.Sub(newCommitment, currentCommitment) + } else if currentCommitment.GT(newCommitment) { + transferType = types.TransferTypeAMMHigh + actualAmount.Sub(currentCommitment, newCommitment) + } else { + // nothing to do + return currentCommitment, nil + } + + ledgerMovements, err := e.collateral.SubAccountUpdate( + ctx, party, subAccount, e.assetID, + e.marketID, transferType, actualAmount, + ) + if err != nil { + return nil, err + } + + e.broker.Send(events.NewLedgerMovements( + ctx, []*types.LedgerMovement{ledgerMovements})) + + return currentCommitment, nil +} + +// OrderbookShape expands all registered AMM's into orders between the given prices. If `ammParty` is supplied then just the pool +// with that party id is expanded. +func (e *Engine) OrderbookShape(st, nd *num.Uint, ammParty *string) ([]*types.Order, []*types.Order) { + if ammParty == nil { + // no party give, expand all registered + buys, sells := []*types.Order{}, []*types.Order{} + for _, p := range e.poolsCpy { + b, s := p.OrderbookShape(st, nd, e.idgen) + buys = append(buys, b...) + sells = append(sells, s...) + } + return buys, sells + } + + // asked to expand just one AMM, lets find it, first amm-party -> owning party + owner, ok := e.ammParties[*ammParty] + if !ok { + return nil, nil + } + + // now owning party -> pool + p, ok := e.pools[owner] + if !ok { + return nil, nil + } + + // expand it + return p.OrderbookShape(st, nd, e.idgen) +} + +func (e *Engine) GetAMMPoolsBySubAccount() map[string]common.AMMPool { + ret := make(map[string]common.AMMPool, len(e.pools)) + for _, v := range e.pools { + ret[v.AMMParty] = v + } + return ret +} + +func (e *Engine) GetAllSubAccounts() []string { + ret := make([]string, 0, len(e.ammParties)) + for _, subAccount := range e.ammParties { + ret = append(ret, subAccount) + } + return ret +} + +// GetAMMParty returns the AMM's key given the owners key. +func (e *Engine) GetAMMParty(party string) (string, error) { + if p, ok := e.pools[party]; ok { + return p.AMMParty, nil + } + return "", ErrNoPoolMatchingParty +} + +// IsAMMPartyID returns whether the given key is the key of AMM registered with the engine. +func (e *Engine) IsAMMPartyID(key string) bool { + _, yes := e.ammParties[key] + return yes +} + +func (e *Engine) add(p *Pool) { + e.pools[p.owner] = p + e.poolsCpy = append(e.poolsCpy, p) + e.ammParties[p.AMMParty] = p.owner + e.marketActivityTracker.AddAMMSubAccount(e.assetID, e.marketID, p.AMMParty) +} + +func (e *Engine) remove(ctx context.Context, party string) { + for i := range e.poolsCpy { + if e.poolsCpy[i].owner == party { + e.poolsCpy = append(e.poolsCpy[:i], e.poolsCpy[i+1:]...) + break + } + } + + pool := e.pools[party] + delete(e.pools, party) + delete(e.ammParties, pool.AMMParty) + e.sendUpdate(ctx, pool) + e.marketActivityTracker.RemoveAMMParty(e.assetID, e.marketID, pool.AMMParty) +} + +func DeriveAMMParty( + 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..a2f0095d3d2 --- /dev/null +++ b/core/execution/amm/engine_test.go @@ -0,0 +1,771 @@ +// 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" +) + +var ( + riskFactors = &types.RiskFactor{Market: "", Short: num.DecimalOne(), Long: num.DecimalOne()} + scalingFactors = &types.ScalingFactors{InitialMargin: num.DecimalOne()} + slippage = num.DecimalOne() +) + +func TestSubmitAMM(t *testing.T) { + t.Run("test one pool per party", testOnePoolPerParty) +} + +func TestAMMTrading(t *testing.T) { + t.Run("test basic submit order", testBasicSubmitOrder) + t.Run("test submit order at best price", testSubmitOrderAtBestPrice) + 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 sparse amend", testAmendAMMSparse) + t.Run("test amend AMM insufficient commitment", testAmendInsufficientCommitment) +} + +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) + whenAMMIsSubmitted(t, tst, submit) + + // when the party submits another, it is rejected + _, err := tst.engine.Create(ctx, submit, vgcrypto.RandomHash(), riskFactors, scalingFactors, slippage) + require.ErrorContains(t, err, "party already own a pool for market") +} + +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.Amend(ctx, amend, riskFactors, scalingFactors, slippage) + require.ErrorIs(t, err, ErrNoPoolMatchingParty) +} + +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) + whenAMMIsSubmitted(t, tst, submit) + + amend := getPoolAmendment(t, party, tst.marketID) + // no amend to the commitment amount + amend.CommitmentAmount = nil + // no amend to the margin factors either + amend.Parameters.LeverageAtLowerBound = nil + amend.Parameters.LeverageAtUpperBound = 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()) + + updated, _, err := tst.engine.Amend(ctx, amend, riskFactors, scalingFactors, slippage) + require.NoError(t, err) + + tst.engine.Confirm(ctx, updated) +} + +func testAmendInsufficientCommitment(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) + whenAMMIsSubmitted(t, tst, submit) + + poolID := tst.engine.poolsCpy[0].ID + + amend := getPoolAmendment(t, party, tst.marketID) + // no amend to the commitment amount + amend.CommitmentAmount = nil + + // amend to super wide bounds so that the commitment is too thin to support the AMM + amend.Parameters.Base.AddSum(num.UintOne()) + amend.Parameters.UpperBound.AddSum(num.NewUint(1000000)) + amend.Parameters.LowerBound.AddSum(num.UintOne()) + + _, _, err := tst.engine.Amend(ctx, amend, riskFactors, scalingFactors, slippage) + require.ErrorContains(t, err, "insufficient commitment") + + // check that the original pool still exists + assert.Equal(t, poolID, tst.engine.poolsCpy[0].ID) +} + +func testBasicSubmitOrder(t *testing.T) { + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + whenAMMIsSubmitted(t, tst, submit) + + // now submit an order against it + agg := &types.Order{ + Size: 1000000, + Remaining: 1000000, + Side: types.SideBuy, + Price: num.NewUint(2100), + Type: types.OrderTypeLimit, + } + + 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, 236855, int(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), + } + + // fair-price is now 2020 + bb, _, ba, _ := tst.engine.BestPricesAndVolumes() + assert.Equal(t, "2019", bb.String()) + assert.Equal(t, "2021", ba.String()) + + orders = tst.engine.SubmitOrder(agg, num.NewUint(2020), num.NewUint(1990)) + require.Len(t, orders, 1) + assert.Equal(t, "2004", 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, 362325, int(orders[0].Size)) +} + +func testSubmitOrderAtBestPrice(t *testing.T) { + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + whenAMMIsSubmitted(t, tst, submit) + + // AMM has fair-price of 2000 so is willing to sell at 2001, send an incoming buy order at 2001 + agg := &types.Order{ + Size: 1000000, + Remaining: 1000000, + Side: types.SideBuy, + Price: num.NewUint(2001), + Type: types.OrderTypeLimit, + } + + ensurePosition(t, tst.pos, 0, num.NewUint(0)) + orders := tst.engine.SubmitOrder(agg, num.NewUint(2000), num.NewUint(2001)) + require.Len(t, orders, 1) + assert.Equal(t, "2000", orders[0].Price.String()) + assert.Equal(t, 11927, int(orders[0].Size)) + + bb, _, ba, _ := tst.engine.BestPricesAndVolumes() + assert.Equal(t, "2002", ba.String()) + assert.Equal(t, "2000", bb.String()) + + // now trade back with a price of 2000 + agg = &types.Order{ + Size: 1000000, + Remaining: 1000000, + Side: types.SideSell, + Price: num.NewUint(2000), + Type: types.OrderTypeLimit, + } + orders = tst.engine.SubmitOrder(agg, num.NewUint(2001), num.NewUint(2000)) + require.Len(t, orders, 1) + assert.Equal(t, "2000", orders[0].Price.String()) + assert.Equal(t, 11927, int(orders[0].Size)) +} + +func testSubmitMarketOrder(t *testing.T) { + tst := getTestEngine(t) + + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + whenAMMIsSubmitted(t, tst, submit) + + // 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, "1994", orders[0].Price.String()) + assert.Equal(t, 126420, int(orders[0].Size)) +} + +func testSubmitOrderProRata(t *testing.T) { + 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) + whenAMMIsSubmitted(t, tst, submit) + } + + 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) { + 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) + whenAMMIsSubmitted(t, tst, submit) + } + + 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) { + 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) + whenAMMIsSubmitted(t, tst, submit) + } + + 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, "1949", orders[0].Price.String()) + assert.Equal(t, "1949", orders[1].Price.String()) + assert.Equal(t, "1949", orders[2].Price.String()) + + // second round, 2 orders moving all pool's to the upper boundary of the second shortest + assert.Equal(t, "1874", orders[3].Price.String()) + assert.Equal(t, "1874", orders[4].Price.String()) + + // third round, 1 orders moving the last pool to its boundary + assert.Equal(t, "1824", orders[5].Price.String()) +} + +func testBestPricesAndVolume(t *testing.T) { + 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) + whenAMMIsSubmitted(t, tst, submit) + } + + tst.pos.EXPECT().GetPositionsByParty(gomock.Any()).AnyTimes().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, 37512, int(bvolume)) + assert.Equal(t, 35781, int(avolume)) + + // test GetVolumeAtPrice returns the same volume given best bid/ask + bvAt := tst.engine.GetVolumeAtPrice(bid, types.SideSell) + assert.Equal(t, bvolume, bvAt) + avAt := tst.engine.GetVolumeAtPrice(ask, types.SideBuy) + assert.Equal(t, avolume, avAt) +} + +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) + whenAMMIsSubmitted(t, tst, submit) + + // 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.AMMCancellationMethodReduceOnly) + 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) + whenAMMIsSubmitted(t, tst, submit) + + // 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.AMMCancellationMethodImmediate) + 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) + whenAMMIsSubmitted(t, tst, submit) + + // pool position is non-zero so it''l hang around + ensurePosition(t, tst.pos, 12, num.UintZero()) + cancel := getCancelSubmission(t, party, tst.marketID, types.AMMCancellationMethodReduceOnly) + 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()) + + amend := getPoolAmendment(t, party, tst.marketID) + expectBalanceChecks(t, tst, party, subAccount, amend.CommitmentAmount.Uint64()) + + updated, _, err := tst.engine.Amend(ctx, amend, riskFactors, scalingFactors, slippage) + require.NoError(t, err) + tst.engine.Confirm(ctx, updated) + + // 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) + whenAMMIsSubmitted(t, tst, submit) + + // pool position is non-zero so it''l hang around + ensurePosition(t, tst.pos, 12, num.UintZero()) + cancel := getCancelSubmission(t, party, tst.marketID, types.AMMCancellationMethodReduceOnly) + 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) + whenAMMIsSubmitted(t, tst, submit) + + // 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) + whenAMMIsSubmitted(t, tst, submit) + 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) + + for i := 0; i < 10; i++ { + party, subAccount := getParty(t, tst) + submit := getPoolSubmission(t, party, tst.marketID) + + expectSubaccountCreation(t, tst, party, subAccount) + whenAMMIsSubmitted(t, tst, submit) + expectSubAccountClose(t, tst, party, subAccount) + } + + require.NoError(t, tst.engine.MarketClosing(ctx)) + for _, p := range tst.engine.poolsCpy { + assert.Equal(t, types.AMMPoolStatusStopped, p.status) + } +} + +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) +} + +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 expectBalanceChecks(t *testing.T, tst *tstEngine, party, subAccount string, total uint64) { + t.Helper() + tst.col.EXPECT().GetPartyMarginAccount(tst.marketID, subAccount, tst.assetID).Times(1).Return(getAccount(0), nil) + tst.col.EXPECT().GetPartyGeneralAccount(subAccount, tst.assetID).Times(1).Return(getAccount(0), nil) + tst.col.EXPECT().GetPartyGeneralAccount(party, tst.assetID).Times(1).Return(getAccount(total), nil) +} + +func whenAMMIsSubmitted(t *testing.T, tst *tstEngine, submission *types.SubmitAMM) { + t.Helper() + + party := submission.Party + subAccount := DeriveAMMParty(party, tst.marketID, "AMMv1", 0) + expectBalanceChecks(t, tst, party, subAccount, submission.CommitmentAmount.Uint64()) + + ctx := context.Background() + pool, err := tst.engine.Create(ctx, submission, vgcrypto.RandomHash(), riskFactors, scalingFactors, slippage) + require.NoError(t, err) + tst.engine.Confirm(ctx, pool) +} + +func getParty(t *testing.T, tst *tstEngine) (string, string) { + t.Helper() + + party := vgcrypto.RandomHash() + subAccount := DeriveAMMParty(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), + LeverageAtLowerBound: ptr.From(num.DecimalOne()), + LeverageAtUpperBound: 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), + LeverageAtLowerBound: ptr.From(num.DecimalOne()), + LeverageAtUpperBound: ptr.From(num.DecimalOne()), + }, + } +} + +func getCancelSubmission(t *testing.T, party, market string, method types.AMMCancellationMethod) *types.CancelAMM { + t.Helper() + return &types.CancelAMM{ + MarketID: market, + Party: party, + Method: method, + } +} + +type tstEngine struct { + engine *Engine + broker *bmocks.MockBroker + col *mocks.MockCollateral + pos *mocks.MockPosition + parties *cmocks.MockParties + 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) + broker := bmocks.NewMockBroker(ctrl) + + marketID := vgcrypto.RandomHash() + assetID := vgcrypto.RandomHash() + + broker.EXPECT().Send(gomock.Any()).AnyTimes() + col.EXPECT().GetAssetQuantum(assetID).AnyTimes().Return(num.DecimalOne(), nil) + + teams := cmocks.NewMockTeams(ctrl) + balanceChecker := cmocks.NewMockAccountBalanceChecker(ctrl) + + mat := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) + + parties := cmocks.NewMockParties(ctrl) + parties.EXPECT().AssignDeriveKey(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + + eng := New(logging.NewTestLogger(), broker, col, marketID, assetID, pos, num.DecimalOne(), num.DecimalOne(), mat, parties) + + // 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, + col: col, + pos: pos, + ctrl: ctrl, + parties: parties, + 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/estimator.go b/core/execution/amm/estimator.go new file mode 100644 index 00000000000..453a01aba89 --- /dev/null +++ b/core/execution/amm/estimator.go @@ -0,0 +1,125 @@ +// 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/libs/num" +) + +type EstimatedBounds struct { + PositionSizeAtUpper num.Decimal + PositionSizeAtLower num.Decimal + LossOnCommitmentAtUpper num.Decimal + LossOnCommitmentAtLower num.Decimal + LiquidationPriceAtUpper num.Decimal + LiquidationPriceAtLower num.Decimal +} + +func EstimateBounds( + sqrter *Sqrter, + lowerPrice, basePrice, upperPrice *num.Uint, + leverageLower, leverageUpper num.Decimal, + balance *num.Uint, + linearSlippageFactor, initialMargin, + riskFactorShort, riskFactorLong num.Decimal, +) EstimatedBounds { + r := EstimatedBounds{} + + balanceD := balance.ToDecimal() + if lowerPrice != nil { + unitLower := LiquidityUnit(sqrter, basePrice, lowerPrice) + avgEntryLower := AverageEntryPrice(sqrter, unitLower, basePrice) + riskFactorLower := RiskFactor(leverageLower, riskFactorLong, linearSlippageFactor, initialMargin) + lowerPriceD := lowerPrice.ToDecimal() + boundPosLower := PositionAtLowerBound(riskFactorLower, balanceD, lowerPriceD, avgEntryLower) + lossLower := LossOnCommitment(avgEntryLower, lowerPriceD, boundPosLower) + liquidationPriceAtLower := LiquidationPrice(balanceD, lossLower, boundPosLower, lowerPriceD, linearSlippageFactor, riskFactorLong) + + r.PositionSizeAtLower = boundPosLower.Truncate(5) + r.LiquidationPriceAtLower = liquidationPriceAtLower.Truncate(5) + r.LossOnCommitmentAtLower = lossLower.Truncate(5) + } + + if upperPrice != nil { + unitUpper := LiquidityUnit(sqrter, upperPrice, basePrice) + avgEntryUpper := AverageEntryPrice(sqrter, unitUpper, upperPrice) + riskFactorUpper := RiskFactor(leverageUpper, riskFactorShort, linearSlippageFactor, initialMargin) + upperPriceD := upperPrice.ToDecimal() + boundPosUpper := PositionAtUpperBound(riskFactorUpper, balanceD, upperPriceD, avgEntryUpper) + lossUpper := LossOnCommitment(avgEntryUpper, upperPriceD, boundPosUpper) + liquidationPriceAtUpper := LiquidationPrice(balanceD, lossUpper, boundPosUpper, upperPriceD, linearSlippageFactor, riskFactorShort) + + r.PositionSizeAtUpper = boundPosUpper.Truncate(5) + r.LiquidationPriceAtUpper = liquidationPriceAtUpper.Truncate(5) + r.LossOnCommitmentAtUpper = lossUpper.Truncate(5) + } + + return r +} + +// Lu = (sqrt(pu) * sqrt(pl)) / (sqrt(pu) - sqrt(pl)). +func LiquidityUnit(sqrter *Sqrter, pu, pl *num.Uint) num.Decimal { + sqrtPu := sqrter.sqrt(pu) + sqrtPl := sqrter.sqrt(pl) + + return sqrtPu.Mul(sqrtPl).Div(sqrtPu.Sub(sqrtPl)) +} + +// Rf = min(Lb, 1 / (Fs + Fl) * Fi). +func RiskFactor(lb, fs, fl, fi num.Decimal) num.Decimal { + b := num.DecimalOne().Div(fs.Add(fl).Mul(fi)) + return num.MinD(lb, b) +} + +// Pa = Lu * sqrt(pu) * (1 - (Lu / (Lu + sqrt(pu)))). +func AverageEntryPrice(sqrter *Sqrter, lu num.Decimal, pu *num.Uint) num.Decimal { + sqrtPu := sqrter.sqrt(pu) + // (1 - Lu / (Lu + sqrt(pu))) + oneSubLuDivLuWithUpSquared := num.DecimalOne().Sub(lu.Div(lu.Add(sqrtPu))) + return lu.Mul(sqrtPu).Mul(oneSubLuDivLuWithUpSquared) +} + +// Pvl = rf * b / (pl * (1 - rf) + rf * pa). +func PositionAtLowerBound(rf, b, pl, pa num.Decimal) num.Decimal { + oneSubRf := num.DecimalOne().Sub(rf) + rfMulPa := rf.Mul(pa) + + return rf.Mul(b).Div( + pl.Mul(oneSubRf).Add(rfMulPa), + ) +} + +// Pvl = -rf * b / (pl * (1 + rf) - rf * pa). +func PositionAtUpperBound(rf, b, pl, pa num.Decimal) num.Decimal { + onePlusRf := num.DecimalOne().Add(rf) + rfMulPa := rf.Mul(pa) + + return rf.Neg().Mul(b).Div( + pl.Mul(onePlusRf).Sub(rfMulPa), + ) +} + +// lc = |pa - pb * pB|. +func LossOnCommitment(pa, pb, pB num.Decimal) num.Decimal { + return pa.Sub(pb).Mul(pB).Abs() +} + +// Pliq = (b - lc - Pb * pb) / (|Pb| * (fl + mr) - Pb). +func LiquidationPrice(b, lc, pB, pb, fl, mr num.Decimal) num.Decimal { + return b.Sub(lc).Sub(pB.Mul(pb)).Div( + pB.Abs().Mul(fl.Add(mr)).Sub(pB), + ) +} diff --git a/core/execution/amm/estimator_test.go b/core/execution/amm/estimator_test.go new file mode 100644 index 00000000000..0ad4f869caf --- /dev/null +++ b/core/execution/amm/estimator_test.go @@ -0,0 +1,167 @@ +// 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/libs/num" + + "github.com/stretchr/testify/assert" +) + +func TestEstimateSeparateFunctions(t *testing.T) { + balance := num.NewUint(100) + lowerPrice := num.NewUint(900) + basePrice := num.NewUint(1000) + upperPrice := num.NewUint(1300) + leverageAtUpper := num.NewDecimalFromFloat(1.00) + leverageAtLower := num.NewDecimalFromFloat(5.00) + sqrter := NewSqrter() + + shortRiskFactor := num.NewDecimalFromFloat(0.01) + longRiskFactor := num.NewDecimalFromFloat(0.01) + linearSlippage := num.NewDecimalFromFloat(0.05) + initialMargin := num.DecimalOne() + + // test liquidity unit + unitLower := LiquidityUnit(sqrter, basePrice, lowerPrice) + unitUpper := LiquidityUnit(sqrter, upperPrice, basePrice) + + assert.Equal(t, num.DecimalFromFloat(584.6049894).String(), unitLower.Round(7).String()) + assert.Equal(t, num.DecimalFromFloat(257.2170745).String(), unitUpper.Round(7).String()) + + // test average entry price + avgEntryLower := AverageEntryPrice(sqrter, unitLower, basePrice) + avgEntryUpper := AverageEntryPrice(sqrter, unitUpper, upperPrice) + assert.Equal(t, num.DecimalFromFloat(948.683).String(), avgEntryLower.Round(3).String()) + assert.Equal(t, num.DecimalFromFloat(1140.175).String(), avgEntryUpper.Round(3).String()) + + // test risk factor + riskFactorLower := RiskFactor(leverageAtLower, longRiskFactor, linearSlippage, initialMargin) + riskFactorUpper := RiskFactor(leverageAtUpper, shortRiskFactor, linearSlippage, initialMargin) + assert.Equal(t, leverageAtLower.String(), riskFactorLower.String()) + assert.Equal(t, leverageAtUpper.String(), riskFactorUpper.String()) + + lowerPriceD := lowerPrice.ToDecimal() + upperPriceD := upperPrice.ToDecimal() + + // test position at bounds + lowerBoundPos := PositionAtLowerBound(riskFactorLower, balance.ToDecimal(), lowerPriceD, avgEntryLower) + upperBoundPos := PositionAtUpperBound(riskFactorUpper, balance.ToDecimal(), upperPriceD, avgEntryUpper) + assert.Equal(t, num.DecimalFromFloat(0.437).String(), lowerBoundPos.Round(3).String()) + assert.Equal(t, num.DecimalFromFloat(-0.069).String(), upperBoundPos.Round(3).String()) + + // test loss on commitment + lossAtLower := LossOnCommitment(avgEntryLower, lowerPriceD, lowerBoundPos) + lossAtUpper := LossOnCommitment(avgEntryUpper, upperPriceD, upperBoundPos) + assert.Equal(t, num.DecimalFromFloat(21.28852368).String(), lossAtLower.Round(8).String()) + assert.Equal(t, num.DecimalFromFloat(10.94820416).String(), lossAtUpper.Round(8).String()) + + linearSlippageFactor := num.DecimalZero() + + // test liquidation price + liquidationPriceAtLower := LiquidationPrice(balance.ToDecimal(), lossAtLower, lowerBoundPos, lowerPriceD, linearSlippageFactor, longRiskFactor) + liquidationPriceAtUpper := LiquidationPrice(balance.ToDecimal(), lossAtUpper, upperBoundPos, upperPriceD, linearSlippageFactor, shortRiskFactor) + assert.Equal(t, num.DecimalFromFloat(727.2727273).String(), liquidationPriceAtLower.Round(7).String()) + assert.Equal(t, num.DecimalFromFloat(2574.257426).String(), liquidationPriceAtUpper.Round(6).String()) +} + +func TestEstimate(t *testing.T) { + initialMargin := num.DecimalFromFloat(1) + riskFactorShort := num.DecimalFromFloat(0.01) + riskFactorLong := num.DecimalFromFloat(0.01) + linearSlippageFactor := num.DecimalFromFloat(0) + sqrter := NewSqrter() + + t.Run("test 0014-NP-VAMM-001", func(t *testing.T) { + lowerPrice := num.NewUint(900) + basePrice := num.NewUint(1000) + upperPrice := num.NewUint(1100) + leverageUpper := num.DecimalFromFloat(2.00) + leverageLower := num.DecimalFromFloat(2.00) + balance := num.NewUint(100) + + expectedMetrics := EstimatedBounds{ + PositionSizeAtUpper: num.DecimalFromFloat(-0.166), + PositionSizeAtLower: num.DecimalFromFloat(0.201), + LossOnCommitmentAtUpper: num.DecimalFromFloat(8.515), + LossOnCommitmentAtLower: num.DecimalFromFloat(9.762), + LiquidationPriceAtUpper: num.DecimalFromFloat(1633.663), + LiquidationPriceAtLower: num.DecimalFromFloat(454.545), + } + + metrics := EstimateBounds( + sqrter, + lowerPrice, + basePrice, + upperPrice, + leverageLower, + leverageUpper, + balance, + linearSlippageFactor, + initialMargin, + riskFactorShort, + riskFactorLong, + ) + + assert.Equal(t, expectedMetrics.PositionSizeAtUpper.String(), metrics.PositionSizeAtUpper.Round(3).String()) + assert.Equal(t, expectedMetrics.PositionSizeAtLower.String(), metrics.PositionSizeAtLower.Round(3).String()) + assert.Equal(t, expectedMetrics.LossOnCommitmentAtUpper.String(), metrics.LossOnCommitmentAtUpper.Round(3).String()) + assert.Equal(t, expectedMetrics.LossOnCommitmentAtLower.String(), metrics.LossOnCommitmentAtLower.Round(3).String()) + assert.Equal(t, expectedMetrics.LiquidationPriceAtUpper.String(), metrics.LiquidationPriceAtUpper.Round(3).String()) + assert.Equal(t, expectedMetrics.LiquidationPriceAtLower.String(), metrics.LiquidationPriceAtLower.Round(3).String()) + }) + + t.Run("test 0014-NP-VAMM-004", func(t *testing.T) { + lowerPrice := num.NewUint(900) + basePrice := num.NewUint(1000) + upperPrice := num.NewUint(1300) + leverageUpper := num.DecimalFromFloat(1) + leverageLower := num.DecimalFromFloat(5) + balance := num.NewUint(100) + + expectedMetrics := EstimatedBounds{ + PositionSizeAtUpper: num.DecimalFromFloat(-0.069), + PositionSizeAtLower: num.DecimalFromFloat(0.437), + LossOnCommitmentAtUpper: num.DecimalFromFloat(10.948), + LossOnCommitmentAtLower: num.DecimalFromFloat(21.289), + LiquidationPriceAtUpper: num.DecimalFromFloat(2574.257), + LiquidationPriceAtLower: num.DecimalFromFloat(727.273), + } + + metrics := EstimateBounds( + sqrter, + lowerPrice, + basePrice, + upperPrice, + leverageLower, + leverageUpper, + balance, + linearSlippageFactor, + initialMargin, + riskFactorShort, + riskFactorLong, + ) + + assert.Equal(t, expectedMetrics.PositionSizeAtUpper.String(), metrics.PositionSizeAtUpper.Round(3).String()) + assert.Equal(t, expectedMetrics.PositionSizeAtLower.String(), metrics.PositionSizeAtLower.Round(3).String()) + assert.Equal(t, expectedMetrics.LossOnCommitmentAtUpper.String(), metrics.LossOnCommitmentAtUpper.Round(3).String()) + assert.Equal(t, expectedMetrics.LossOnCommitmentAtLower.String(), metrics.LossOnCommitmentAtLower.Round(3).String()) + assert.Equal(t, expectedMetrics.LiquidationPriceAtUpper.String(), metrics.LiquidationPriceAtUpper.Round(3).String()) + assert.Equal(t, expectedMetrics.LiquidationPriceAtLower.String(), metrics.LiquidationPriceAtLower.Round(3).String()) + }) +} diff --git a/core/execution/amm/mocks/mocks.go b/core/execution/amm/mocks/mocks.go new file mode 100644 index 00000000000..4df3c2c5add --- /dev/null +++ b/core/execution/amm/mocks/mocks.go @@ -0,0 +1,188 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: code.vegaprotocol.io/vega/core/execution/amm (interfaces: Collateral,Position) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + events "code.vegaprotocol.io/vega/core/events" + 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...) +} diff --git a/core/execution/amm/pool.go b/core/execution/amm/pool.go new file mode 100644 index 00000000000..fb2f130b95c --- /dev/null +++ b/core/execution/amm/pool.go @@ -0,0 +1,865 @@ +// 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 ( + "fmt" + + "code.vegaprotocol.io/vega/core/idgeneration" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/logging" + 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 +} + +type curve struct { + l num.Decimal // 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 + empty bool // if true the curve is of zero length and represents no liquidity on this side of the amm + isLower bool // whether the curve is for the lower curve or the upper curve + + // the theoretical position of the curve at its lower boundary + // note that this equals Vega's position at the boundary only in the lower curve, since Vega position == curve-position + // in the upper curve Vega's position == 0 => position of `pv`` in curve-position, Vega's position pv => 0 in curve-position + pv num.Decimal +} + +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 + } + + stP := impliedPosition(sqrt(st), sqrt(c.high), c.l) + ndP := impliedPosition(sqrt(nd), sqrt(c.high), c.l) + + // abs(P(st) - P(nd)) + volume := stP.Sub(ndP).Abs() + return uint64(volume.IntPart()) +} + +// positionAtPrice returns the position of the AMM if its fair-price were the given price. This +// will be signed for long/short as usual. +func (c *curve) positionAtPrice(sqrt sqrtFn, price *num.Uint) int64 { + pos := impliedPosition(sqrt(price), sqrt(c.high), c.l) + if c.isLower { + return pos.IntPart() + } + + // if we are in the upper curve the position of 0 in "curve-space" is -cu.pv in Vega position + // so we need to flip the interval + return -c.pv.Sub(pos).IntPart() +} + +type Pool struct { + log *logging.Logger + ID string + AMMParty string + Commitment *num.Uint + ProposedFee num.Decimal + Parameters *types.ConcentratedLiquidityParameters + + asset string + market string + owner 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 + + maxCalculationLevels *num.Uint // maximum number of price levels the AMM will be expanded into + oneTick *num.Uint // one price tick +} + +func NewPool( + log *logging.Logger, + id, + ammParty, + 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, + maxCalculationLevels *num.Uint, +) (*Pool, error) { + oneTick, _ := num.UintFromDecimal(num.DecimalOne().Mul(priceFactor)) + pool := &Pool{ + log: log, + ID: id, + AMMParty: ammParty, + Commitment: submit.CommitmentAmount, + ProposedFee: submit.ProposedFee, + Parameters: submit.Parameters, + market: submit.MarketID, + owner: submit.Party, + asset: asset, + sqrt: sqrt, + collateral: collateral, + position: position, + priceFactor: priceFactor, + positionFactor: positionFactor, + oneTick: oneTick, + status: types.AMMPoolStatusActive, + maxCalculationLevels: maxCalculationLevels, + } + err := pool.setCurves(rf, sf, linearSlippage) + if err != nil { + return nil, err + } + return pool, nil +} + +func NewPoolFromProto( + log *logging.Logger, + sqrt sqrtFn, + collateral Collateral, + position Position, + state *snapshotpb.PoolMapEntry_Pool, + party string, + priceFactor num.Decimal, +) (*Pool, error) { + oneTick, _ := num.UintFromDecimal(num.DecimalOne().Mul(priceFactor)) + + var lowerLeverage, upperLeverage *num.Decimal + if state.Parameters.LeverageAtLowerBound != nil { + l, err := num.DecimalFromString(*state.Parameters.LeverageAtLowerBound) + if err != nil { + return nil, err + } + lowerLeverage = &l + } + if state.Parameters.LeverageAtUpperBound != nil { + l, err := num.DecimalFromString(*state.Parameters.LeverageAtUpperBound) + if err != nil { + return nil, err + } + upperLeverage = &l + } + + base, overflow := num.UintFromString(state.Parameters.Base, 10) + if overflow { + return nil, fmt.Errorf("failed to convert string to Uint: %s", state.Parameters.Base) + } + + var lower, upper *num.Uint + if state.Parameters.LowerBound != nil { + lower, overflow = num.UintFromString(*state.Parameters.LowerBound, 10) + if overflow { + return nil, fmt.Errorf("failed to convert string to Uint: %s", *state.Parameters.LowerBound) + } + } + + if state.Parameters.UpperBound != nil { + upper, overflow = num.UintFromString(*state.Parameters.UpperBound, 10) + if overflow { + return nil, fmt.Errorf("failed to convert string to Uint: %s", *state.Parameters.UpperBound) + } + } + + upperCu, err := NewCurveFromProto(state.Upper) + if err != nil { + return nil, err + } + + lowerCu, err := NewCurveFromProto(state.Lower) + lowerCu.isLower = true + if err != nil { + return nil, err + } + + proposedFee, err := num.DecimalFromString(state.ProposedFee) + if err != nil { + return nil, err + } + + return &Pool{ + log: log, + ID: state.Id, + AMMParty: state.AmmPartyId, + Commitment: num.MustUintFromString(state.Commitment, 10), + ProposedFee: proposedFee, + Parameters: &types.ConcentratedLiquidityParameters{ + Base: base, + LowerBound: lower, + UpperBound: upper, + LeverageAtLowerBound: lowerLeverage, + LeverageAtUpperBound: upperLeverage, + }, + owner: party, + market: state.Market, + asset: state.Asset, + sqrt: sqrt, + collateral: collateral, + position: position, + lower: lowerCu, + upper: upperCu, + priceFactor: priceFactor, + oneTick: oneTick, + status: state.Status, + }, nil +} + +func NewCurveFromProto(c *snapshotpb.PoolMapEntry_Curve) (*curve, error) { + l, err := num.DecimalFromString(c.L) + if err != nil { + return nil, err + } + + pv, err := num.DecimalFromString(c.Pv) + if err != nil { + return nil, err + } + + high, overflow := num.UintFromString(c.High, 10) + if overflow { + return nil, fmt.Errorf("failed to convert string to Uint: %s", c.High) + } + + low, overflow := num.UintFromString(c.Low, 10) + if overflow { + return nil, fmt.Errorf("failed to convert string to Uint: %s", c.Low) + } + return &curve{ + l: l, + high: high, + low: low, + empty: c.Empty, + pv: pv, + }, nil +} + +func (p *Pool) IntoProto() *snapshotpb.PoolMapEntry_Pool { + return &snapshotpb.PoolMapEntry_Pool{ + Id: p.ID, + AmmPartyId: p.AMMParty, + Commitment: p.Commitment.String(), + ProposedFee: p.ProposedFee.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(), + Empty: p.lower.empty, + Pv: p.lower.pv.String(), + }, + Upper: &snapshotpb.PoolMapEntry_Curve{ + L: p.upper.l.String(), + High: p.upper.high.String(), + Low: p.upper.low.String(), + Empty: p.upper.empty, + Pv: p.upper.pv.String(), + }, + Status: p.status, + } +} + +// Update returns a copy of the give pool but with its curves and parameters update as specified by `amend`. +func (p *Pool) Update( + amend *types.AmendAMM, + rf *types.RiskFactor, + sf *types.ScalingFactors, + linearSlippage num.Decimal, +) (*Pool, error) { + commitment := p.Commitment.Clone() + if amend.CommitmentAmount != nil { + commitment = amend.CommitmentAmount + } + + proposedFee := p.ProposedFee + if amend.ProposedFee.IsPositive() { + proposedFee = amend.ProposedFee + } + + // parameters cannot only be updated all at once or not at all + parameters := p.Parameters.Clone() + if amend.Parameters != nil { + parameters = amend.Parameters + } + + updated := &Pool{ + log: p.log, + ID: p.ID, + AMMParty: p.AMMParty, + Commitment: commitment, + ProposedFee: proposedFee, + Parameters: parameters, + asset: p.asset, + market: p.market, + owner: p.owner, + collateral: p.collateral, + position: p.position, + priceFactor: p.priceFactor, + positionFactor: p.positionFactor, + status: types.AMMPoolStatusActive, + sqrt: p.sqrt, + oneTick: p.oneTick, + maxCalculationLevels: p.maxCalculationLevels, + } + if err := updated.setCurves(rf, sf, linearSlippage); err != nil { + return nil, err + } + return updated, nil +} + +// emptyCurve creates the curve details that represent no liquidity. +func emptyCurve( + base *num.Uint, +) *curve { + return &curve{ + l: num.DecimalZero(), + pv: 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, + riskFactor, + marginFactor, + linearSlippage num.Decimal, + leverageAtBound *num.Decimal, + positionFactor num.Decimal, + isLower bool, +) *curve { + // rf = 1 / ( mf * ( risk-factor + slippage ) ) + rf := num.DecimalOne().Div(marginFactor.Mul(riskFactor.Add(linearSlippage))) + if leverageAtBound != nil { + // rf = min(rf, leverage) + rf = num.MinD(rf, *leverageAtBound) + } + + // we now need to calculate the virtual-liquidity L of the curve from the + // input parameters: leverage (rf), lower bound price (pl), upper bound price (pu) + // we first calculate the unit-virtual-liquidity: + // Lu = sqrt(pu) * sqrt(pl) / sqrt(pu) - sqrt(pl) + + // sqrt(high) * sqrt(low) + term1 := sqrt(high).Mul(sqrt(low)) + + // sqrt(high) - sqrt(low) + term2 := sqrt(high).Sub(sqrt(low)) + lu := term1.Div(term2) + + // now we calculate average-entry price if we were to trade the entire curve + // pa := lu * pu * (1 - (lu / lu + pu)) + + // (1 - (lu / lu + pu)) + denom := num.DecimalOne().Sub(lu.Div(lu.Add(sqrt(high)))) + + // lu * pu / denom + pa := denom.Mul(lu).Mul(sqrt(high)) + + // and now we calculate the theoretical position `pv` which is the total tradeable volume of the curve. + var pv num.Decimal + if isLower { + // pv := rf * cc / ( pl(1 - rf) + rf * pa ) + + // pl * (1 - rf) + denom := low.ToDecimal().Mul(num.DecimalOne().Sub(rf)) + + // ( pl(1 - rf) + rf * pa ) + denom = denom.Add(pa.Mul(rf)) + + // pv := rf * cc / ( pl(1 - rf) + rf * pa ) + pv = commitment.ToDecimal().Mul(rf).Div(denom) + } else { + // pv := rf * cc / ( pu(1 + rf) - rf * pa ) + + // pu * (1 + rf) + denom := high.ToDecimal().Mul(num.DecimalOne().Add(rf)) + + // ( pu(1 + rf) - rf * pa ) + denom = denom.Sub(pa.Mul(rf)) + + // pv := rf * cc / ( pu(1 + rf) - rf * pa ) + pv = commitment.ToDecimal().Mul(rf).Div(denom).Abs() + } + + // now we scale theoretical position by position factor so that is it feeds through into all subsequent equations + pv = pv.Mul(positionFactor) + + // and finally calculate L = pv * Lu + return &curve{ + l: pv.Mul(lu), + low: low, + high: high, + pv: pv, + isLower: isLower, + } +} + +func (p *Pool) setCurves( + rfs *types.RiskFactor, + sfs *types.ScalingFactors, + linearSlippage num.Decimal, +) error { + // 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, + rfs.Long, + sfs.InitialMargin, + linearSlippage, + p.Parameters.LeverageAtLowerBound, + p.positionFactor, + true, + ) + + highPriceMinusOne := num.UintZero().Sub(p.lower.high, p.oneTick) + // verify that the lower curve maintains sufficient volume from highPrice - 1 to the end of the curve. + if p.lower.volumeBetweenPrices(p.sqrt, highPriceMinusOne, p.lower.high) < 1 { + return fmt.Errorf("insufficient commitment - less than one volume at price levels on lower curve") + } + } + + 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, + rfs.Short, + sfs.InitialMargin, + linearSlippage, + p.Parameters.LeverageAtUpperBound, + p.positionFactor, + false, + ) + + highPriceMinusOne := num.UintZero().Sub(p.upper.high, p.oneTick) + // verify that the upper curve maintains sufficient volume from highPrice - 1 to the end of the curve. + if p.upper.volumeBetweenPrices(p.sqrt, highPriceMinusOne, p.upper.high) < 1 { + return fmt.Errorf("insufficient commitment - less than one volume at price levels on upper curve") + } + } + + return nil +} + +// 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.Decimal) num.Decimal { + // L * (sqrt(high) - sqrt(price)) + numer := sqrtHigh.Sub(sqrtPrice).Mul(l) + + // sqrt(high) * sqrt(price) + denom := sqrtHigh.Mul(sqrtPrice) + + // L * (sqrt(high) - sqrt(price)) / sqrt(high) * sqrt(price) + return numer.Div(denom) +} + +// PriceForVolume returns the price the AMM is willing to trade at to match with the given volume of an incoming order. +func (p *Pool) PriceForVolume(volume uint64, side types.Side) *num.Uint { + return p.priceForVolumeAtPosition( + volume, + side, + p.getPosition(), + p.fairPrice(), + ) +} + +// priceForVolumeAtPosition returns the price the AMM is willing to trade at to match with the given volume if its position and fair-price +// are as given. +func (p *Pool) priceForVolumeAtPosition(volume uint64, side types.Side, pos int64, fp *num.Uint) *num.Uint { + if volume == 0 { + panic("cannot calculate price for zero volume trade") + } + + x, y := p.virtualBalances(pos, fp, side) + + // 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 + dx := num.DecimalFromInt64(int64(volume)) + if side == types.SideSell { + // if incoming order is a sell, the AMM is buying so reducing cash balance so dx is negative + dx = dx.Neg() + } + + dy := x.Mul(y).Div(x.Sub(dx)).Sub(y) + + // dy / dx + price, overflow := num.UintFromDecimal(dy.Div(dx).Abs()) + if overflow { + panic("calculated negative price") + } + return price +} + +// 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 + } + + fp := p.fairPrice() + if side == types.SideSell { + // want all buy volume so everything below fair price + nd = num.Min(fp, nd) + } + + if side == types.SideBuy { + // want all sell volume so everything above fair price + st = num.Max(fp, 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.AMMParty, p.asset) + if err != nil { + panic("general account not created") + } + + margin, err := p.collateral.GetPartyMarginAccount(p.market, p.AMMParty, 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, + } + + if pos := p.position.GetPositionsByParty(p.AMMParty); len(pos) != 0 { + p.eph.size = pos[0].Size() + } +} + +// updateEphemeralPosition sets the pools transient position given a generated order. +func (p *Pool) updateEphemeralPosition(order *types.Order) { + if order.Side == types.SideSell { + p.eph.size -= int64(order.Size) + return + } + 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 { + if p.eph != nil { + return p.eph.size + } + + if pos := p.position.GetPositionsByParty(p.AMMParty); len(pos) != 0 { + return pos[0].Size() + } + return 0 +} + +// fairPrice returns the fair price of the pool given its current position. + +// sqrt(pf) = sqrt(pu) / (1 + pv * sqrt(pu) * 1/L ) +// where pv is the virtual-position +// pv = pos, when the pool is long +// pv = pos + Pv, when pool is short +// +// this transformation is needed since for each curve its virtual position is 0 at the lower bound which maps to the Vega position when the pool is +// long, but when the pool is short Vega position == 0 at the upper bounds and -ve at the lower. +func (p *Pool) fairPrice() *num.Uint { + pos := p.getPosition() + if pos == 0 { + // if no position fair price is base price + return p.lower.high.Clone() + } + + cu := p.lower + pv := num.DecimalFromInt64(pos) + if pos < 0 { + cu = p.upper + // pos + pv + pv = cu.pv.Add(pv) + } + + if cu.empty { + panic("should not be calculating fair-price on empty-curve side") + } + + l := cu.l + + // pv * sqrt(pu) * (1/L) + 1 + denom := pv.Mul(p.sqrt(cu.high)).Div(l).Add(num.DecimalOne()) + + // sqrt(fp) = sqrt(pu) / denom + sqrtPf := p.sqrt(cu.high).Div(denom) + + // fair-price = sqrt(fp) * sqrt(fp) + fp := sqrtPf.Mul(sqrtPf) + + // 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. + if pos < 0 { + fp = fp.Ceil() + } + + fairPrice, _ := num.UintFromDecimal(fp) + return fairPrice +} + +// virtualBalancesShort returns the pools x, y balances when the pool has a negative position +// +// x = P + Pv + L / sqrt(pl) +// y = L * sqrt(fair-price). +func (p *Pool) virtualBalancesShort(pos int64, fp *num.Uint) (num.Decimal, num.Decimal) { + cu := p.upper + if cu.empty { + panic("should not be calculating balances on empty-curve side") + } + + // lets start with x + + // P + term1x := num.DecimalFromInt64(pos) + + // Pv + term2x := cu.pv + + // L / sqrt(pl) + term3x := cu.l.Div(p.sqrt(cu.high)) + + // x = P + (cc * rf / pu) + (L / sqrt(pl)) + x := term2x.Add(term3x).Add(term1x) + + // now lets get y + + // y = L * sqrt(fair-price) + y := cu.l.Mul(p.sqrt(fp)) + return x, y +} + +// virtualBalancesLong returns the pools x, y balances when the pool has a positive position +// +// x = P + (L / sqrt(pu)) +// y = L * sqrt(fair-price). +func (p *Pool) virtualBalancesLong(pos int64, fp *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.Div(p.sqrt(cu.high)) + + // x = P + (L / sqrt(pu)) + x := term1x.Add(term2x) + + // now lets move to y + + // y = L * sqrt(fair-price) + y := cu.l.Mul(p.sqrt(fp)) + return x, y +} + +// 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, fp *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, fp) + case pos > 0, pos == 0 && side == types.SideSell: + // zero position but incoming is sell which will make pool long + return p.virtualBalancesLong(pos, fp) + 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) Owner() string { + return p.owner +} + +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 +} + +func (p *Pool) makeOrder(volume uint64, price *num.Uint, side types.Side, idgen *idgeneration.IDGenerator) *types.Order { + order := &types.Order{ + MarketID: p.market, + Party: p.AMMParty, + Size: volume, + Remaining: volume, + Price: price, + Side: side, + TimeInForce: types.OrderTimeInForceGTC, + Type: types.OrderTypeLimit, + Status: types.OrderStatusFilled, + Reference: "vamm-" + p.AMMParty, + GeneratedOffbook: true, + } + order.OriginalPrice, _ = num.UintFromDecimal(order.Price.ToDecimal().Div(p.priceFactor)) + + if idgen != nil { + order.ID = idgen.NextID() + } + return order +} diff --git a/core/execution/amm/pool_test.go b/core/execution/amm/pool_test.go new file mode 100644 index 00000000000..9dcc80a62cd --- /dev/null +++ b/core/execution/amm/pool_test.go @@ -0,0 +1,615 @@ +// 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 ( + "strconv" + "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" + "code.vegaprotocol.io/vega/logging" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestAMMPool(t *testing.T) { + t.Run("test volume between prices", testTradeableVolumeInRange) + t.Run("test best price", testBestPrice) + t.Run("test pool logic with position factor", testPoolPositionFactor) + t.Run("test one sided pool", testOneSidedPool) + t.Run("test near zero volume curve triggers and error", testNearZeroCurveErrors) +} + +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: 635, + }, + { + name: "full volume upper curve with bound creep", + price1: num.NewUint(1500), + price2: num.NewUint(3500), + side: types.SideBuy, + expectedVolume: 635, + }, + { + name: "full volume lower curve", + price1: num.NewUint(1800), + price2: num.NewUint(2000), + side: types.SideSell, + expectedVolume: 702, + }, + { + name: "full volume lower curve with bound creep", + price1: num.NewUint(500), + price2: num.NewUint(2500), + side: types.SideSell, + expectedVolume: 702, + }, + { + name: "buy trade causes sign to flip and full volume crosses curves", + price1: num.NewUint(500), + price2: num.NewUint(3500), + side: types.SideBuy, + expectedVolume: 1337, + position: 700, // position at full lower boundary, incoming is by so whole volume of both curves is available + }, + { + name: "sell trade causes sign to flip and full volume crosses curves", + price1: num.NewUint(500), + price2: num.NewUint(3500), + side: types.SideSell, + expectedVolume: 1337, + position: -700, // position at full upper boundary, incoming is by so whole volume of both curves is available + }, + { + name: "buy trade causes sign to flip and partial volume across both curves", + price1: num.NewUint(500), + price2: num.NewUint(3500), + side: types.SideBuy, + expectedVolume: 986, + position: 350, + }, + { + name: "sell trade causes sign to flip and partial volume across both curves", + price1: num.NewUint(500), + price2: num.NewUint(3500), + side: types.SideSell, + expectedVolume: 1053, + position: -350, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ensurePositionN(t, p.pos, tt.position, num.UintZero(), 2) + volume := p.pool.TradableVolumeInRange(tt.side, tt.price1, tt.price2) + assert.Equal(t, int(tt.expectedVolume), int(volume)) + }) + } +} + +func TestTradeableVolumeWhenAtBoundary(t *testing.T) { + // from ticket 11389 this replicates a scenario found during fuzz testing + submit := &types.SubmitAMM{ + AMMBaseCommand: types.AMMBaseCommand{ + Party: vgcrypto.RandomHash(), + MarketID: vgcrypto.RandomHash(), + SlippageTolerance: num.DecimalFromFloat(0.1), + }, + CommitmentAmount: num.MustUintFromString("2478383748073213000000", 10), + Parameters: &types.ConcentratedLiquidityParameters{ + Base: num.NewUint(676540), + LowerBound: num.NewUint(671272), + UpperBound: nil, + LeverageAtLowerBound: ptr.From(num.DecimalFromFloat(39.1988064541227)), + LeverageAtUpperBound: nil, + }, + } + + p := newTestPoolWithSubmission(t, + num.DecimalFromInt64(1000), + num.DecimalFromFloat(10000000000000000), + submit, + ) + defer p.ctrl.Finish() + + // when position is zero fair-price should be the base + ensurePositionN(t, p.pos, 0, num.UintZero(), 3) + fp := p.pool.BestPrice(nil) + assert.Equal(t, "6765400000000000000000", fp.String()) + + fullLong := 12546 + + // volume from base -> low is 12546, but in reality it is 12546.4537027400278, but we can only trade int volume. + volume := p.pool.TradableVolumeInRange(types.SideSell, num.MustUintFromString("6712720000000000000000", 10), num.MustUintFromString("6765400000000000000000", 10)) + assert.Equal(t, fullLong, int(volume)) + + // now lets pretend the AMM has fully traded out in that direction, best price will be near but not quite the lower bound + ensurePositionN(t, p.pos, int64(fullLong), num.UintZero(), 3) + fp = p.pool.BestPrice(nil) + assert.Equal(t, "6712721893865935337785", fp.String()) + assert.True(t, fp.GTE(num.MustUintFromString("6712720000000000000000", 10))) + + // now the fair-price is not *quite* on the lower boundary but the volume between it at the lower bound should be 0. + volume = p.pool.TradableVolumeInRange(types.SideSell, num.MustUintFromString("6712720000000000000000", 10), fp) + assert.Equal(t, 0, int(volume)) +} + +func testPoolPositionFactor(t *testing.T) { + p := newTestPoolWithPositionFactor(t, num.DecimalFromInt64(1000)) + defer p.ctrl.Finish() + + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + volume := p.pool.TradableVolumeInRange(types.SideBuy, num.NewUint(2000), num.NewUint(2200)) + // with position factot of 1 the volume is 635 + assert.Equal(t, int(635395), int(volume)) + + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + volume = p.pool.TradableVolumeInRange(types.SideSell, num.NewUint(1800), num.NewUint(2000)) + // with position factot of 1 the volume is 702 + assert.Equal(t, int(702411), int(volume)) + + ensurePositionN(t, p.pos, -1, num.NewUint(2000), 1) + // 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, "2001", fairPrice.String()) +} + +func testBestPrice(t *testing.T) { + p := newTestPool(t) + defer p.ctrl.Finish() + + tests := []struct { + name string + position int64 + balance uint64 + expectedPrice string + order *types.Order + }{ + { + name: "best price is base price when position is zero", + expectedPrice: "2000", + }, + { + name: "best price positive position", + expectedPrice: "1999", + position: 1, + balance: 100000, + }, + + { + name: "fair price negative position", + expectedPrice: "2001", + position: -1, + balance: 100000, + }, + { + name: "best price incoming buy", + expectedPrice: "2000", + position: 1, + balance: 100000, + order: &types.Order{ + Side: types.SideBuy, + Size: 1, + }, + }, + { + name: "best price incoming buy", + expectedPrice: "1998", + position: 1, + balance: 100000, + 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, num.UintZero()) + fairPrice := p.pool.BestPrice(order) + assert.Equal(t, tt.expectedPrice, fairPrice.String()) + }) + } +} + +func testOneSidedPool(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 + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + volume := p.pool.TradableVolumeInRange(types.SideBuy, num.NewUint(2000), num.NewUint(2200)) + assert.Equal(t, int(635), int(volume)) + + // empty side returns no volume + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + 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 + ensurePositionN(t, p.pos, -10, num.UintZero(), 2) + volume = p.pool.TradableVolumeInRange(types.SideSell, num.NewUint(1800), num.NewUint(2200)) + assert.Equal(t, int(10), 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, "2000", price.String()) + + // fair price at short position is still ok + ensurePosition(t, p.pos, -10, num.UintZero()) + price = p.pool.BestPrice(nil) + assert.Equal(t, "2003", price.String()) + + // 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 testNearZeroCurveErrors(t *testing.T) { + baseCmd := types.AMMBaseCommand{ + Party: vgcrypto.RandomHash(), + MarketID: vgcrypto.RandomHash(), + SlippageTolerance: num.DecimalFromFloat(0.1), + } + + submit := &types.SubmitAMM{ + AMMBaseCommand: baseCmd, + CommitmentAmount: num.NewUint(1000), + Parameters: &types.ConcentratedLiquidityParameters{ + Base: num.NewUint(1900), + LowerBound: num.NewUint(1800), + UpperBound: num.NewUint(2000), + LeverageAtLowerBound: ptr.From(num.DecimalFromFloat(50)), + LeverageAtUpperBound: ptr.From(num.DecimalFromFloat(50)), + }, + } + // test that creating a pool with a near zero volume curve will error + pool, err := newBasicPoolWithSubmit(t, submit) + assert.Nil(t, pool) + assert.ErrorContains(t, err, "insufficient commitment - less than one volume at price levels on lower curve") + + // test that a pool with higher commitment amount will not error + submit.CommitmentAmount = num.NewUint(100000) + pool, err = newBasicPoolWithSubmit(t, submit) + assert.NotNil(t, pool) + assert.NoError(t, err) + + // test that amending a pool to a near zero volume curve will error + amend := &types.AmendAMM{ + AMMBaseCommand: baseCmd, + CommitmentAmount: num.NewUint(100), + } + + _, err = pool.Update( + amend, + &types.RiskFactor{Short: num.DecimalFromFloat(0.02), Long: num.DecimalFromFloat(0.02)}, + &types.ScalingFactors{InitialMargin: num.DecimalFromFloat(1.25)}, + num.DecimalZero(), + ) + assert.ErrorContains(t, err, "insufficient commitment - less than one volume at price levels on lower curve") + + amend.CommitmentAmount = num.NewUint(1000000) + _, err = pool.Update( + amend, + &types.RiskFactor{Short: num.DecimalFromFloat(0.02), Long: num.DecimalFromFloat(0.02)}, + &types.ScalingFactors{InitialMargin: num.DecimalFromFloat(1.25)}, + num.DecimalZero(), + ) + assert.NoError(t, err) +} + +func assertOrderPrices(t *testing.T, orders []*types.Order, side types.Side, st, nd int) { + t.Helper() + require.Equal(t, nd-st+1, len(orders)) + for i, o := range orders { + price := st + i + assert.Equal(t, side, o.Side) + assert.Equal(t, strconv.FormatInt(int64(price), 10), o.Price.String()) + } +} + +func newBasicPoolWithSubmit(t *testing.T, submit *types.SubmitAMM) (*Pool, error) { + t.Helper() + ctrl := gomock.NewController(t) + col := mocks.NewMockCollateral(ctrl) + pos := mocks.NewMockPosition(ctrl) + + sqrter := &Sqrter{cache: map[string]num.Decimal{}} + + return NewPool( + logging.NewTestLogger(), + 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(), + num.DecimalOne(), + num.NewUint(10000), + ) +} + +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) + + ensurePositionN(t, p.pos, pos, num.UintZero(), 2) + volume := p.pool.TradableVolumeInRange(types.SideSell, base, low) + assert.Equal(t, int(702), int(volume)) + + ensurePositionN(t, p.pos, pos, num.UintZero(), 2) + volume = p.pool.TradableVolumeInRange(types.SideBuy, up, base) + assert.Equal(t, int(635), int(volume)) + + lowmid := num.NewUint(1900) + upmid := num.NewUint(2100) + + ensurePositionN(t, p.pos, pos, num.UintZero(), 2) + volume = p.pool.TradableVolumeInRange(types.SideSell, low, lowmid) + assert.Equal(t, int(365), int(volume)) + + ensurePositionN(t, p.pos, pos, num.UintZero(), 2) + volume = p.pool.TradableVolumeInRange(types.SideBuy, upmid, up) + assert.Equal(t, int(306), int(volume)) + + ensurePosition(t, p.pos, -500, upmid.Clone()) + fairPrice := p.pool.BestPrice(nil) + assert.Equal(t, "2155", fairPrice.String()) + + ensurePosition(t, p.pos, 500, lowmid.Clone()) + fairPrice = p.pool.BestPrice(nil) + assert.Equal(t, "1854", fairPrice.String()) + + // fair price is 2000 and the AMM quotes a best-buy at 1999 so incoming SELL should have a price <= 1999 + ensurePositionN(t, p.pos, 0, lowmid.Clone(), 2) + price := p.pool.PriceForVolume(100, types.SideSell) + assert.Equal(t, "1984", price.String()) + + // fair price is 2000 and the AMM quotes a best-buy at 2001 so incoming BUY should have a price >= 2001 + ensurePositionN(t, p.pos, 0, lowmid.Clone(), 2) + price = p.pool.PriceForVolume(100, types.SideBuy) + assert.Equal(t, "2014", price.String()) +} + +type tstPool struct { + pool *Pool + col *mocks.MockCollateral + pos *mocks.MockPosition + ctrl *gomock.Controller + submission *types.SubmitAMM +} + +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, + LeverageAtLowerBound: ptr.From(num.DecimalFromFloat(50)), + LeverageAtUpperBound: ptr.From(num.DecimalFromFloat(50)), + }, + } + + pool, err := NewPool( + logging.NewTestLogger(), + 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, + num.NewUint(100000), + ) + assert.NoError(t, err) + + return &tstPool{ + submission: submit, + pool: pool, + col: col, + pos: pos, + ctrl: ctrl, + } +} + +func newTestPoolWithSubmission(t *testing.T, positionFactor, priceFactor num.Decimal, submit *types.SubmitAMM) *tstPool { + t.Helper() + ctrl := gomock.NewController(t) + col := mocks.NewMockCollateral(ctrl) + pos := mocks.NewMockPosition(ctrl) + + sqrter := &Sqrter{cache: map[string]num.Decimal{}} + + pool, err := NewPool( + logging.NewTestLogger(), + vgcrypto.RandomHash(), + vgcrypto.RandomHash(), + vgcrypto.RandomHash(), + submit, + sqrter.sqrt, + col, + pos, + &types.RiskFactor{ + Short: num.DecimalFromFloat(0.009937604878885509), + Long: num.DecimalFromFloat(0.00984363574304481), + }, + &types.ScalingFactors{ + InitialMargin: num.DecimalFromFloat(1.5), // this is 1/0.8 which is margin_usage_at_bound_above in the note-book + }, + num.DecimalFromFloat(0.001), + priceFactor, + positionFactor, + num.NewUint(1000), + ) + assert.NoError(t, err) + + return &tstPool{ + submission: submit, + 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/amm/shape.go b/core/execution/amm/shape.go new file mode 100644 index 00000000000..de8c6070944 --- /dev/null +++ b/core/execution/amm/shape.go @@ -0,0 +1,383 @@ +// 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/idgeneration" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/logging" +) + +type shapeMaker struct { + log *logging.Logger + idgen *idgeneration.IDGenerator + + pool *Pool // the AMM we are expanding into orders + pos int64 // the AMM's current position + fairPrice *num.Uint // the AMM's fair-price + + step *num.Uint // price step we will be taking as we walk over the curves + approx bool // whether we are taking approximate steps + oneTick *num.Uint // one price level tick which may be bigger than one given the markets price factor + + buys []*types.Order // buy orders are added here as we calculate them + sells []*types.Order // sell orders are added here as we calculate them + side types.Side // the side the *next* calculated order will be on + + from *num.Uint // the adjusted start region i.e the input region capped to the AMM's bounds + to *num.Uint // the adjusted end region +} + +func newShapeMaker(log *logging.Logger, p *Pool, from, to *num.Uint, idgen *idgeneration.IDGenerator) *shapeMaker { + buys := make([]*types.Order, 0, p.maxCalculationLevels.Uint64()) + sells := make([]*types.Order, 0, p.maxCalculationLevels.Uint64()) + + return &shapeMaker{ + log: log, + pool: p, + pos: p.getPosition(), + fairPrice: p.fairPrice(), + buys: buys, + sells: sells, + from: from.Clone(), + to: to.Clone(), + side: types.SideBuy, + oneTick: p.oneTick.Clone(), + idgen: idgen, + } +} + +// addOrder creates an order with the given details and adds it to the relevant slice based on its side. +func (e *shapeMaker) addOrder(volume uint64, price *num.Uint, side types.Side) { + if e.log.IsDebug() { + e.log.Debug("creating shape order", + logging.String("price", price.String()), + logging.String("side", side.String()), + logging.Uint64("volume", volume), + logging.String("amm-party", e.pool.AMMParty), + ) + } + + e.appendOrder(e.pool.makeOrder(volume, price, side, e.idgen)) +} + +// appendOrder takes the concrete order and appends it to the relevant slice based on its side. +func (sm *shapeMaker) appendOrder(o *types.Order) { + if o.Side == types.SideBuy { + sm.buys = append(sm.buys, o) + return + } + sm.sells = append(sm.sells, o) +} + +// makeBoundaryOrder creates an accurrate order for the given one-tick interval which will exist at the edges +// of the adjusted expansion region. +func (sm *shapeMaker) makeBoundaryOrder(st, nd *num.Uint) *types.Order { + // lets do the starting boundary order + cu := sm.pool.lower + if st.GTE(sm.pool.lower.high) { + cu = sm.pool.upper + } + + volume := num.DeltaV( + cu.positionAtPrice(sm.pool.sqrt, st), + cu.positionAtPrice(sm.pool.sqrt, nd), + ) + + if st.GTE(sm.fairPrice) { + return sm.pool.makeOrder(uint64(volume), nd, types.SideSell, sm.idgen) + } + + return sm.pool.makeOrder(uint64(volume), st, types.SideBuy, sm.idgen) +} + +// calculateBoundaryOrders returns two orders which represent the edges of the adjust expansion region. +func (sm *shapeMaker) calculateBoundaryOrders() (*types.Order, *types.Order) { + // we need to make sure that the orders at the boundary are the region are always accurate and not approximated + // by that we mean that if the adjusted expansion region is [p1, p2] then we *always* have an order with price p1 + // and always have an order with price p2. + // + // The reason for this is that if we are in an auction and have a crossed-region of [p1, p2] and we don't ensure + // we have orders *at* p1 and p2 then we create an inconsistency between the orderbook asking an AMM for its best bid/ask + // and the orders it produces it that region. + // + // The two situations where we can miss boundary orders are: + // - the expansion region is too large and we have to limit calculations and approximate orders + // - the expansion region isn't divisible by `oneTick` and so we have to merge a sub-tick step in with the previous + + st := sm.from.Clone() + nd := sm.to.Clone() + + sm.from.Add(st, sm.oneTick) + sm.to.Sub(nd, sm.oneTick) + + if sm.from.GTE(sm.fairPrice) { + sm.side = types.SideSell + } + + bnd1 := sm.makeBoundaryOrder(st, sm.from) + + if sm.log.IsDebug() { + sm.log.Debug("creating boundary order", + logging.String("price", bnd1.Price.String()), + logging.String("side", bnd1.Side.String()), + logging.Uint64("volume", bnd1.Size), + logging.String("pool-party", sm.pool.AMMParty), + ) + } + + bnd2 := sm.makeBoundaryOrder(sm.to, nd) + + if sm.log.IsDebug() { + sm.log.Debug("creating boundary order", + logging.String("price", bnd2.Price.String()), + logging.String("side", bnd2.Side.String()), + logging.Uint64("volume", bnd2.Size), + logging.String("pool-party", sm.pool.AMMParty), + ) + } + + return bnd1, bnd2 +} + +// calculateStepSize looks at the size of the expansion region and increases the step size if it is too large. +func (sm *shapeMaker) calculateStepSize() { + delta, _ := num.UintZero().Delta(sm.from, sm.to) + delta.Div(delta, sm.oneTick) + sm.step = sm.oneTick.Clone() + + // if taking steps of one-tick doesn't breach the max-calculation levels then we can happily expand accurately + if delta.LTE(sm.pool.maxCalculationLevels) { + return + } + + // if the expansion region is too wide, we need to approximate with bigger steps + sm.step.Div(delta, sm.pool.maxCalculationLevels) + sm.step.AddSum(num.UintOne()) // if delta / maxcals = 1.9 we're going to want steps of 2 + sm.step.Mul(sm.step, sm.oneTick) + sm.approx = true + + if sm.log.IsDebug() { + sm.log.Debug("approximating orderbook expansion", + logging.String("step", sm.step.String()), + logging.String("pool-party", sm.pool.AMMParty), + ) + } +} + +// priceForStep returns a tradable order price for the volume between two price levels. +func (sm *shapeMaker) priceForStep(price1, price2 *num.Uint, pos1, pos2 int64, volume uint64) *num.Uint { + if sm.side == types.SideBuy { + if !sm.approx { + return price1 + } + return sm.pool.priceForVolumeAtPosition(volume, types.OtherSide(sm.side), pos2, price2) + } + + if !sm.approx { + return price2 + } + + return sm.pool.priceForVolumeAtPosition(volume, types.OtherSide(sm.side), pos1, price1) +} + +// expandCurve walks along the given AMM curve between from -> to creating orders at each step. +func (sm *shapeMaker) expandCurve(cu *curve, from, to *num.Uint) { + if sm.log.IsDebug() { + sm.log.Debug("expanding pool curve", + logging.Bool("lower-curve", cu.isLower), + logging.String("low", cu.low.String()), + logging.String("high", cu.high.String()), + logging.String("from", sm.from.String()), + logging.String("to", sm.to.String()), + ) + } + + if cu.empty { + return + } + + from = num.Max(from, cu.low) + to = num.Min(to, cu.high) + + // the price we have currently stepped to and the position of the AMM at that price + current := from + position := cu.positionAtPrice(sm.pool.sqrt, current) + + fairPrice := sm.fairPrice + + for current.LT(to) && current.LT(cu.high) { + // take the next step + next := num.UintZero().AddSum(current, sm.step) + + if sm.log.IsDebug() { + sm.log.Debug("step taken", + logging.String("current", current.String()), + logging.String("next", next.String()), + ) + } + + if num.UintZero().AddSum(next, sm.oneTick).GT(to) { + // we step from current -> next, but if next is less that one-tick from the end + // we will merge this into one bigger step so that we don't have a less-than one price level step + next = to.Clone() + if sm.log.IsDebug() { + sm.log.Debug("increasing step size to prevent sub-tick price-level", + logging.String("current", current.String()), + logging.String("next-snapped", next.String()), + ) + } + } + + if sm.side == types.SideBuy && next.GT(fairPrice) && current.NEQ(fairPrice) { + if sm.log.IsDebug() { + sm.log.Debug("stepping over fair-price, splitting step", + logging.String("fair-price", fairPrice.String()), + ) + } + + if volume := uint64(num.DeltaV(position, sm.pos)); volume != 0 { + price := sm.priceForStep(current, fairPrice, position, sm.pos, volume) + sm.addOrder(volume, price, sm.side) + } + + // we've step through fair-price now so orders will becomes sells + sm.side = types.SideSell + current = fairPrice + position = sm.pos + } + + nextPosition := cu.positionAtPrice(sm.pool.sqrt, num.Min(next, cu.high)) + volume := uint64(num.DeltaV(position, nextPosition)) + if volume != 0 { + price := sm.priceForStep(current, next, position, nextPosition, volume) + sm.addOrder(volume, price, sm.side) + } + + // if we're calculating buys and we hit fair price, switch to sells + if sm.side == types.SideBuy && next.GTE(fairPrice) { + sm.side = types.SideSell + } + + current = next + position = nextPosition + } +} + +// adjustRegion takes the input to/from and increases or decreases the interval depending on the pool's bounds. +func (sm *shapeMaker) adjustRegion() bool { + lower := sm.pool.lower.low + upper := sm.pool.upper.high + + if sm.pool.closing() { + // AMM is in reduce only mode so will only have orders between its fair-price and its base so shrink from/to to that region + if sm.pos == 0 { + // pool is closed and we're waiting for the next MTM to close, so it has no orders + return false + } + + if sm.pos > 0 { + // only orders between fair-price -> base + lower = sm.fairPrice.Clone() + upper = sm.pool.lower.high.Clone() + } else { + // only orders between base -> fair-price + upper = sm.fairPrice.Clone() + lower = sm.pool.lower.high.Clone() + } + } + + if sm.from.GT(upper) || sm.to.LT(lower) { + // expansion range is completely outside the pools ranges + return false + } + + if sm.from.EQ(sm.to) && sm.from.EQ(sm.fairPrice) { + return false + } + + // cap the range to the pool's bounds, there will be no orders outside of this + from := num.Max(sm.from, lower) + to := num.Min(sm.to, upper) + + switch { + case sm.from.GT(sm.fairPrice): + // if we are expanding entirely in the sell range to calculate the order at price `from` + // we need to ask the AMM for volume in the range `from - 1 -> from` so we simply + // sub one here to cover than. + sm.side = types.SideSell + from.Sub(from, sm.oneTick) + case to.LT(sm.fairPrice): + // if we are expanding entirely in the buy range to calculate the order at price `to` + // we need to ask the AMM for volume in the range `to -> to + 1` so we simply + // add one here to cover than. + to.Add(to, sm.oneTick) + case from.EQ(sm.fairPrice): + // if we are starting the expansion at the fair-price all orders will be sells + sm.side = types.SideSell + } + + // we have the new range we will be expanding over, great + sm.from = from + sm.to = to + return true +} + +func (sm *shapeMaker) makeShape() ([]*types.Order, []*types.Order) { + if !sm.adjustRegion() { + // if there is no overlap between the input region and the AMM's bounds then there are no orders + return nil, nil + } + + // create accurate orders at the boundary of the adjusted region (even if we are going to make approximate internal steps) + bnd1, bnd2 := sm.calculateBoundaryOrders() + + // we can add the start one now because it'll go at the beginning of the slice + sm.appendOrder(bnd1) + + // work out the step size and if we'll be in approximate mode + sm.calculateStepSize() + + // now walk across the lower curve + sm.expandCurve(sm.pool.lower, sm.from, sm.to) + + // and walk across the upper curve + sm.expandCurve(sm.pool.upper, sm.from, sm.to) + + // add the final boundary order we calculated earlier + if bnd1.Price.NEQ(bnd2.Price) { + sm.appendOrder(bnd2) + } + + if sm.log.IsDebug() { + sm.log.Debug("pool expanded into orders", + logging.Int("buys", len(sm.buys)), + logging.Int("sells", len(sm.sells)), + ) + } + return sm.buys, sm.sells +} + +func (p *Pool) OrderbookShape(from, to *num.Uint, idgen *idgeneration.IDGenerator) ([]*types.Order, []*types.Order) { + return newShapeMaker( + p.log, + p, + from, + to, + idgen). + makeShape() +} diff --git a/core/execution/amm/shape_test.go b/core/execution/amm/shape_test.go new file mode 100644 index 00000000000..89fc14856fb --- /dev/null +++ b/core/execution/amm/shape_test.go @@ -0,0 +1,361 @@ +// 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/types" + "code.vegaprotocol.io/vega/libs/num" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestOrderbookShape(t *testing.T) { + t.Run("test orderbook shape when AMM is 0", testOrderbookShapeZeroPosition) + t.Run("test orderbook shape when AMM is long", testOrderbookShapeLong) + t.Run("test orderbook shape when AMM is short", testOrderbookShapeShort) + t.Run("test orderbook shape when calculations are capped", testOrderbookShapeLimited) + t.Run("test orderbook shape step over fair price", testOrderbookShapeStepOverFairPrice) + t.Run("test orderbook shape step fair price at boundary", testOrderbookShapeNoStepOverFairPrice) + t.Run("test orderbook shape AMM reduce only", testOrderbookShapeReduceOnly) + t.Run("test orderbook shape boundary order when approx", testOrderbookShapeBoundaryOrder) + t.Run("test orderbook shape region not divisible by tick", testOrderbookSubTick) +} + +func testOrderbookShapeZeroPosition(t *testing.T) { + p := newTestPoolWithRanges(t, num.NewUint(7), num.NewUint(10), num.NewUint(13)) + defer p.ctrl.Finish() + + low := p.submission.Parameters.LowerBound + base := p.submission.Parameters.Base + high := p.submission.Parameters.UpperBound + + // when range [7, 10] expect orders at prices (7, 8, 9) + // there will be no order at price 10 since that is the pools fair-price and it quotes +/-1 eitherside + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells := p.pool.OrderbookShape(low, base, nil) + assertOrderPrices(t, buys, types.SideBuy, 7, 9) + assert.Equal(t, 0, len(sells)) + + // when range [7, 9] expect orders at prices (7, 8, 9) + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(low, num.NewUint(9), nil) + assertOrderPrices(t, buys, types.SideBuy, 7, 9) + assert.Equal(t, 0, len(sells)) + + // when range [10, 13] expect orders at prices (11, 12, 13) + // there will be no order at price 10 since that is the pools fair-price and it quotes +/-1 eitherside + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(base, high, nil) + assert.Equal(t, 0, len(buys)) + assertOrderPrices(t, sells, types.SideSell, 11, 13) + + // when range [11, 13] expect orders at prices (11, 12, 13) + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(num.NewUint(11), high, nil) + assert.Equal(t, 0, len(buys)) + assertOrderPrices(t, sells, types.SideSell, 11, 13) + + // whole range from [7, 10] will have buys (7, 8, 9) and sells (11, 12, 13) + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(low, high, nil) + assertOrderPrices(t, buys, types.SideBuy, 7, 9) + assertOrderPrices(t, sells, types.SideSell, 11, 13) + + // mid both curves spanning buys and sells, range from [8, 12] will have buys (8, 9) and sells (11, 12) + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(num.NewUint(8), num.NewUint(12), nil) + assertOrderPrices(t, buys, types.SideBuy, 8, 9) + assertOrderPrices(t, sells, types.SideSell, 11, 12) + + // range (8, 8) should return a single buy order at price 8, which is a bit counter intuitive + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(num.NewUint(8), num.NewUint(8), nil) + assertOrderPrices(t, buys, types.SideBuy, 8, 8) + assert.Equal(t, 0, len(sells)) + + // range (10, 10) should return only the orders at the fair-price, which is 0 orders + ensurePositionN(t, p.pos, 0, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(num.NewUint(10), num.NewUint(10), nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 0, len(sells)) +} + +func testOrderbookShapeLong(t *testing.T) { + p := newTestPoolWithRanges(t, num.NewUint(7), num.NewUint(10), num.NewUint(13)) + defer p.ctrl.Finish() + + low := p.submission.Parameters.LowerBound + base := p.submission.Parameters.Base + high := p.submission.Parameters.UpperBound + + // AMM is long and will have a fair-price of 8 + position := int64(17980) + ensurePosition(t, p.pos, position, num.UintZero()) + require.Equal(t, "8", p.pool.BestPrice(nil).String()) + + // range [7, 10] with have buy order (7) and sell orders (9, 10) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells := p.pool.OrderbookShape(low, base, nil) + assertOrderPrices(t, buys, types.SideBuy, 7, 7) + assertOrderPrices(t, sells, types.SideSell, 9, 10) + + // range [10, 13] with have sell orders (10, 11, 12, 13) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(base, high, nil) + assert.Equal(t, 0, len(buys)) + assertOrderPrices(t, sells, types.SideSell, 10, 13) + + // whole range will have buys at (7) and sells at (9, 10, 11, 12, 13) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(low, high, nil) + assertOrderPrices(t, buys, types.SideBuy, 7, 7) + assertOrderPrices(t, sells, types.SideSell, 9, 13) + + // query at fair price returns no orders + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(num.NewUint(8), num.NewUint(8), nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 0, len(sells)) +} + +func testOrderbookShapeShort(t *testing.T) { + p := newTestPoolWithRanges(t, num.NewUint(7), num.NewUint(10), num.NewUint(13)) + defer p.ctrl.Finish() + + low := p.submission.Parameters.LowerBound + base := p.submission.Parameters.Base + high := p.submission.Parameters.UpperBound + + // AMM is short and will have a fair-price of 12 + position := int64(-20000) + ensurePosition(t, p.pos, position, num.UintZero()) + require.Equal(t, "12", p.pool.BestPrice(nil).String()) + + // range [7, 10] with have buy order (7,8,9,10) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells := p.pool.OrderbookShape(low, base, nil) + assertOrderPrices(t, buys, types.SideBuy, 7, 10) + assert.Equal(t, 0, len(sells)) + + // range [10, 13] with have buy orders (10, 11) and sell orders (13) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(base, high, nil) + assertOrderPrices(t, buys, types.SideBuy, 10, 11) + assertOrderPrices(t, sells, types.SideSell, 13, 13) + + // whole range will have buys at (7,8,9,10,11) and sells at (13) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(low, high, nil) + assertOrderPrices(t, buys, types.SideBuy, 7, 11) + assertOrderPrices(t, sells, types.SideSell, 13, 13) + + // query at fair price returns no orders + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(num.NewUint(12), num.NewUint(12), nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 0, len(sells)) +} + +func testOrderbookShapeLimited(t *testing.T) { + p := newTestPoolWithRanges(t, num.NewUint(20), num.NewUint(40), num.NewUint(60)) + defer p.ctrl.Finish() + + low := p.submission.Parameters.LowerBound + base := p.submission.Parameters.Base + high := p.submission.Parameters.UpperBound + + // position is zero but we're capping max calculations at ~10 + position := int64(0) + p.pool.maxCalculationLevels = num.NewUint(10) + + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells := p.pool.OrderbookShape(low, base, nil) + assert.Equal(t, 11, len(buys)) + assert.Equal(t, 0, len(sells)) + + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(base, high, nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 11, len(sells)) + + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(low, high, nil) + assert.Equal(t, 6, len(buys)) + assert.Equal(t, 6, len(sells)) +} + +func testOrderbookShapeStepOverFairPrice(t *testing.T) { + p := newTestPoolWithRanges(t, num.NewUint(20), num.NewUint(40), num.NewUint(60)) + defer p.ctrl.Finish() + + low := p.submission.Parameters.LowerBound + base := p.submission.Parameters.Base + high := p.submission.Parameters.UpperBound + + // make levels of 10 makes the step price 2, and this position gives the pool a fair price of 25 + // when we take the step from 24 -> 26 we want to make sure we split that order into two, so we + // will actually do maxCalculationLevels + 1 calculations but I think thats fine and keeps the calculations + // simple + position := int64(6000) + p.pool.maxCalculationLevels = num.NewUint(10) + ensurePosition(t, p.pos, position, num.UintZero()) + require.Equal(t, "26", p.pool.BestPrice(nil).String()) + + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells := p.pool.OrderbookShape(low, base, nil) + assert.Equal(t, 4, len(buys)) + assert.Equal(t, 8, len(sells)) + + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(base, high, nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 12, len(sells)) + + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(low, high, nil) + assert.Equal(t, 3, len(buys)) + assert.Equal(t, 10, len(sells)) +} + +func testOrderbookShapeNoStepOverFairPrice(t *testing.T) { + p := newTestPoolWithRanges(t, num.NewUint(20), num.NewUint(40), num.NewUint(60)) + defer p.ctrl.Finish() + + low := p.submission.Parameters.LowerBound + base := p.submission.Parameters.Base + high := p.submission.Parameters.UpperBound + + position := int64(0) + p.pool.maxCalculationLevels = num.NewUint(6) + + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells := p.pool.OrderbookShape(low, base, nil) + assert.Equal(t, 7, len(buys)) + assert.Equal(t, 0, len(sells)) + + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(base, high, nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 7, len(sells)) + + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(low, high, nil) + assert.Equal(t, 4, len(buys)) + assert.Equal(t, 4, len(sells)) +} + +func testOrderbookShapeReduceOnly(t *testing.T) { + p := newTestPoolWithRanges(t, num.NewUint(7), num.NewUint(10), num.NewUint(13)) + defer p.ctrl.Finish() + + low := p.submission.Parameters.LowerBound + base := p.submission.Parameters.Base + high := p.submission.Parameters.UpperBound + + // pool is reduce only so will not have any orders above/below fair price depending on position + p.pool.status = types.AMMPoolStatusReduceOnly + + // AMM is position 0 it will have no orders + position := int64(0) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells := p.pool.OrderbookShape(low, base, nil) + assert.Equal(t, 0, len(buys)) + assert.Equal(t, 0, len(sells)) + + // AMM is long and will have a fair-price of 8 and so will only have orders from 8 -> base + position = int64(17980) + ensurePosition(t, p.pos, position, num.UintZero()) + require.Equal(t, "8", p.pool.BestPrice(nil).String()) + + // range [7, 13] will have only sellf orders (9, 10) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(low, high, nil) + assert.Equal(t, 0, len(buys)) + assertOrderPrices(t, sells, types.SideSell, 9, 10) + + // AMM is short and will have a fair-price of 12 + position = int64(-20000) + ensurePosition(t, p.pos, position, num.UintZero()) + require.Equal(t, "12", p.pool.BestPrice(nil).String()) + + // range [10, 13] with have buy orders (10, 11) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + buys, sells = p.pool.OrderbookShape(base, high, nil) + assertOrderPrices(t, buys, types.SideBuy, 10, 11) + assert.Equal(t, 0, len(sells)) +} + +func testOrderbookShapeBoundaryOrder(t *testing.T) { + p := newTestPoolWithRanges(t, num.NewUint(100), num.NewUint(200), num.NewUint(300)) + defer p.ctrl.Finish() + + midlow := num.NewUint(150) + midhigh := num.NewUint(250) + + position := int64(0) + ensurePositionN(t, p.pos, position, num.UintZero(), 2) + + // limit the number of orders in the expansion + p.pool.maxCalculationLevels = num.NewUint(5) + + buys, sells := p.pool.OrderbookShape(midlow, midhigh, nil) + assert.Equal(t, 4, len(buys)) + assert.Equal(t, 4, len(sells)) + + // we're in approximate mode but we still require an exact order at the boundaries of the shape range + // check that the price for the first by is midlow, and the last sell is midhigh + assert.Equal(t, midlow.String(), buys[0].Price.String()) + assert.Equal(t, midhigh.String(), sells[(len(sells)-1)].Price.String()) +} + +func testOrderbookSubTick(t *testing.T) { + p := newTestPoolWithSubmission(t, num.DecimalFromFloat(1), num.DecimalFromFloat(100), + &types.SubmitAMM{ + CommitmentAmount: num.NewUint(10000000), + Parameters: &types.ConcentratedLiquidityParameters{ + LowerBound: num.NewUint(10), + Base: num.NewUint(15), + UpperBound: num.NewUint(20), + }, + }, + ) + + defer p.ctrl.Finish() + + // limit the number of orders in the expansion + p.pool.maxCalculationLevels = num.NewUint(1000) + + position := int64(1000) + ensurePositionN(t, p.pos, position, num.UintZero(), 3) + + // fair-price should be 1483, and so best buy should be 1383 (fair-price minus one-tick) + bp := p.pool.BestPrice(&types.Order{Side: types.SideSell}) + require.Equal(t, "1383", bp.String()) + + // now pretend we are in auction and we have a sell order at 1000, so we need to expand the crossed + // region of 1000 -> 1383 + from := num.NewUint(1000) + to := num.NewUint(1383) + buys, sells := p.pool.OrderbookShape(from, to, nil) + + assert.Equal(t, 4, len(buys)) + assert.Equal(t, bp.String(), buys[3].Price.String()) + + assert.Equal(t, 0, len(sells)) +} diff --git a/core/execution/common/amm_score_stake.go b/core/execution/common/amm_score_stake.go new file mode 100644 index 00000000000..41a3c105b44 --- /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 + 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.DecimalFromInt64(count - 1), + } +} + +// 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/equity_shares.go b/core/execution/common/equity_shares.go index ee86ee5c43a..f5e71752b91 100644 --- a/core/execution/common/equity_shares.go +++ b/core/execution/common/equity_shares.go @@ -313,6 +313,12 @@ func (es *EquityShares) SharesFromParty(party string) num.Decimal { return partyELS.Div(totalEquity) } +// HasShares returns whether the given party is registered as an LP with ELS. +func (es *EquityShares) HasShares(party string) bool { + _, ok := es.lps[party] + return ok +} + // SharesExcept returns the ratio of equity for each party on the market, except // the ones listed in parameter. func (es *EquityShares) SharesExcept(except map[string]struct{}) map[string]num.Decimal { diff --git a/core/execution/common/errors.go b/core/execution/common/errors.go index 2d110b68435..4c6aaeb0ccc 100644 --- a/core/execution/common/errors.go +++ b/core/execution/common/errors.go @@ -83,4 +83,11 @@ var ( ErrStopOrderNotAllowedSameExpiry = errors.New("stop order OCOs must not have the same expiry time") // ErrStopOrderSizeOverrideNotSupportedForSpots is returned when a stop order is received with size override for a spot product. ErrStopOrderSizeOverrideNotSupportedForSpots = errors.New("stop order size override is not supported for spot product") + ErrAMMCannotRebase = errors.New("not enough liquidity for AMM to rebase") + // ErrInvalidOrderPrice is returned when an order is submitted to a capped future with a price > max price. + ErrInvalidOrderPrice = errors.New("invalid order price") + // ErrIsolatedMarginFullyCollateralised is returned when a party tries to switch margin modes on a fully collateralised market. + ErrIsolatedMarginFullyCollateralised = errors.New("isolated margin not permitted on fully collateralised markets") + // ErrSettlementDataOutOfRange is returned when a capped future receives settlement data that is outside of the acceptable range (either > max price, or neither 0 nor max for binary settlements). + ErrSettlementDataOutOfRange = errors.New("settlement data is outside of the price cap") ) diff --git a/core/execution/common/interfaces.go b/core/execution/common/interfaces.go index 3ab1f1cbe46..7ac1b714e3a 100644 --- a/core/execution/common/interfaces.go +++ b/core/execution/common/interfaces.go @@ -23,6 +23,7 @@ import ( dscommon "code.vegaprotocol.io/vega/core/datasource/common" "code.vegaprotocol.io/vega/core/datasource/spec" "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/idgeneration" "code.vegaprotocol.io/vega/core/liquidity/v2" "code.vegaprotocol.io/vega/core/monitor/price" "code.vegaprotocol.io/vega/core/risk" @@ -33,7 +34,9 @@ import ( 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/mocks.go -package mocks code.vegaprotocol.io/vega/core/execution/common TimeService,Assets,StateVarEngine,Collateral,OracleEngine,EpochEngine,AuctionState,LiquidityEngine,EquityLikeShares,MarketLiquidityEngine,Teams,AccountBalanceChecker,Banking,Parties,DelayTransactionsTarget + +//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 @@ -52,6 +55,7 @@ type PriceMonitor interface { CheckPrice(ctx context.Context, as price.AuctionState, price *num.Uint, persistent bool, recordInHistory bool) bool ResetPriceHistory(price *num.Uint) GetCurrentBounds() []*types.PriceMonitoringBounds + GetBounds() []*types.PriceMonitoringBounds SetMinDuration(d time.Duration) GetValidPriceRange() (num.WrappedDecimal, num.WrappedDecimal) // Snapshot @@ -59,7 +63,7 @@ type PriceMonitor interface { Changed() bool IsBoundFactorsInitialised() bool Initialised() bool - UpdateSettings(risk.Model, *types.PriceMonitoringSettings) + UpdateSettings(risk.Model, *types.PriceMonitoringSettings, price.AuctionState) } // TimeService ... @@ -96,6 +100,7 @@ type AuctionState interface { price.AuctionState // are we in auction, and what auction are we in? ExtendAuctionSuspension(delta types.AuctionDuration) + ExtendAuctionLongBlock(delta types.AuctionDuration) InAuction() bool IsOpeningAuction() bool IsPriceAuction() bool @@ -124,6 +129,7 @@ type AuctionState interface { Changed() bool UpdateMaxDuration(ctx context.Context, d time.Duration) StartGovernanceSuspensionAuction(t time.Time) + StartLongBlockAuction(t time.Time, d int64) EndGovernanceSuspensionAuction() } @@ -187,6 +193,25 @@ 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) + CheckOrderSpam(party, market string, assets []string) error + CheckOrderSpamAllMarkets(party string) 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 @@ -218,6 +243,10 @@ type Banking interface { RegisterTradingFees(ctx context.Context, asset string, feesPerParty map[string]*num.Uint) } +type Parties interface { + AssignDeriveKey(ctx context.Context, party types.PartyID, derivedKey string) +} + type LiquidityEngine interface { GetLegacyOrders() []string OnEpochRestore(ep types.Epoch) @@ -252,6 +281,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,16 +322,31 @@ type MarketLiquidityEngine interface { ProvisionsPerParty() liquidity.ProvisionsPerParty OnMarketClosed(context.Context, time.Time) CalculateSuppliedStake() *num.Uint + SetELSFeeFraction(d num.Decimal) } type EquityLikeShares interface { AllShares() map[string]num.Decimal SetPartyStake(id string, newStakeU *num.Uint) + HasShares(id string) bool +} + +type AMMPool interface { + OrderbookShape(from, to *num.Uint, idgen *idgeneration.IDGenerator) ([]*types.Order, []*types.Order) + LiquidityFee() num.Decimal + CommitmentAmount() *num.Uint +} + +type AMM interface { + GetAMMPoolsBySubAccount() map[string]AMMPool + GetAllSubAccounts() []string + IsAMMPartyID(string) bool } type CommonMarket interface { GetID() string Hash() []byte + GetAssets() []string Reject(context.Context) error GetMarketData() types.MarketData StartOpeningAuction(context.Context) error @@ -317,6 +362,8 @@ type CommonMarket interface { BeginBlock(context.Context) UpdateMarketState(ctx context.Context, changes *types.MarketStateUpdateConfiguration) error GetFillPrice(volume uint64, side types.Side) (*num.Uint, error) + Mkt() *types.Market + EnterLongBlockAuction(ctx context.Context, duration int64) IsOpeningAuction() bool @@ -338,6 +385,9 @@ type CommonMarket interface { OnMarketLiquidityV2StakeToCCYVolume(d num.Decimal) OnMarketLiquidityV2BondPenaltyFactorUpdate(d num.Decimal) OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(t time.Duration) + OnMarketLiquidityEquityLikeShareFeeFractionUpdate(d num.Decimal) + OnAMMMinCommitmentQuantumUpdate(context.Context, *num.Uint) + OnMarketAMMMaxCalculationLevels(context.Context, *num.Uint) // liquidity provision CancelLiquidityProvision(context.Context, *types.LiquidityProvisionCancellation, string) error @@ -353,7 +403,12 @@ 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 + ValidateSettlementData(*num.Uint) bool } type AccountBalanceChecker interface { @@ -365,3 +420,7 @@ type Teams interface { GetAllPartiesInTeams(minEpochsInTeam uint64) []string GetAllTeamsWithParties(minEpochsInTeam uint64) map[string][]string } + +type DelayTransactionsTarget interface { + MarketDelayRequiredUpdated(marketID string, required bool) +} diff --git a/core/execution/common/liquidity_provision.go b/core/execution/common/liquidity_provision.go index da452f3073d..d34e79a4f5d 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,27 @@ 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] + + // if the amm has been cancelled for a whole epoch then just kill their ELS + if !m.amm.IsAMMPartyID(party) && amm.stake.IsZero() { + m.equityShares.SetPartyStake(party, nil) + delete(m.ammStats, party) + continue + } + + // otherwise update it and start our stats again + stake, _ := num.UintFromDecimal(amm.stake) + m.equityShares.SetPartyStake(party, stake) + amm.StartEpoch() + } +} + func (m *MarketLiquidity) applyPendingProvisions( ctx context.Context, now time.Time, @@ -288,7 +323,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 +336,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 +358,18 @@ 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(), + } + penalties.AllPartiesHaveFullFeePenalty = false + } + } + m.distributeFeesBonusesAndApplyPenalties(ctx, penalties) } @@ -336,6 +386,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 +926,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 +948,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..f7e53b2c780 100644 --- a/core/execution/common/liquidity_provision_fees.go +++ b/core/execution/common/liquidity_provision_fees.go @@ -75,15 +75,43 @@ func (m *MarketLiquidity) AllocateFees(ctx context.Context) error { return nil } + // if there are AMM's which were created during this epoch and we are distributing fees + // want want to using a mid-epoch ELS + newAMMs := []string{} + for ammParty, stats := range m.ammStats { + if !stats.stake.IsZero() && !m.equityShares.HasShares(ammParty) { + // add a temporary mid epoch share + stake, _ := num.UintFromDecimal(stats.stake) + m.equityShares.SetPartyStake(ammParty, stake) + newAMMs = append(newAMMs, ammParty) + } + } + // Get equity like shares per party. sharesPerLp := m.equityShares.AllShares() - if len(sharesPerLp) == 0 { - return nil + + // revert the temporary ELS for the new AMM + for _, ammParty := range newAMMs { + m.equityShares.SetPartyStake(ammParty, nil) } + // get the LP scores scoresPerLp := m.liquidityEngine.GetAverageLiquidityScores() - // Multiplies each equity like share with corresponding score. + if len(sharesPerLp) == 0 && len(m.ammStats) == 0 && len(scoresPerLp) == 0 { + return nil + } + + // include AMM average LP scores + for id, av := range m.ammStats { + scoresPerLp[id] = av.score + } + + // 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 +132,121 @@ func (m *MarketLiquidity) AllocateFees(ctx context.Context) error { return nil } +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 + } + + pools := m.amm.GetAMMPoolsBySubAccount() + for ammParty, pool := range pools { + buy, sell := pool.OrderbookShape(minP, maxP, nil) + 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)) + } + + // divide the lesser value by the market.liquidity.stakeToCcyVolume to get the equivalent bond + value := num.Min(buyTotal, sellTotal) + stake := num.DecimalFromUint(value).Div(m.stakeToCcyVolume) + + as, ok := m.ammStats[ammParty] + if !ok { + as = newAMMState(count) + m.ammStats[ammParty] = as + } + + score := as.score + if !skipScore { + bb, ba := num.DecimalFromUint(bestB), num.DecimalFromUint(bestA) + score = m.liquidityEngine.GetPartyLiquidityScore(append(buy, sell...), bb, ba, minP, maxP) + } + + // set the stake and score + as.UpdateTick(stake, score) + } + + // if we have an AMM that is in our stats but isn't in the current AMM engine then it has been cancelled so we give it a score of 0 + for ammParty, stats := range m.ammStats { + if _, ok := pools[ammParty]; !ok { + stats.UpdateTick(num.DecimalZero(), num.DecimalZero()) + } + } +} + +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) + } + + if total.IsZero() { + return scores + } + + 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 +259,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 +462,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_snapshot_test.go b/core/execution/common/liquidity_provision_snapshot_test.go new file mode 100644 index 00000000000..b70f9e3a42f --- /dev/null +++ b/core/execution/common/liquidity_provision_snapshot_test.go @@ -0,0 +1,96 @@ +// 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_test + +import ( + "context" + "testing" + "time" + + "code.vegaprotocol.io/vega/core/execution/common" + "code.vegaprotocol.io/vega/core/idgeneration" + "code.vegaprotocol.io/vega/core/types" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + "code.vegaprotocol.io/vega/libs/num" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" +) + +func TestAMMStateSnapshot(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()) + testLiquidity.liquidityEngine.EXPECT().ReadyForFeesAllocation(gomock.Any()).Return(false).AnyTimes() + testLiquidity.liquidityEngine.EXPECT().UpdateAverageLiquidityScores(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + testLiquidity.liquidityEngine.EXPECT().OnStakeToCcyVolumeUpdate(gomock.Any()).AnyTimes() + testLiquidity.marketLiquidity.OnStakeToCcyVolumeUpdate(num.DecimalOne()) + + testLiquidity.orderBook.EXPECT().GetBestStaticAskPrice().Return(num.NewUint(200), nil).AnyTimes() + testLiquidity.orderBook.EXPECT().GetBestStaticBidPrice().Return(num.NewUint(100), nil).AnyTimes() + testLiquidity.liquidityEngine.EXPECT().GetPartyLiquidityScore( + gomock.Any(), + gomock.Any(), + gomock.Any(), + gomock.Any(), + gomock.Any(), + ).Return(num.DecimalOne()).AnyTimes() + + party1 := vgcrypto.RandomHash() + party2 := vgcrypto.RandomHash() + amms := map[string]common.AMMPool{ + party1: dummyAMM{}, + } + + // get some AMM's to create some state + testLiquidity.amm.EXPECT().GetAMMPoolsBySubAccount().Return(amms) + + testLiquidity.marketLiquidity.OnTick(context.Background(), time.Now()) + + state := testLiquidity.marketLiquidity.GetState() + assert.Equal(t, int64(1), state.Tick) + assert.Equal(t, int64(1), state.Amm[0].Tick) + + // next tick we have a new AMM enter the ring + amms[party2] = dummyAMM{} + testLiquidity.amm.EXPECT().GetAMMPoolsBySubAccount().Return(amms) + + testLiquidity.marketLiquidity.OnTick(context.Background(), time.Now()) + + state = testLiquidity.marketLiquidity.GetState() + assert.Equal(t, int64(2), state.Tick) + if state.Amm[0].Party == party1 { + assert.Equal(t, int64(1), state.Amm[1].Tick) + assert.Equal(t, int64(2), state.Amm[0].Tick) + } else { + assert.Equal(t, int64(1), state.Amm[0].Tick) + assert.Equal(t, int64(2), state.Amm[1].Tick) + } +} + +type dummyAMM struct{} + +func (d dummyAMM) OrderbookShape(from, to *num.Uint, idgen *idgeneration.IDGenerator) ([]*types.Order, []*types.Order) { + return nil, nil +} + +func (d dummyAMM) LiquidityFee() num.Decimal { + return num.DecimalZero() +} + +func (d dummyAMM) CommitmentAmount() *num.Uint { + return num.UintOne() +} 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/mark_price.go b/core/execution/common/mark_price.go index cb0fc6faaf0..49f80726cb3 100644 --- a/core/execution/common/mark_price.go +++ b/core/execution/common/mark_price.go @@ -44,6 +44,7 @@ type CompositePriceCalculator struct { priceSources []*num.Uint oracles []*products.CompositePriceOracle scalingFunc func(context.Context, *num.Numeric, int64) *num.Uint + maxPrice *num.Uint } const ( @@ -203,6 +204,11 @@ func (mpc *CompositePriceCalculator) OverridePrice(p *num.Uint) { } } +// SetMaxPriceCap is called from a capped future, to filter out price data that exceeds the max price. +func (mpc *CompositePriceCalculator) SetMaxPriceCap(mp *num.Uint) { + mpc.maxPrice = mp +} + // NewTrade is called to inform the mark price calculator on a new trade. // All the trades for a given mark price calculation interval are saved until the end of the interval. func (mpc *CompositePriceCalculator) NewTrade(trade *types.Trade) { @@ -222,9 +228,14 @@ func (mpc *CompositePriceCalculator) GetUpdateOraclePriceFunc(oracleIndex int) f return err } p := mpc.scalingFunc(ctx, pd, mpc.oracles[oracleIndex].GetDecimals()) + // ignore prices that exceed the cap if p == nil || p.IsZero() { return nil } + // ignore price data > max price + if mpc.maxPrice != nil && p.GT(mpc.maxPrice) { + return nil + } mpc.priceSources[FirstOraclePriceIndex+oracleIndex] = p.Clone() mpc.sourceLastUpdate[FirstOraclePriceIndex+oracleIndex] = mpc.timeService.GetTimeNow().UnixNano() return nil diff --git a/core/execution/common/market_activity_tracker.go b/core/execution/common/market_activity_tracker.go index 2f9d3295ffb..050f8c39b40 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 { @@ -212,6 +215,60 @@ func (mat *MarketActivityTracker) MarketProposed(asset, marketID, proposer strin } } +func (mat *MarketActivityTracker) PublishGameMetric(ctx context.Context, dispatchStrategy []*vega.DispatchStrategy, now time.Time) { + m := map[string]map[string]map[string]*num.Uint{} + + for asset, market := range mat.assetToMarketTrackers { + m[asset] = map[string]map[string]*num.Uint{} + for mkt, mt := range market { + m[asset][mkt] = mt.aggregatedFees() + mt.processNotionalAtMilestone(mat.epochStartTime, now) + mt.processPositionAtMilestone(mat.epochStartTime, now) + mt.processM2MAtMilestone() + mt.processPartyRealisedReturnAtMilestone() + mt.calcFeesAtMilestone() + } + } + mat.takerFeesPaidInEpoch = append(mat.takerFeesPaidInEpoch, m) + + for _, ds := range dispatchStrategy { + if ds.Metric == vega.DispatchMetric_DISPATCH_METRIC_VALIDATOR_RANKING || ds.Metric == vega.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED || + ds.Metric == vega.DispatchMetric_DISPATCH_METRIC_MARKET_VALUE { + continue + } + mat.publishMetricForDispatchStrategy(ctx, ds, now) + } + + for _, market := range mat.assetToMarketTrackers { + for _, mt := range market { + mt.epochTimeWeightedNotional = mt.epochTimeWeightedNotional[:len(mt.epochTimeWeightedNotional)-1] + mt.epochTimeWeightedPosition = mt.epochTimeWeightedPosition[:len(mt.epochTimeWeightedPosition)-1] + mt.epochPartyM2M = mt.epochPartyM2M[:len(mt.epochPartyM2M)-1] + mt.epochPartyRealisedReturn = mt.epochPartyRealisedReturn[:len(mt.epochPartyRealisedReturn)-1] + mt.epochMakerFeesReceived = mt.epochMakerFeesReceived[:len(mt.epochMakerFeesReceived)-1] + mt.epochMakerFeesPaid = mt.epochMakerFeesPaid[:len(mt.epochMakerFeesPaid)-1] + mt.epochLpFees = mt.epochLpFees[:len(mt.epochLpFees)-1] + mt.epochTotalMakerFeesReceived = mt.epochTotalMakerFeesReceived[:len(mt.epochTotalMakerFeesReceived)-1] + mt.epochTotalMakerFeesPaid = mt.epochTotalMakerFeesPaid[:len(mt.epochTotalMakerFeesPaid)-1] + mt.epochTotalLpFees = mt.epochTotalLpFees[:len(mt.epochTotalLpFees)-1] + } + } + mat.takerFeesPaidInEpoch = mat.takerFeesPaidInEpoch[:len(mat.takerFeesPaidInEpoch)-1] + mat.partyContributionCache = map[string][]*types.PartyContributionScore{} +} + +func (mat *MarketActivityTracker) publishMetricForDispatchStrategy(ctx context.Context, ds *vega.DispatchStrategy, now time.Time) { + if ds.EntityScope == vega.EntityScope_ENTITY_SCOPE_INDIVIDUALS { + partyScores := mat.CalculateMetricForIndividuals(ctx, ds) + gs := events.NewPartyGameScoresEvent(ctx, int64(mat.currentEpoch), getGameID(ds), now, partyScores) + mat.broker.Send(gs) + } else { + teamScores, partyScores := mat.CalculateMetricForTeams(ctx, ds) + gs := events.NewTeamGameScoresEvent(ctx, int64(mat.currentEpoch), getGameID(ds), now, teamScores, partyScores) + mat.broker.Send(gs) + } +} + // AddValueTraded records the value of a trade done in the given market. func (mat *MarketActivityTracker) AddValueTraded(asset, marketID string, value *num.Uint) { markets, ok := mat.assetToMarketTrackers[asset] @@ -221,6 +278,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{}{} +} + +// RemoveAMMParty removes amm party entries for AMM in given market. +func (mat *MarketActivityTracker) RemoveAMMParty(asset, marketID, ammParty string) { + markets, ok := mat.assetToMarketTrackers[asset] + if !ok || markets[marketID] == nil { + return + } + delete(markets[marketID].ammPartiesCache, ammParty) +} + // 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 { @@ -442,6 +517,15 @@ func (mat *MarketActivityTracker) clearDeletedMarkets() { } } +func (mt *marketTracker) calcFeesAtMilestone() { + mt.epochMakerFeesReceived = append(mt.epochMakerFeesReceived, mt.makerFeesReceived) + mt.epochMakerFeesPaid = append(mt.epochMakerFeesPaid, mt.makerFeesPaid) + mt.epochLpFees = append(mt.epochLpFees, mt.lpFees) + mt.epochTotalMakerFeesReceived = append(mt.epochTotalMakerFeesReceived, mt.totalMakerFeesReceived) + mt.epochTotalMakerFeesPaid = append(mt.epochTotalMakerFeesPaid, mt.totalMakerFeesPaid) + mt.epochTotalLpFees = append(mt.epochTotalLpFees, mt.totalLpFees) +} + // clearFeeActivity is called at the end of the epoch. It deletes markets that are pending to be removed and resets the fees paid for the epoch. func (mt *marketTracker) clearFeeActivity() { if len(mt.epochMakerFeesReceived) == maxWindowSize { @@ -562,7 +646,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 +666,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 +675,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,16 +695,22 @@ 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 } +func getGameID(ds *vega.DispatchStrategy) string { + p, _ := lproto.Marshal(ds) + return hex.EncodeToString(crypto.Hash(p)) +} + // CalculateMetricForIndividuals calculates the metric corresponding to the dispatch strategy and returns a slice of the contribution scores of the parties. // Markets in scope are the ones passed in the dispatch strategy if any or all available markets for the asset for metric. // Parties in scope depend on the `IndividualScope_INDIVIDUAL_SCOPE_IN_TEAM` and can include all parties, only those in teams, and only those not in teams. func (mat *MarketActivityTracker) CalculateMetricForIndividuals(ctx context.Context, ds *vega.DispatchStrategy) []*types.PartyContributionScore { - p, _ := lproto.Marshal(ds) - hash := hex.EncodeToString(crypto.Hash(p)) + hash := getGameID(ds) if pc, ok := mat.partyContributionCache[hash]; ok { return pc } @@ -612,7 +718,11 @@ func (mat *MarketActivityTracker) CalculateMetricForIndividuals(ctx context.Cont parties := mat.getPartiesInScope(ds) stakingRequirement, _ := num.UintFromString(ds.StakingRequirement, 10) notionalRequirement, _ := num.UintFromString(ds.NotionalTimeWeightedAveragePositionRequirement, 10) - partyContributions := mat.calculateMetricForIndividuals(ctx, ds.AssetForMetric, parties, ds.Markets, ds.Metric, stakingRequirement, notionalRequirement, int(ds.WindowLength), hash) + interval := int32(1) + if ds.TransferInterval != nil { + interval = *ds.TransferInterval + } + partyContributions := mat.calculateMetricForIndividuals(ctx, ds.AssetForMetric, parties, ds.Markets, ds.Metric, stakingRequirement, notionalRequirement, int(ds.WindowLength), hash, interval) // we do this calculation at the end of the epoch and clear it in the beginning of the next epoch, i.e. within the same block therefore it saves us // redundant calculation and has no snapshot implication @@ -623,6 +733,11 @@ func (mat *MarketActivityTracker) CalculateMetricForIndividuals(ctx context.Cont // CalculateMetricForTeams calculates the metric for teams and their respective team members for markets in scope of the dispatch strategy. func (mat *MarketActivityTracker) CalculateMetricForTeams(ctx context.Context, ds *vega.DispatchStrategy) ([]*types.PartyContributionScore, map[string][]*types.PartyContributionScore) { var teamMembers map[string][]string + interval := int32(1) + if ds.TransferInterval != nil { + interval = *ds.TransferInterval + } + paidFees := mat.GetLastEpochTakeFees(ds.AssetForMetric, ds.Markets, interval) if tsl := len(ds.TeamScope); tsl > 0 { teamMembers = make(map[string][]string, len(ds.TeamScope)) for _, team := range ds.TeamScope { @@ -638,53 +753,63 @@ func (mat *MarketActivityTracker) CalculateMetricForTeams(ctx context.Context, d p, _ := lproto.Marshal(ds) gameID := hex.EncodeToString(crypto.Hash(p)) - return mat.calculateMetricForTeams(ctx, ds.AssetForMetric, teamMembers, ds.Markets, ds.Metric, stakingRequirement, notionalRequirement, int(ds.WindowLength), topNDecimal, gameID) + return mat.calculateMetricForTeams(ctx, ds.AssetForMetric, teamMembers, ds.Markets, ds.Metric, stakingRequirement, notionalRequirement, int(ds.WindowLength), topNDecimal, gameID, paidFees) } -func (mat *MarketActivityTracker) isEligibleForReward(ctx context.Context, asset, party string, markets []string, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, gameID string) bool { - if !minStakingBalanceRequired.IsZero() { - balance, err := mat.balanceChecker.GetAvailableBalance(party) - if err != nil || balance.LT(minStakingBalanceRequired) { - return false +func (mat *MarketActivityTracker) isEligibleForReward(ctx context.Context, asset, party string, markets []string, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, gameID string) (bool, *num.Uint, *num.Uint) { + eligiblByBalance := true + eligibleByNotional := true + var balance, notional *num.Uint + var err error + + balance, err = mat.balanceChecker.GetAvailableBalance(party) + if err != nil || balance.LT(minStakingBalanceRequired) { + eligiblByBalance = false + if balance == nil { + balance = num.UintZero() } } - if !notionalTimeWeightedAveragePositionRequired.IsZero() { - notional := mat.getTWNotionalPosition(asset, party, markets) - mat.broker.Send(events.NewTimeWeightedNotionalPositionUpdated(ctx, mat.currentEpoch, asset, party, gameID, notional.String())) - if notional.LT(notionalTimeWeightedAveragePositionRequired) { - return false - } + + notional = mat.getTWNotionalPosition(asset, party, markets) + mat.broker.Send(events.NewTimeWeightedNotionalPositionUpdated(ctx, mat.currentEpoch, asset, party, gameID, notional.String())) + if notional.LT(notionalTimeWeightedAveragePositionRequired) { + eligibleByNotional = false } - return true + + isEligible := (eligiblByBalance || minStakingBalanceRequired.IsZero()) && (eligibleByNotional || notionalTimeWeightedAveragePositionRequired.IsZero()) + return isEligible, balance, notional } -func (mat *MarketActivityTracker) calculateMetricForIndividuals(ctx context.Context, asset string, parties []string, markets []string, metric vega.DispatchMetric, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, windowSize int, gameID string) []*types.PartyContributionScore { +func (mat *MarketActivityTracker) calculateMetricForIndividuals(ctx context.Context, asset string, parties []string, markets []string, metric vega.DispatchMetric, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, windowSize int, gameID string, interval int32) []*types.PartyContributionScore { ret := make([]*types.PartyContributionScore, 0, len(parties)) + paidFees := mat.GetLastEpochTakeFees(asset, markets, interval) for _, party := range parties { - if !mat.isEligibleForReward(ctx, asset, party, markets, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, gameID) { + eligible, balance, notional := mat.isEligibleForReward(ctx, asset, party, markets, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, gameID) + if !eligible { + ret = append(ret, &types.PartyContributionScore{Party: party, Score: num.DecimalZero(), IsEligible: eligible, StakingBalance: balance, OpenVolume: notional, TotalFeesPaid: paidFees[party], RankingIndex: -1}) continue } score, ok := mat.calculateMetricForParty(asset, party, markets, metric, windowSize) if !ok { + ret = append(ret, &types.PartyContributionScore{Party: party, Score: num.DecimalZero(), IsEligible: false, StakingBalance: balance, OpenVolume: notional, TotalFeesPaid: paidFees[party], RankingIndex: -1}) continue } - ret = append(ret, &types.PartyContributionScore{Party: party, Score: score}) + ret = append(ret, &types.PartyContributionScore{Party: party, Score: score, IsEligible: true, StakingBalance: balance, OpenVolume: notional, TotalFeesPaid: paidFees[party], RankingIndex: -1}) } return ret } // CalculateMetricForTeams returns a slice of metrics for the team and a slice of metrics for each team member. -func (mat *MarketActivityTracker) calculateMetricForTeams(ctx context.Context, asset string, teams map[string][]string, marketsInScope []string, metric vega.DispatchMetric, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, windowSize int, topN num.Decimal, gameID string) ([]*types.PartyContributionScore, map[string][]*types.PartyContributionScore) { +func (mat *MarketActivityTracker) calculateMetricForTeams(ctx context.Context, asset string, teams map[string][]string, marketsInScope []string, metric vega.DispatchMetric, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, windowSize int, topN num.Decimal, gameID string, paidFees map[string]*num.Uint) ([]*types.PartyContributionScore, map[string][]*types.PartyContributionScore) { teamScores := make([]*types.PartyContributionScore, 0, len(teams)) teamKeys := make([]string, 0, len(teams)) for k := range teams { teamKeys = append(teamKeys, k) } sort.Strings(teamKeys) - ps := make(map[string][]*types.PartyContributionScore, len(teamScores)) for _, t := range teamKeys { - ts, teamMemberScores := mat.calculateMetricForTeam(ctx, asset, teams[t], marketsInScope, metric, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, windowSize, topN, gameID) + ts, teamMemberScores := mat.calculateMetricForTeam(ctx, asset, teams[t], marketsInScope, metric, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, windowSize, topN, gameID, paidFees) if ts.IsZero() { continue } @@ -696,8 +821,8 @@ func (mat *MarketActivityTracker) calculateMetricForTeams(ctx context.Context, a } // calculateMetricForTeam returns the metric score for team and a slice of the score for each of its members. -func (mat *MarketActivityTracker) calculateMetricForTeam(ctx context.Context, asset string, parties []string, marketsInScope []string, metric vega.DispatchMetric, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, windowSize int, topN num.Decimal, gameID string) (num.Decimal, []*types.PartyContributionScore) { - return calculateMetricForTeamUtil(ctx, asset, parties, marketsInScope, metric, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, windowSize, topN, mat.isEligibleForReward, mat.calculateMetricForParty, gameID) +func (mat *MarketActivityTracker) calculateMetricForTeam(ctx context.Context, asset string, parties []string, marketsInScope []string, metric vega.DispatchMetric, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, windowSize int, topN num.Decimal, gameID string, paidFees map[string]*num.Uint) (num.Decimal, []*types.PartyContributionScore) { + return calculateMetricForTeamUtil(ctx, asset, parties, marketsInScope, metric, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, windowSize, topN, mat.isEligibleForReward, mat.calculateMetricForParty, gameID, paidFees) } func calculateMetricForTeamUtil(ctx context.Context, @@ -709,17 +834,24 @@ func calculateMetricForTeamUtil(ctx context.Context, notionalTimeWeightedAveragePositionRequired *num.Uint, windowSize int, topN num.Decimal, - isEligibleForReward func(ctx context.Context, asset, party string, markets []string, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, gameID string) bool, + isEligibleForReward func(ctx context.Context, asset, party string, markets []string, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, gameID string) (bool, *num.Uint, *num.Uint), calculateMetricForParty func(asset, party string, marketsInScope []string, metric vega.DispatchMetric, windowSize int) (num.Decimal, bool), gameID string, + paidFees map[string]*num.Uint, ) (num.Decimal, []*types.PartyContributionScore) { teamPartyScores := []*types.PartyContributionScore{} + eligibleTeamPartyScores := []*types.PartyContributionScore{} for _, party := range parties { - if !isEligibleForReward(ctx, asset, party, marketsInScope, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, gameID) { + eligible, balance, notional := isEligibleForReward(ctx, asset, party, marketsInScope, minStakingBalanceRequired, notionalTimeWeightedAveragePositionRequired, gameID) + if !eligible { + teamPartyScores = append(teamPartyScores, &types.PartyContributionScore{Party: party, Score: num.DecimalZero(), IsEligible: eligible, StakingBalance: balance, OpenVolume: notional, TotalFeesPaid: paidFees[party], RankingIndex: -1}) continue } if score, ok := calculateMetricForParty(asset, party, marketsInScope, metric, windowSize); ok { - teamPartyScores = append(teamPartyScores, &types.PartyContributionScore{Party: party, Score: score}) + teamPartyScores = append(teamPartyScores, &types.PartyContributionScore{Party: party, Score: score, IsEligible: eligible, StakingBalance: balance, OpenVolume: notional, TotalFeesPaid: paidFees[party], RankingIndex: -1}) + eligibleTeamPartyScores = append(eligibleTeamPartyScores, &types.PartyContributionScore{Party: party, Score: score, IsEligible: eligible, StakingBalance: balance, OpenVolume: notional, TotalFeesPaid: paidFees[party], RankingIndex: -1}) + } else { + teamPartyScores = append(teamPartyScores, &types.PartyContributionScore{Party: party, Score: num.DecimalZero(), IsEligible: false, StakingBalance: balance, OpenVolume: notional, TotalFeesPaid: paidFees[party], RankingIndex: -1}) } } @@ -727,17 +859,29 @@ func calculateMetricForTeamUtil(ctx context.Context, return num.DecimalZero(), []*types.PartyContributionScore{} } + sort.Slice(eligibleTeamPartyScores, func(i, j int) bool { + return eligibleTeamPartyScores[i].Score.GreaterThan(eligibleTeamPartyScores[j].Score) + }) + sort.Slice(teamPartyScores, func(i, j int) bool { return teamPartyScores[i].Score.GreaterThan(teamPartyScores[j].Score) }) + lastUsed := int64(1) + for _, tps := range teamPartyScores { + if tps.IsEligible { + tps.RankingIndex = lastUsed + lastUsed += 1 + } + } + maxIndex := int(topN.Mul(num.DecimalFromInt64(int64(len(parties)))).IntPart()) // ensure non-zero, otherwise we have a divide-by-zero panic on our hands if maxIndex == 0 { maxIndex = 1 } - if len(teamPartyScores) < maxIndex { - maxIndex = len(teamPartyScores) + if len(eligibleTeamPartyScores) < maxIndex { + maxIndex = len(eligibleTeamPartyScores) } if maxIndex == 0 { return num.DecimalZero(), teamPartyScores @@ -745,7 +889,7 @@ func calculateMetricForTeamUtil(ctx context.Context, total := num.DecimalZero() for i := 0; i < maxIndex; i++ { - total = total.Add(teamPartyScores[i].Score) + total = total.Add(eligibleTeamPartyScores[i].Score) } return total.Div(num.DecimalFromInt64(int64(maxIndex))), teamPartyScores @@ -975,6 +1119,18 @@ func updateNotional(n *twNotional, notional *num.Uint, t, tn int64, time time.Ti n.t = time } +func calcNotionalAt(n *twNotional, t, tn int64) *num.Uint { + tnOverT := num.UintZero() + tnOverTComp := uScalingFactor.Clone() + if t != 0 { + tnOverT = num.NewUint(uint64(tn / t)) + tnOverTComp = tnOverTComp.Sub(tnOverTComp, tnOverT) + } + p1 := num.UintZero().Mul(n.currentEpochTWNotional, tnOverTComp) + p2 := num.UintZero().Mul(n.notional, tnOverT) + return num.UintZero().Div(p1.AddSum(p2), uScalingFactor) +} + // recordNotional tracks the time weighted average notional for the party per market. // notional = abs(position) x price / position_factor // price in asset decimals. @@ -1007,6 +1163,16 @@ func (mt *marketTracker) processNotionalEndOfEpoch(epochStartTime time.Time, end mt.epochTimeWeightedNotional = append(mt.epochTimeWeightedNotional, m) } +func (mt *marketTracker) processNotionalAtMilestone(epochStartTime time.Time, milestoneTime time.Time) { + t := int64(milestoneTime.Sub(epochStartTime).Seconds()) + m := make(map[string]*num.Uint, len(mt.twNotional)) + for party, twNotional := range mt.twNotional { + tn := int64(milestoneTime.Sub(twNotional.t).Seconds()) * scalingFactor + m[party] = calcNotionalAt(twNotional, t, tn) + } + mt.epochTimeWeightedNotional = append(mt.epochTimeWeightedNotional, m) +} + func (mat *MarketActivityTracker) getTWNotionalPosition(asset, party string, markets []string) *num.Uint { total := num.UintZero() mkts := markets @@ -1038,6 +1204,14 @@ func updatePosition(toi *twPosition, scaledAbsPos uint64, t, tn int64, time time toi.t = time } +func calculatePositionAt(toi *twPosition, t, tn int64) uint64 { + tnOverT := uint64(0) + if t != 0 { + tnOverT = uint64(tn / t) + } + return (toi.currentEpochTWPosition*(u64ScalingFactor-tnOverT) + (toi.position * tnOverT)) / u64ScalingFactor +} + // recordPosition records the current position of a party and the time of change. If there is a previous position then it is time weight updated with respect to the time // it has been in place during the epoch. func (mt *marketTracker) recordPosition(party string, absPos uint64, positionFactor num.Decimal, time time.Time, epochStartTime time.Time) { @@ -1085,6 +1259,16 @@ func (mt *marketTracker) processPositionEndOfEpoch(epochStartTime time.Time, end } } +func (mt *marketTracker) processPositionAtMilestone(epochStartTime time.Time, milestoneTime time.Time) { + t := int64(milestoneTime.Sub(epochStartTime).Seconds()) + m := make(map[string]uint64, len(mt.twPosition)) + for party, toi := range mt.twPosition { + tn := int64(milestoneTime.Sub(toi.t).Seconds()) * scalingFactor + m[party] = calculatePositionAt(toi, t, tn) + } + mt.epochTimeWeightedPosition = append(mt.epochTimeWeightedPosition, m) +} + // //// return metric ////// // recordM2M records the amount corresponding to mark to market (profit or loss). @@ -1144,6 +1328,25 @@ func (mt *marketTracker) processM2MEndOfEpoch() { mt.epochPartyM2M = append(mt.epochPartyM2M, m) } +func (mt *marketTracker) processM2MAtMilestone() { + m := map[string]num.Decimal{} + for party, m2m := range mt.partyM2M { + if _, ok := mt.twPosition[party]; !ok { + continue + } + p := mt.epochTimeWeightedPosition[len(mt.epochTimeWeightedPosition)-1][party] + + var v num.Decimal + if p == 0 { + v = num.DecimalZero() + } else { + v = m2m.Div(num.DecimalFromInt64(int64(p)).Div(dScalingFactor)) + } + m[party] = v + } + mt.epochPartyM2M = append(mt.epochPartyM2M, m) +} + // processPartyRealisedReturnOfEpoch is called at the end of the epoch to reset the running total for the next epoch and record the total m2m in the ended epoch. func (mt *marketTracker) processPartyRealisedReturnOfEpoch() { m := map[string]num.Decimal{} @@ -1157,6 +1360,14 @@ func (mt *marketTracker) processPartyRealisedReturnOfEpoch() { mt.partyRealisedReturn = map[string]decimal.Decimal{} } +func (mt *marketTracker) processPartyRealisedReturnAtMilestone() { + m := map[string]num.Decimal{} + for party, realised := range mt.partyRealisedReturn { + m[party] = realised + } + mt.epochPartyRealisedReturn = append(mt.epochPartyRealisedReturn, m) +} + // getReturns returns a slice of the total of the party's return by epoch in the given window. func (mt *marketTracker) getReturns(party string, windowSize int) ([]*num.Decimal, bool) { returns := make([]*num.Decimal, windowSize) diff --git a/core/execution/common/market_activity_tracker_internal_test.go b/core/execution/common/market_activity_tracker_internal_test.go index d37dba4f6e0..1e4c68d7e7a 100644 --- a/core/execution/common/market_activity_tracker_internal_test.go +++ b/core/execution/common/market_activity_tracker_internal_test.go @@ -346,6 +346,7 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) broker := bmocks.NewMockBroker(ctrl) broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).AnyTimes() tracker := NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) tracker.SetEligibilityChecker(&DummyEligibilityChecker{}) @@ -374,7 +375,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(0, 0), EndTime: time.Unix(60, 0)}) // get metrics for market m1 with window size=1 - metrics := tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics := tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -382,15 +384,17 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "75", metrics[1].Score.String()) // get metrics for market m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) require.Equal(t, "13.333332", metrics[0].Score.String()) require.Equal(t, "116.66666", metrics[1].Score.String()) - // get metrics for market m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + // get metrics for market m3 with window size=1 + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -398,7 +402,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "75", metrics[1].Score.String()) // get metrics for market m1,m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -406,7 +411,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "191.66666", metrics[1].Score.String()) // get metrics for all market window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -423,7 +429,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(60, 0), EndTime: time.Unix(120, 0)}) // get metrics for market m1 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -431,7 +438,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "100", metrics[1].Score.String()) // get metrics for market m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -439,7 +447,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "57.5", metrics[1].Score.String()) // get metrics for market m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -447,7 +456,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "300", metrics[1].Score.String()) // get metrics for market m1,m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -455,7 +465,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "157.5", metrics[1].Score.String()) // get metrics for all market window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -464,7 +475,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { // calc with window size = 2 // get metrics for market m1 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -472,7 +484,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "87.5", metrics[1].Score.String()) // get metrics for market m2 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -480,7 +493,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "87.08333", metrics[1].Score.String()) // get metrics for market m2 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -488,7 +502,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "187.5", metrics[1].Score.String()) // get metrics for market m1,m2 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -496,7 +511,8 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { require.Equal(t, "174.58333", metrics[1].Score.String()) // get metrics for all market window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -506,16 +522,24 @@ func TestCalculateMetricForIndividualsAvePosition(t *testing.T) { // now make p2 not eligible via not having sufficient governance token balanceChecker.EXPECT().GetAvailableBalance("p1").Return(num.NewUint(2), nil).Times(1) balanceChecker.EXPECT().GetAvailableBalance("p2").Return(nil, errors.New("some error")).Times(1) - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.NewUint(1), num.UintZero(), 2, gameID) - require.Equal(t, 1, len(metrics)) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.NewUint(1), num.UintZero(), 2, gameID, 1) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "0", metrics[1].StakingBalance.String()) // repeat now p2 has balance just not enough balanceChecker.EXPECT().GetAvailableBalance("p1").Return(num.NewUint(2), nil).Times(1) balanceChecker.EXPECT().GetAvailableBalance("p2").Return(num.NewUint(1), nil).Times(1) - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.NewUint(2), num.UintZero(), 2, gameID) - require.Equal(t, 1, len(metrics)) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.NewUint(2), num.UintZero(), 2, gameID, 1) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "2", metrics[0].StakingBalance.String()) + require.Equal(t, true, metrics[0].IsEligible) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "1", metrics[1].StakingBalance.String()) } func TestCalculateMetricForPartyAvePosition(t *testing.T) { @@ -761,6 +785,7 @@ func TestCalculateMetricForIndividualReturnVolatility(t *testing.T) { teams := mocks.NewMockTeams(ctrl) balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) broker := bmocks.NewMockBroker(ctrl) + broker.EXPECT().Send(gomock.Any()).AnyTimes() broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() tracker := NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) @@ -805,29 +830,64 @@ func TestCalculateMetricForIndividualReturnVolatility(t *testing.T) { gameID := "game123" // get metrics for market m1 with window size=1 - metrics := tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics := tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID, 1) // only one sample (window size=1) variance=0 by definition - require.Equal(t, 0, len(metrics)) + require.Equal(t, 2, len(metrics)) + require.Equal(t, false, metrics[0].IsEligible) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "0", metrics[0].Score.String()) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "0", metrics[1].Score.String()) // get metrics for market m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID, 1) // only one sample (window size=1) variance=0 by definition - require.Equal(t, 0, len(metrics)) + require.Equal(t, 2, len(metrics)) + require.Equal(t, false, metrics[0].IsEligible) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "0", metrics[0].Score.String()) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "0", metrics[1].Score.String()) // get metrics for market m3 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID, 1) // only one sample (window size=1) variance=0 by definition - require.Equal(t, 0, len(metrics)) + require.Equal(t, 2, len(metrics)) + require.Equal(t, false, metrics[0].IsEligible) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "0", metrics[0].Score.String()) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "0", metrics[1].Score.String()) // get metrics for market m1,m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID, 1) // only one sample (window size=1) variance=0 by definition - require.Equal(t, 0, len(metrics)) + require.Equal(t, 2, len(metrics)) + require.Equal(t, false, metrics[0].IsEligible) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "0", metrics[0].Score.String()) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "0", metrics[1].Score.String()) // get metrics for all market window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 1, gameID, 1) // only one sample (window size=1) variance=0 by definition - require.Equal(t, 0, len(metrics)) + require.Equal(t, 2, len(metrics)) + require.Equal(t, false, metrics[0].IsEligible) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "0", metrics[0].Score.String()) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "0", metrics[1].Score.String()) // // start epoch2 epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(60, 0)}) @@ -848,14 +908,19 @@ func TestCalculateMetricForIndividualReturnVolatility(t *testing.T) { // calc with window size = 2 // get metrics for market m1 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID) - require.Equal(t, 1, len(metrics)) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID, 1) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) // variance(3, 9.8181825322314569) => 11.6219032607065405 => 1/11.6219032607065405 = 0.08604442642 require.Equal(t, "0.086044426422046", metrics[0].Score.String()) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "0", metrics[1].Score.String()) // get metrics for market m2 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "0.2214532481172412", metrics[0].Score.String()) @@ -863,11 +928,19 @@ func TestCalculateMetricForIndividualReturnVolatility(t *testing.T) { require.Equal(t, "85.1257359604949139", metrics[1].Score.String()) // get metrics for market m3 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID) - require.Equal(t, 0, len(metrics)) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID, 1) + require.Equal(t, 2, len(metrics)) + require.Equal(t, false, metrics[0].IsEligible) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "0", metrics[0].Score.String()) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, "0", metrics[1].Score.String()) // get metrics for market m1,m2 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) // variance(2.5, 13.5681829072314944) = 30.6261682169828538 => 0.03265181569 @@ -876,7 +949,8 @@ func TestCalculateMetricForIndividualReturnVolatility(t *testing.T) { require.Equal(t, "574.5715725244936759", metrics[1].Score.String()) // get metrics for all market window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "p2", metrics[1].Party) @@ -888,16 +962,26 @@ func TestCalculateMetricForIndividualReturnVolatility(t *testing.T) { // now make p2 not eligible via not having sufficient governance token balanceChecker.EXPECT().GetAvailableBalance("p1").Return(num.NewUint(2), nil).Times(1) balanceChecker.EXPECT().GetAvailableBalance("p2").Return(nil, errors.New("some error")).Times(1) - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.NewUint(1), num.UintZero(), 2, gameID) - require.Equal(t, 1, len(metrics)) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.NewUint(1), num.UintZero(), 2, gameID, 1) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, true, metrics[0].IsEligible) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "2", metrics[0].StakingBalance.String()) + require.Equal(t, "0", metrics[1].StakingBalance.String()) // repeat now p2 has balance just not enough balanceChecker.EXPECT().GetAvailableBalance("p1").Return(num.NewUint(2), nil).Times(1) balanceChecker.EXPECT().GetAvailableBalance("p2").Return(num.NewUint(1), nil).Times(1) - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.NewUint(2), num.UintZero(), 2, gameID) - require.Equal(t, 1, len(metrics)) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, num.NewUint(2), num.UintZero(), 2, gameID, 1) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, true, metrics[0].IsEligible) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "2", metrics[0].StakingBalance.String()) + require.Equal(t, "1", metrics[1].StakingBalance.String()) } func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { @@ -907,6 +991,7 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { teams := mocks.NewMockTeams(ctrl) balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) broker := bmocks.NewMockBroker(ctrl) + broker.EXPECT().Send(gomock.Any()).AnyTimes() broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() tracker := NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) @@ -946,7 +1031,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { gameID := "game123" // get metrics for market m1 with window size=1 - metrics := tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics := tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "16.3636375537", metrics[0].Score.StringFixed(10)) @@ -954,7 +1040,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "-2", metrics[1].Score.String()) // get metrics for market m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "-3.7500003750", metrics[0].Score.StringFixed(10)) @@ -962,7 +1049,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "0.4285714531", metrics[1].Score.StringFixed(10)) // get metrics for market m3 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "6.6666666667", metrics[0].Score.StringFixed(10)) @@ -970,7 +1058,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "-1.3333333333", metrics[1].Score.StringFixed(10)) // get metrics for market m1,m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "12.6136371787", metrics[0].Score.StringFixed(10)) @@ -978,7 +1067,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "-1.5714285469", metrics[1].Score.StringFixed(10)) // get metrics for all market window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "19.2803038454", metrics[0].Score.StringFixed(10)) @@ -1002,7 +1092,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(60, 0), EndTime: time.Unix(120, 0)}) // get metrics for market m1 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "30", metrics[0].Score.String()) @@ -1010,7 +1101,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "-4.5", metrics[1].Score.String()) // get metrics for market m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "-5", metrics[0].Score.String()) @@ -1018,11 +1110,17 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "1.7391304348", metrics[1].Score.StringFixed(10)) // get metrics for market m3 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) - require.Equal(t, 0, len(metrics)) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) + require.Equal(t, 2, len(metrics)) + require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, false, metrics[0].IsEligible) + require.Equal(t, false, metrics[1].IsEligible) // get metrics for market m1,m2 with window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "25", metrics[0].Score.String()) @@ -1030,7 +1128,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "-2.7608695652", metrics[1].Score.StringFixed(10)) // get metrics for all market window size=1 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 1, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "25", metrics[0].Score.String()) @@ -1039,7 +1138,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { // calc with window size = 2 // get metrics for market m1 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "23.1818187769", metrics[0].Score.StringFixed(10)) @@ -1047,7 +1147,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "-3.25", metrics[1].Score.String()) // get metrics for market m2 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "-4.3750001875", metrics[0].Score.StringFixed(10)) @@ -1055,7 +1156,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "1.0838509439", metrics[1].Score.StringFixed(10)) // get metrics for market m3 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m3"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "3.3333333333", metrics[0].Score.StringFixed(10)) @@ -1063,7 +1165,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "-0.6666666667", metrics[1].Score.StringFixed(10)) // get metrics for market m1,m2 with window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{"m1", "m2"}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "18.8068185894", metrics[0].Score.StringFixed(10)) @@ -1071,7 +1174,8 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { require.Equal(t, "-2.1661490561", metrics[1].Score.StringFixed(10)) // get metrics for all market window size=2 - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).Times(2) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.UintZero(), num.UintZero(), 2, gameID, 1) require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) require.Equal(t, "22.1401519227", metrics[0].Score.StringFixed(10)) @@ -1081,16 +1185,26 @@ func TestCalculateMetricForIndividualsRelativeReturn(t *testing.T) { // now make p2 not eligible via not having sufficient governance token balanceChecker.EXPECT().GetAvailableBalance("p1").Return(num.NewUint(2), nil).Times(1) balanceChecker.EXPECT().GetAvailableBalance("p2").Return(nil, errors.New("some error")).Times(1) - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.NewUint(1), num.UintZero(), 2, gameID) - require.Equal(t, 1, len(metrics)) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.NewUint(1), num.UintZero(), 2, gameID, 1) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, true, metrics[0].IsEligible) + require.Equal(t, "2", metrics[0].StakingBalance.String()) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "0", metrics[1].StakingBalance.String()) // repeat now p2 has balance just not enough balanceChecker.EXPECT().GetAvailableBalance("p1").Return(num.NewUint(2), nil).Times(1) balanceChecker.EXPECT().GetAvailableBalance("p2").Return(num.NewUint(1), nil).Times(1) - metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.NewUint(2), num.UintZero(), 2, gameID) - require.Equal(t, 1, len(metrics)) + metrics = tracker.calculateMetricForIndividuals(ctx, "a1", []string{"p1", "p2"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, num.NewUint(2), num.UintZero(), 2, gameID, 1) + require.Equal(t, 2, len(metrics)) require.Equal(t, "p1", metrics[0].Party) + require.Equal(t, true, metrics[0].IsEligible) + require.Equal(t, "2", metrics[0].StakingBalance.String()) + require.Equal(t, "p2", metrics[1].Party) + require.Equal(t, false, metrics[1].IsEligible) + require.Equal(t, "1", metrics[1].StakingBalance.String()) } func TestCalculateMetricForPartyRelativeReturn(t *testing.T) { @@ -1387,11 +1501,11 @@ func TestCalculateMetricForParty(t *testing.T) { func TestCalculateMetricForTeamUtil(t *testing.T) { ctx := context.Background() - isEligible := func(_ context.Context, asset, party string, markets []string, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, _ string) bool { + isEligible := func(_ context.Context, asset, party string, markets []string, minStakingBalanceRequired *num.Uint, notionalTimeWeightedAveragePositionRequired *num.Uint, _ string) (bool, *num.Uint, *num.Uint) { if party == "party1" || party == "party2" || party == "party3" || party == "party4" { - return true + return true, num.NewUint(100), num.NewUint(200) } - return false + return false, num.UintZero(), num.UintZero() } calculateMetricForParty := func(asset, party string, marketsInScope []string, metric vega.DispatchMetric, windowSize int) (num.Decimal, bool) { if party == "party1" { @@ -1413,12 +1527,12 @@ func TestCalculateMetricForTeamUtil(t *testing.T) { } gameID := "game123" - teamScore, partyScores := calculateMetricForTeamUtil(ctx, "asset1", []string{"party1", "party2", "party3", "party4", "party5"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintOne(), num.UintOne(), 5, num.DecimalFromFloat(0.5), isEligible, calculateMetricForParty, gameID) + teamScore, partyScores := calculateMetricForTeamUtil(ctx, "asset1", []string{"party1", "party2", "party3", "party4", "party5"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintOne(), num.UintOne(), int(5), num.DecimalFromFloat(0.5), isEligible, calculateMetricForParty, gameID, map[string]*num.Uint{}) // we're indicating the the score of the team need to be the mean of the top 0.5 * number of participants = floor(0.5*5) = 2 // the top scores are 2.5 and 2 => team score should be 2.25 // 4 party scores expected (1-4) as party5 is not eligible require.Equal(t, "2.25", teamScore.String()) - require.Equal(t, 4, len(partyScores)) + require.Equal(t, 5, len(partyScores)) require.Equal(t, "party4", partyScores[0].Party) require.Equal(t, "2.5", partyScores[0].Score.String()) require.Equal(t, "party2", partyScores[1].Party) @@ -1427,11 +1541,15 @@ func TestCalculateMetricForTeamUtil(t *testing.T) { require.Equal(t, "1.5", partyScores[2].Score.String()) require.Equal(t, "party3", partyScores[3].Party) require.Equal(t, "0.5", partyScores[3].Score.String()) + require.Equal(t, "party5", partyScores[4].Party) + require.Equal(t, false, partyScores[4].IsEligible) // lets repeat the check when there is no one eligible - teamScore, partyScores = calculateMetricForTeamUtil(ctx, "asset1", []string{"party5"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintOne(), num.UintOne(), 5, num.DecimalFromFloat(0.5), isEligible, calculateMetricForParty, gameID) + teamScore, partyScores = calculateMetricForTeamUtil(ctx, "asset1", []string{"party5"}, []string{}, vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, num.UintOne(), num.UintOne(), 5, num.DecimalFromFloat(0.5), isEligible, calculateMetricForParty, gameID, map[string]*num.Uint{}) require.Equal(t, "0", teamScore.String()) - require.Equal(t, 0, len(partyScores)) + require.Equal(t, 1, len(partyScores)) + require.Equal(t, "party5", partyScores[0].Party) + require.Equal(t, false, partyScores[0].IsEligible) } type DummyEpochEngine struct { 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..61b677ace76 100644 --- a/core/execution/common/market_activity_tracker_test.go +++ b/core/execution/common/market_activity_tracker_test.go @@ -180,14 +180,44 @@ 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.RemoveAMMParty("asset1", "market1", "sub2") + require.Equal(t, map[string]struct{}{"sub1": {}}, tracker.GetAllAMMParties("asset1", nil)) + + tracker.RemoveAMMParty("asset1", "market1", "sub1") + require.Equal(t, map[string]struct{}{}, tracker.GetAllAMMParties("asset1", nil)) +} + func TestGetScores(t *testing.T) { ctx := context.Background() epochService := &TestEpochEngine{} ctrl := gomock.NewController(t) teams := mocks.NewMockTeams(ctrl) balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).AnyTimes() broker := bmocks.NewMockBroker(ctrl) broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).AnyTimes() tracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) tracker.SetEligibilityChecker(&EligibilityChecker{}) @@ -284,16 +314,23 @@ func TestGetScores(t *testing.T) { // now look only on market 2: scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1, Markets: []string{"market2"}}) - require.Equal(t, 1, len(scores)) - - require.Equal(t, "party2", scores[0].Party) - require.Equal(t, "1", scores[0].Score.String()) + require.Equal(t, 2, len(scores)) + require.Equal(t, "party2", scores[1].Party) + require.Equal(t, "1", scores[1].Score.String()) + require.Equal(t, true, scores[1].IsEligible) + require.Equal(t, "party1", scores[0].Party) + require.Equal(t, false, scores[0].IsEligible) + require.Equal(t, "0", scores[0].Score.String()) // now look at asset2 with no market qualifer scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset2", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1}) - require.Equal(t, 1, len(scores)) + require.Equal(t, 2, len(scores)) require.Equal(t, "party1", scores[0].Party) require.Equal(t, "1", scores[0].Score.String()) + require.Equal(t, true, scores[0].IsEligible) + require.Equal(t, "party2", scores[1].Party) + require.Equal(t, "0", scores[1].Score.String()) + require.Equal(t, false, scores[1].IsEligible) epochService.target(context.Background(), types.Epoch{Seq: 3, Action: vgproto.EpochAction_EPOCH_ACTION_START}) transfersM1 = []*types.Transfer{ @@ -327,8 +364,10 @@ func TestGetScoresIndividualsDifferentScopes(t *testing.T) { ctrl := gomock.NewController(t) teams := mocks.NewMockTeams(ctrl) balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).AnyTimes() broker := bmocks.NewMockBroker(ctrl) broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).AnyTimes() tracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) tracker.SetEligibilityChecker(&EligibilityChecker{}) @@ -366,6 +405,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 +453,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 @@ -425,16 +477,24 @@ func TestGetScoresIndividualsDifferentScopes(t *testing.T) { // now look only on market 2: scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1, Markets: []string{"market2"}}) - require.Equal(t, 1, len(scores)) + require.Equal(t, 2, len(scores)) - require.Equal(t, "party2", scores[0].Party) - require.Equal(t, "1", scores[0].Score.String()) + require.Equal(t, "party1", scores[0].Party) + require.Equal(t, "0", scores[0].Score.String()) + require.Equal(t, false, scores[0].IsEligible) + require.Equal(t, "party2", scores[1].Party) + require.Equal(t, "1", scores[1].Score.String()) + require.Equal(t, true, scores[1].IsEligible) // now look at asset2 with no market qualifer scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset2", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1}) - require.Equal(t, 1, len(scores)) + require.Equal(t, 2, len(scores)) require.Equal(t, "party1", scores[0].Party) + require.Equal(t, true, scores[0].IsEligible) require.Equal(t, "1", scores[0].Score.String()) + require.Equal(t, "party2", scores[1].Party) + require.Equal(t, "0", scores[1].Score.String()) + require.Equal(t, false, scores[1].IsEligible) epochService.target(context.Background(), types.Epoch{Seq: 3, Action: vgproto.EpochAction_EPOCH_ACTION_START}) transfersM1 = []*types.Transfer{ @@ -498,7 +558,9 @@ func TestFeesTrackerWith0(t *testing.T) { ctrl := gomock.NewController(t) teams := mocks.NewMockTeams(ctrl) balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).AnyTimes() broker := bmocks.NewMockBroker(ctrl) + broker.EXPECT().Send(gomock.Any()).AnyTimes() tracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochEngine.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) epochEngine.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_START}) @@ -521,7 +583,9 @@ func TestFeesTrackerWith0(t *testing.T) { tracker.UpdateFeesFromTransfers("asset1", "market1", transfersM1) epochEngine.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END}) scores := tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1, Markets: []string{"market1"}}) - require.Equal(t, 0, len(scores)) + require.Equal(t, 2, len(scores)) + require.Equal(t, false, scores[0].IsEligible) + require.Equal(t, false, scores[1].IsEligible) } func TestGetLastEpochTakeFees(t *testing.T) { @@ -681,7 +745,9 @@ func TestFeesTracker(t *testing.T) { ctrl := gomock.NewController(t) teams := mocks.NewMockTeams(ctrl) balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).AnyTimes() broker := bmocks.NewMockBroker(ctrl) + broker.EXPECT().Send(gomock.Any()).AnyTimes() broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() tracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochEngine.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) @@ -756,15 +822,23 @@ func TestFeesTracker(t *testing.T) { // asset2 TransferTypeMakerFeePay scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1, Markets: []string{"market2"}}) - require.Equal(t, 1, len(scores)) + require.Equal(t, 2, len(scores)) require.Equal(t, "1", scores[0].Score.String()) require.Equal(t, "party1", scores[0].Party) + require.Equal(t, true, scores[0].IsEligible) + require.Equal(t, "0", scores[1].Score.String()) + require.Equal(t, "party2", scores[1].Party) + require.Equal(t, false, scores[1].IsEligible) // asset2 TransferTypeMakerFeePay scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1, Markets: []string{"market2"}}) - require.Equal(t, 1, len(scores)) - require.Equal(t, "1", scores[0].Score.String()) - require.Equal(t, "party2", scores[0].Party) + require.Equal(t, 2, len(scores)) + require.Equal(t, "0", scores[0].Score.String()) + require.Equal(t, "party1", scores[0].Party) + require.Equal(t, false, scores[0].IsEligible) + require.Equal(t, "1", scores[1].Score.String()) + require.Equal(t, "party2", scores[1].Party) + require.Equal(t, true, scores[1].IsEligible) // check state has changed state2, _, err := tracker.GetState(key) @@ -775,6 +849,8 @@ func TestFeesTracker(t *testing.T) { ctrl = gomock.NewController(t) teams = mocks.NewMockTeams(ctrl) balanceChecker = mocks.NewMockAccountBalanceChecker(ctrl) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).AnyTimes() + broker.EXPECT().Send(gomock.Any()).AnyTimes() trackerLoad := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochEngineLoad.NotifyOnEpoch(trackerLoad.OnEpochEvent, trackerLoad.OnEpochRestore) @@ -791,9 +867,13 @@ func TestFeesTracker(t *testing.T) { // check a restored party exist in the restored engine scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1, Markets: []string{"market2"}}) - require.Equal(t, 1, len(scores)) + require.Equal(t, 2, len(scores)) require.Equal(t, "1", scores[0].Score.String()) require.Equal(t, "party1", scores[0].Party) + require.Equal(t, true, scores[0].IsEligible) + require.Equal(t, "0", scores[1].Score.String()) + require.Equal(t, "party2", scores[1].Party) + require.Equal(t, false, scores[1].IsEligible) // end the epoch epochEngineLoad.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_END}) @@ -808,9 +888,21 @@ func TestFeesTracker(t *testing.T) { metrics := []vgproto.DispatchMetric{vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, vgproto.DispatchMetric_DISPATCH_METRIC_LP_FEES_RECEIVED, vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED} for _, m := range metrics { scores = trackerLoad.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset1", Metric: m, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1, Markets: []string{"market1"}}) - require.Equal(t, 0, len(scores)) + require.Equal(t, 2, len(scores)) + require.Equal(t, "0", scores[0].Score.String()) + require.Equal(t, "party1", scores[0].Party) + require.Equal(t, false, scores[0].IsEligible) + require.Equal(t, "0", scores[1].Score.String()) + require.Equal(t, "party2", scores[1].Party) + require.Equal(t, false, scores[1].IsEligible) scores = trackerLoad.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "asset1", Metric: m, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1, Markets: []string{"market2"}}) - require.Equal(t, 0, len(scores)) + require.Equal(t, 2, len(scores)) + require.Equal(t, "0", scores[0].Score.String()) + require.Equal(t, "party1", scores[0].Party) + require.Equal(t, false, scores[0].IsEligible) + require.Equal(t, "0", scores[1].Score.String()) + require.Equal(t, "party2", scores[1].Party) + require.Equal(t, false, scores[1].IsEligible) } } @@ -1096,8 +1188,10 @@ func TestPositionMetric(t *testing.T) { ctrl := gomock.NewController(t) teams := mocks.NewMockTeams(ctrl) balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).AnyTimes() broker := bmocks.NewMockBroker(ctrl) broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).AnyTimes() tracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) @@ -1203,8 +1297,10 @@ func TestRealisedReturnMetric(t *testing.T) { ctrl := gomock.NewController(t) teams := mocks.NewMockTeams(ctrl) balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).AnyTimes() broker := bmocks.NewMockBroker(ctrl) broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).AnyTimes() tracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) @@ -1282,7 +1378,10 @@ func TestRealisedReturnMetric(t *testing.T) { // end the epoch epochService.target(context.Background(), types.Epoch{Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: epochStartTime.Add(2000 * time.Second), EndTime: epochStartTime.Add(3000 * time.Second)}) scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 1}) - require.Equal(t, 0, len(scores)) + require.Equal(t, 1, len(scores)) + require.Equal(t, "p1", scores[0].Party) + require.Equal(t, "0", scores[0].Score.String()) + require.Equal(t, false, scores[0].IsEligible) scores = tracker.CalculateMetricForIndividuals(ctx, &vgproto.DispatchStrategy{AssetForMetric: "a1", Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, WindowLength: 2}) require.Equal(t, 1, len(scores)) @@ -1301,8 +1400,10 @@ func TestRelativeReturnMetric(t *testing.T) { ctrl := gomock.NewController(t) teams := mocks.NewMockTeams(ctrl) balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.UintZero(), nil).AnyTimes() broker := bmocks.NewMockBroker(ctrl) + broker.EXPECT().Send(gomock.Any()).AnyTimes() broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() tracker := common.NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) diff --git a/core/execution/common/mat_intermediate_scores_internal_test.go b/core/execution/common/mat_intermediate_scores_internal_test.go new file mode 100644 index 00000000000..a60ffc9f120 --- /dev/null +++ b/core/execution/common/mat_intermediate_scores_internal_test.go @@ -0,0 +1,1115 @@ +// 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 ( + "context" + "testing" + "time" + + bmocks "code.vegaprotocol.io/vega/core/broker/mocks" + "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/execution/common/mocks" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/logging" + vgproto "code.vegaprotocol.io/vega/protos/vega" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" +) + +func TestPublishGameMetricAveragePosition(t *testing.T) { + ctx := context.Background() + epochService := &DummyEpochEngine{} + ctrl := gomock.NewController(t) + teams := mocks.NewMockTeams(ctrl) + balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + broker := bmocks.NewMockBroker(ctrl) + gameScoreEvents := []events.Event{} + + broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + if evt.StreamMessage().GetGameScores() != nil { + gameScoreEvents = append(gameScoreEvents, evt) + } + }).AnyTimes() + tracker := NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) + epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) + tracker.SetEligibilityChecker(&DummyEligibilityChecker{}) + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Time{}}) + + // add some markets for 2 different assets + tracker.MarketProposed("a1", "m1", "z1") + tracker.MarketProposed("a1", "m2", "z2") + tracker.MarketProposed("a1", "m3", "z3") + + // add some markets for 2 different assets + tracker.MarketProposed("a1", "m1", "z1") + tracker.MarketProposed("a1", "m2", "z2") + tracker.MarketProposed("a1", "m3", "z3") + + // record some values for all metrics + tracker.RecordPosition("a1", "p1", "m1", 10, num.NewUint(1), num.DecimalOne(), time.Unix(5, 0)) + tracker.RecordPosition("a1", "p1", "m2", 20, num.NewUint(2), num.DecimalOne(), time.Unix(20, 0)) + tracker.RecordPosition("a1", "p1", "m3", 30, num.NewUint(3), num.DecimalOne(), time.Unix(30, 0)) + tracker.RecordPosition("a1", "p2", "m1", 100, num.NewUint(10), num.DecimalOne(), time.Unix(15, 0)) + tracker.RecordPosition("a1", "p2", "m2", 200, num.NewUint(20), num.DecimalOne(), time.Unix(25, 0)) + tracker.RecordPosition("a1", "p2", "m3", 300, num.NewUint(30), num.DecimalOne(), time.Unix(45, 0)) + + // end epoch1 + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(0, 0), EndTime: time.Unix(60, 0)}) + + // get metrics for market m1 with window size=1 + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).AnyTimes() + + ds1 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + Markets: []string{"m1"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds2 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + Markets: []string{"m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds3 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + Markets: []string{"m3"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds4 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + Markets: []string{"m1", "m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds5 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_AVERAGE_POSITION, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + + // calculate intermediate scores + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(60, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 := gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "9.166666", ps1[0].Score) + require.Equal(t, "75", ps1[1].Score) + + ps2 := gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "13.333332", ps2[0].Score) + require.Equal(t, "116.66666", ps2[1].Score) + + ps3 := gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "15", ps3[0].Score) + require.Equal(t, "75", ps3[1].Score) + + ps4 := gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "22.499998", ps4[0].Score) + require.Equal(t, "191.66666", ps4[1].Score) + + ps5 := gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "37.499998", ps5[0].Score) + require.Equal(t, "266.66666", ps5[1].Score) + + // now we end the epoch and make sure that we get the exact same results + gameScoreEvents = []events.Event{} + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(0, 0), EndTime: time.Unix(60, 0)}) + + // we expect that if we take a snapshot of scores now, it looks identical because we didn't change the time + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(60, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "9.166666", ps1[0].Score) + require.Equal(t, "75", ps1[1].Score) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "13.333332", ps2[0].Score) + require.Equal(t, "116.66666", ps2[1].Score) + + ps3 = gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "15", ps3[0].Score) + require.Equal(t, "75", ps3[1].Score) + + ps4 = gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "22.499998", ps4[0].Score) + require.Equal(t, "191.66666", ps4[1].Score) + + ps5 = gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "37.499998", ps5[0].Score) + require.Equal(t, "266.66666", ps5[1].Score) + + // start epoch 2 and record some activity + epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(60, 0)}) + tracker.RecordPosition("a1", "p1", "m1", 20, num.NewUint(5), num.DecimalOne(), time.Unix(90, 0)) + tracker.RecordPosition("a1", "p2", "m2", 10, num.NewUint(10), num.DecimalOne(), time.Unix(75, 0)) + tracker.RecordPosition("a2", "p1", "m3", 20, num.NewUint(5), num.DecimalOne(), time.Unix(90, 0)) + tracker.RecordPosition("a2", "p2", "m2", 10, num.NewUint(10), num.DecimalOne(), time.Unix(75, 0)) + + gameScoreEvents = []events.Event{} + + // lets look at the events when the window size is 1 + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(120, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "15", ps1[0].Score) + require.Equal(t, "100", ps1[1].Score) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "20", ps2[0].Score) + require.Equal(t, "57.5", ps2[1].Score) + + ps3 = gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "30", ps3[0].Score) + require.Equal(t, "300", ps3[1].Score) + + ps4 = gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "35", ps4[0].Score) + require.Equal(t, "157.5", ps4[1].Score) + + ps5 = gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "65", ps5[0].Score) + require.Equal(t, "457.5", ps5[1].Score) + + // now lets change the window to 2: + ds1.WindowLength = 2 + ds2.WindowLength = 2 + ds3.WindowLength = 2 + ds4.WindowLength = 2 + ds5.WindowLength = 2 + + gameScoreEvents = []events.Event{} + + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(120, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "12.083333", ps1[0].Score) + require.Equal(t, "87.5", ps1[1].Score) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "16.666666", ps2[0].Score) + require.Equal(t, "87.08333", ps2[1].Score) + + ps3 = gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "22.5", ps3[0].Score) + require.Equal(t, "187.5", ps3[1].Score) + + ps4 = gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "28.749999", ps4[0].Score) + require.Equal(t, "174.58333", ps4[1].Score) + + ps5 = gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "51.249999", ps5[0].Score) + require.Equal(t, "362.08333", ps5[1].Score) +} + +func TestPublishGameMetricReturnVolatility(t *testing.T) { + ctx := context.Background() + epochService := &DummyEpochEngine{} + ctrl := gomock.NewController(t) + teams := mocks.NewMockTeams(ctrl) + balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + broker := bmocks.NewMockBroker(ctrl) + gameScoreEvents := []events.Event{} + broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + if evt.StreamMessage().GetGameScores() != nil { + gameScoreEvents = append(gameScoreEvents, evt) + } + }).AnyTimes() + tracker := NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) + epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) + tracker.SetEligibilityChecker(&DummyEligibilityChecker{}) + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Time{}}) + + // add some markets for 2 different assets + tracker.MarketProposed("a1", "m1", "z1") + tracker.MarketProposed("a1", "m2", "z2") + tracker.MarketProposed("a1", "m3", "z3") + + // add some markets for 2 different assets + tracker.MarketProposed("a1", "m1", "z1") + tracker.MarketProposed("a1", "m2", "z2") + tracker.MarketProposed("a1", "m3", "z3") + + // record some values for all metrics + tracker.RecordPosition("a1", "p1", "m1", 10, num.NewUint(1), num.DecimalOne(), time.Unix(5, 0)) + tracker.RecordPosition("a1", "p1", "m2", 20, num.NewUint(2), num.DecimalOne(), time.Unix(20, 0)) + tracker.RecordPosition("a1", "p1", "m3", 30, num.NewUint(3), num.DecimalOne(), time.Unix(30, 0)) + tracker.RecordPosition("a1", "p2", "m1", 100, num.NewUint(10), num.DecimalOne(), time.Unix(15, 0)) + tracker.RecordPosition("a1", "p2", "m2", 200, num.NewUint(20), num.DecimalOne(), time.Unix(25, 0)) + tracker.RecordPosition("a1", "p2", "m3", 300, num.NewUint(30), num.DecimalOne(), time.Unix(45, 0)) + tracker.RecordPosition("a1", "p3", "m1", 10, num.NewUint(1), num.DecimalOne(), time.Unix(10, 0)) + tracker.RecordPosition("a1", "p3", "m2", 20, num.NewUint(2), num.DecimalOne(), time.Unix(10, 0)) + tracker.RecordPosition("a1", "p3", "m3", 30, num.NewUint(3), num.DecimalOne(), time.Unix(10, 0)) + + tracker.RecordM2M("a1", "p1", "m1", num.DecimalFromInt64(80)) + tracker.RecordM2M("a1", "p2", "m1", num.DecimalFromInt64(20)) + tracker.RecordM2M("a1", "p3", "m1", num.DecimalFromInt64(-100)) + tracker.RecordM2M("a1", "p1", "m1", num.DecimalFromInt64(10)) + tracker.RecordM2M("a1", "p2", "m1", num.DecimalFromInt64(-10)) + tracker.RecordM2M("a1", "p1", "m2", num.DecimalFromInt64(50)) + tracker.RecordM2M("a1", "p2", "m2", num.DecimalFromInt64(-5)) + tracker.RecordM2M("a1", "p3", "m2", num.DecimalFromInt64(-45)) + tracker.RecordM2M("a1", "p1", "m3", num.DecimalFromInt64(-35)) + tracker.RecordM2M("a1", "p2", "m3", num.DecimalFromInt64(35)) + + // get metrics for market m1 with window size=1 + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).AnyTimes() + + ds1 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, + Markets: []string{"m1"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds2 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, + Markets: []string{"m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds3 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, + Markets: []string{"m3"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds4 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, + Markets: []string{"m1", "m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds5 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RETURN_VOLATILITY, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(60, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 := gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "0", ps1[0].Score) + require.Equal(t, "0", ps1[1].Score) + + ps2 := gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "0", ps2[0].Score) + require.Equal(t, "0", ps2[1].Score) + + ps3 := gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "0", ps3[0].Score) + require.Equal(t, "0", ps3[1].Score) + + ps4 := gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "0", ps4[0].Score) + require.Equal(t, "0", ps4[1].Score) + + ps5 := gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "0", ps5[0].Score) + require.Equal(t, "0", ps5[1].Score) + + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(0, 0), EndTime: time.Unix(60, 0)}) + epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(60, 0)}) + tracker.RecordPosition("a1", "p1", "m1", 20, num.NewUint(5), num.DecimalOne(), time.Unix(90, 0)) + tracker.RecordPosition("a1", "p2", "m2", 10, num.NewUint(10), num.DecimalOne(), time.Unix(75, 0)) + tracker.RecordPosition("a1", "p3", "m1", 10, num.NewUint(10), num.DecimalOne(), time.Unix(75, 0)) + tracker.RecordPosition("a2", "p1", "m3", 20, num.NewUint(5), num.DecimalOne(), time.Unix(90, 0)) + tracker.RecordPosition("a2", "p2", "m2", 10, num.NewUint(10), num.DecimalOne(), time.Unix(75, 0)) + + tracker.RecordM2M("a1", "p1", "m1", num.DecimalFromInt64(45)) + tracker.RecordM2M("a1", "p3", "m1", num.DecimalFromInt64(-45)) + tracker.RecordM2M("a1", "p1", "m2", num.DecimalFromInt64(-10)) + tracker.RecordM2M("a1", "p2", "m2", num.DecimalFromInt64(10)) + // nothing in m3 + + ds1.WindowLength = 2 + ds2.WindowLength = 2 + ds3.WindowLength = 2 + ds4.WindowLength = 2 + ds5.WindowLength = 2 + + gameScoreEvents = []events.Event{} + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(120, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "0.086044426422046", ps1[0].Score) + require.Equal(t, "0", ps1[1].Score) + require.Equal(t, true, ps1[0].IsEligible) + require.Equal(t, false, ps1[1].IsEligible) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "0.2214532481172412", ps2[0].Score) + require.Equal(t, "85.1257359604949139", ps2[1].Score) + require.Equal(t, true, ps2[0].IsEligible) + require.Equal(t, true, ps2[1].IsEligible) + + ps3 = gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "0", ps3[0].Score) + require.Equal(t, "0", ps3[1].Score) + require.Equal(t, false, ps3[0].IsEligible) + require.Equal(t, false, ps1[1].IsEligible) + + ps4 = gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "0.0326518156928779", ps4[0].Score) + require.Equal(t, "574.5715725244936759", ps4[1].Score) + require.Equal(t, true, ps4[0].IsEligible) + require.Equal(t, true, ps4[1].IsEligible) + + ps5 = gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "0.0524262906455334", ps5[0].Score) + require.Equal(t, "27.2358805547724978", ps5[1].Score) + require.Equal(t, true, ps5[0].IsEligible) + require.Equal(t, true, ps5[1].IsEligible) + + // now end the epoch properly + epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(60, 0), EndTime: time.Unix(120, 0)}) + epochService.target(context.Background(), types.Epoch{Seq: 3, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(120, 0)}) + + // record some m2ms + tracker.RecordM2M("a1", "p1", "m1", num.DecimalFromInt64(20)) + tracker.RecordM2M("a1", "p3", "m1", num.DecimalFromInt64(-25)) + tracker.RecordM2M("a1", "p1", "m2", num.DecimalFromInt64(-15)) + tracker.RecordM2M("a1", "p2", "m2", num.DecimalFromInt64(15)) + + gameScoreEvents = []events.Event{} + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(150, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "1", ps1[0].Score) + require.Equal(t, "0", ps1[1].Score) + require.Equal(t, true, ps1[0].IsEligible) + require.Equal(t, false, ps1[1].IsEligible) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "64", ps2[0].Score) + require.Equal(t, "2.2746573501746843", ps2[1].Score) + require.Equal(t, true, ps2[0].IsEligible) + require.Equal(t, true, ps2[1].IsEligible) + + ps3 = gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "0", ps3[0].Score) + require.Equal(t, "0", ps3[1].Score) + require.Equal(t, false, ps3[0].IsEligible) + require.Equal(t, false, ps1[1].IsEligible) + + ps4 = gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "0.7901234567901235", ps4[0].Score) + require.Equal(t, "2.2746573501746843", ps4[1].Score) + require.Equal(t, true, ps4[0].IsEligible) + require.Equal(t, true, ps4[1].IsEligible) + + ps5 = gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "0.7901234567901235", ps5[0].Score) + require.Equal(t, "2.2746573501746843", ps5[1].Score) + require.Equal(t, true, ps5[0].IsEligible) + require.Equal(t, true, ps5[1].IsEligible) +} + +func TestPublishGameMetricRelativeReturn(t *testing.T) { + ctx := context.Background() + epochService := &DummyEpochEngine{} + ctrl := gomock.NewController(t) + teams := mocks.NewMockTeams(ctrl) + balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + broker := bmocks.NewMockBroker(ctrl) + gameScoreEvents := []events.Event{} + broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + if evt.StreamMessage().GetGameScores() != nil { + gameScoreEvents = append(gameScoreEvents, evt) + } + }).AnyTimes() + tracker := NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) + epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) + tracker.SetEligibilityChecker(&DummyEligibilityChecker{}) + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(0, 0)}) + + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).AnyTimes() + + ds1 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, + Markets: []string{"m1"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds2 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, + Markets: []string{"m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds3 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, + Markets: []string{"m3"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds4 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, + Markets: []string{"m1", "m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds5 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_RELATIVE_RETURN, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + + // add some markets for 2 different assets + tracker.MarketProposed("a1", "m1", "z1") + tracker.MarketProposed("a1", "m2", "z2") + tracker.MarketProposed("a1", "m3", "z3") + + // record some values for all metrics + tracker.RecordPosition("a1", "p1", "m1", 10, num.NewUint(1), num.DecimalOne(), time.Unix(5, 0)) + tracker.RecordPosition("a1", "p1", "m2", 20, num.NewUint(2), num.DecimalOne(), time.Unix(20, 0)) + tracker.RecordPosition("a1", "p1", "m3", 30, num.NewUint(3), num.DecimalOne(), time.Unix(30, 0)) + tracker.RecordPosition("a1", "p2", "m1", 100, num.NewUint(10), num.DecimalOne(), time.Unix(15, 0)) + tracker.RecordPosition("a1", "p2", "m2", 200, num.NewUint(20), num.DecimalOne(), time.Unix(25, 0)) + tracker.RecordPosition("a1", "p2", "m3", 300, num.NewUint(30), num.DecimalOne(), time.Unix(45, 0)) + + tracker.RecordM2M("a1", "p1", "m1", num.DecimalFromInt64(-100)) + tracker.RecordM2M("a1", "p2", "m1", num.DecimalFromInt64(100)) + tracker.RecordM2M("a1", "p1", "m1", num.DecimalFromInt64(250)) + tracker.RecordM2M("a1", "p2", "m1", num.DecimalFromInt64(-250)) + tracker.RecordM2M("a1", "p1", "m2", num.DecimalFromInt64(-50)) + tracker.RecordM2M("a1", "p2", "m2", num.DecimalFromInt64(50)) + tracker.RecordM2M("a1", "p1", "m3", num.DecimalFromInt64(100)) + tracker.RecordM2M("a1", "p2", "m3", num.DecimalFromInt64(-100)) + + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(60, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 := gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "16.3636375537190948", ps1[0].Score) + require.Equal(t, "-2", ps1[1].Score) + + ps2 := gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "-3.7500003750000375", ps2[0].Score) + require.Equal(t, "0.4285714530612259", ps2[1].Score) + + ps3 := gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "6.6666666666666667", ps3[0].Score) + require.Equal(t, "-1.3333333333333333", ps3[1].Score) + + ps4 := gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "12.6136371787190573", ps4[0].Score) + require.Equal(t, "-1.5714285469387741", ps4[1].Score) + + ps5 := gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "19.280303845385724", ps5[0].Score) + require.Equal(t, "-2.9047618802721074", ps5[1].Score) + + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(0, 0), EndTime: time.Unix(60, 0)}) + epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(60, 0)}) + + tracker.RecordPosition("a1", "p1", "m1", 20, num.NewUint(5), num.DecimalOne(), time.Unix(90, 0)) + tracker.RecordPosition("a1", "p2", "m2", 10, num.NewUint(10), num.DecimalOne(), time.Unix(75, 0)) + tracker.RecordPosition("a2", "p1", "m3", 20, num.NewUint(5), num.DecimalOne(), time.Unix(90, 0)) + tracker.RecordPosition("a2", "p2", "m2", 10, num.NewUint(10), num.DecimalOne(), time.Unix(75, 0)) + + tracker.RecordM2M("a1", "p1", "m1", num.DecimalFromInt64(450)) + tracker.RecordM2M("a1", "p2", "m1", num.DecimalFromInt64(-450)) + tracker.RecordM2M("a1", "p1", "m2", num.DecimalFromInt64(-100)) + tracker.RecordM2M("a1", "p2", "m2", num.DecimalFromInt64(100)) + // nothing in m3 + + gameScoreEvents = []events.Event{} + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(120, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "30", ps1[0].Score) + require.Equal(t, "-4.5", ps1[1].Score) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "-5", ps2[0].Score) + require.Equal(t, "1.7391304347826087", ps2[1].Score) + + ps3 = gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "0", ps3[0].Score) + require.Equal(t, "0", ps3[1].Score) + require.False(t, ps3[0].IsEligible) + require.False(t, ps3[1].IsEligible) + + ps4 = gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "25", ps4[0].Score) + require.Equal(t, "-2.7608695652173913", ps4[1].Score) + + ps5 = gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "25", ps5[0].Score) + require.Equal(t, "-2.7608695652173913", ps5[1].Score) + + // check with window length = 2 + ds1.WindowLength = 2 + ds2.WindowLength = 2 + ds3.WindowLength = 2 + ds4.WindowLength = 2 + ds5.WindowLength = 2 + + gameScoreEvents = []events.Event{} + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5}, time.Unix(120, 0)) + require.Equal(t, 5, len(gameScoreEvents)) + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "23.1818187768595474", ps1[0].Score) + require.Equal(t, "-3.25", ps1[1].Score) + require.Equal(t, true, ps1[0].IsEligible) + require.Equal(t, true, ps1[1].IsEligible) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "-4.3750001875000188", ps2[0].Score) + require.Equal(t, "1.0838509439219173", ps2[1].Score) + require.Equal(t, true, ps2[0].IsEligible) + require.Equal(t, true, ps2[1].IsEligible) + + ps3 = gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "3.3333333333333334", ps3[0].Score) + require.Equal(t, "-0.6666666666666667", ps3[1].Score) + require.Equal(t, true, ps3[0].IsEligible) + require.Equal(t, true, ps1[1].IsEligible) + + ps4 = gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "18.8068185893595287", ps4[0].Score) + require.Equal(t, "-2.1661490560780827", ps4[1].Score) + require.Equal(t, true, ps4[0].IsEligible) + require.Equal(t, true, ps4[1].IsEligible) + + ps5 = gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "22.140151922692862", ps5[0].Score) + require.Equal(t, "-2.8328157227447494", ps5[1].Score) + require.Equal(t, true, ps5[0].IsEligible) + require.Equal(t, true, ps5[1].IsEligible) +} + +func TestPublishGameMetricRealisedReturn(t *testing.T) { + ctx := context.Background() + epochService := &DummyEpochEngine{} + ctrl := gomock.NewController(t) + teams := mocks.NewMockTeams(ctrl) + balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + broker := bmocks.NewMockBroker(ctrl) + gameScoreEvents := []events.Event{} + broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + if evt.StreamMessage().GetGameScores() != nil { + gameScoreEvents = append(gameScoreEvents, evt) + } + }).AnyTimes() + tracker := NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) + epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) + tracker.SetEligibilityChecker(&DummyEligibilityChecker{}) + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(0, 0)}) + + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).AnyTimes() + + tracker.MarketProposed("a1", "m1", "z1") + + ds1 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, + Markets: []string{"m1"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds2 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_REALISED_RETURN, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + + tracker.RecordFundingPayment("a1", "p1", "m1", num.DecimalFromInt64(100)) + tracker.RecordRealisedPosition("a1", "p1", "m1", num.DecimalFromInt64(-50)) + tracker.RecordFundingPayment("a1", "p1", "m1", num.DecimalFromInt64(-200)) + tracker.RecordRealisedPosition("a1", "p1", "m1", num.DecimalFromInt64(20)) + tracker.RecordFundingPayment("a1", "p2", "m1", num.DecimalFromInt64(-100)) + tracker.RecordRealisedPosition("a1", "p2", "m1", num.DecimalFromInt64(-10)) + tracker.RecordRealisedPosition("a1", "p2", "m1", num.DecimalFromInt64(20)) + tracker.RecordFundingPayment("a1", "p3", "m1", num.DecimalFromInt64(200)) + + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2}, time.Unix(60, 0)) + require.Equal(t, 2, len(gameScoreEvents)) + ps1 := gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "p3", ps1[2].Party) + require.Equal(t, "-130", ps1[0].Score) + require.Equal(t, "-90", ps1[1].Score) + require.Equal(t, "200", ps1[2].Score) + + ps2 := gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "p3", ps2[2].Party) + require.Equal(t, "-130", ps2[0].Score) + require.Equal(t, "-90", ps2[1].Score) + require.Equal(t, "200", ps2[2].Score) + + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END, StartTime: time.Unix(0, 0), EndTime: time.Unix(60, 0)}) + epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(60, 0)}) + + tracker.RecordFundingPayment("a1", "p1", "m1", num.DecimalFromInt64(-30)) + tracker.RecordRealisedPosition("a1", "p2", "m1", num.DecimalFromInt64(70)) + tracker.RecordRealisedPosition("a1", "p2", "m1", num.DecimalFromInt64(80)) + tracker.RecordRealisedPosition("a1", "p3", "m1", num.DecimalFromInt64(-50)) + + // with window size1 + gameScoreEvents = []events.Event{} + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2}, time.Unix(120, 0)) + require.Equal(t, 2, len(gameScoreEvents)) + + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "p3", ps1[2].Party) + require.Equal(t, "-30", ps1[0].Score) + require.Equal(t, "150", ps1[1].Score) + require.Equal(t, "-50", ps1[2].Score) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "p3", ps2[2].Party) + require.Equal(t, "-30", ps2[0].Score) + require.Equal(t, "150", ps2[1].Score) + require.Equal(t, "-50", ps2[2].Score) + + // check with window length = 2 + ds1.WindowLength = 2 + ds2.WindowLength = 2 + + gameScoreEvents = []events.Event{} + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2}, time.Unix(120, 0)) + require.Equal(t, 2, len(gameScoreEvents)) + + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "p3", ps1[2].Party) + require.Equal(t, "-80", ps1[0].Score) + require.Equal(t, "30", ps1[1].Score) + require.Equal(t, "75", ps1[2].Score) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "p3", ps2[2].Party) + require.Equal(t, "-80", ps2[0].Score) + require.Equal(t, "30", ps2[1].Score) + require.Equal(t, "75", ps2[2].Score) +} + +func TestPublishGameMetricFees(t *testing.T) { + ctx := context.Background() + epochService := &DummyEpochEngine{} + ctrl := gomock.NewController(t) + teams := mocks.NewMockTeams(ctrl) + balanceChecker := mocks.NewMockAccountBalanceChecker(ctrl) + broker := bmocks.NewMockBroker(ctrl) + gameScoreEvents := []events.Event{} + broker.EXPECT().SendBatch(gomock.Any()).AnyTimes() + broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + if evt.StreamMessage().GetGameScores() != nil { + gameScoreEvents = append(gameScoreEvents, evt) + } + }).AnyTimes() + tracker := NewMarketActivityTracker(logging.NewTestLogger(), teams, balanceChecker, broker) + epochService.NotifyOnEpoch(tracker.OnEpochEvent, tracker.OnEpochRestore) + tracker.SetEligibilityChecker(&DummyEligibilityChecker{}) + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_START, StartTime: time.Unix(0, 0)}) + + balanceChecker.EXPECT().GetAvailableBalance(gomock.Any()).Return(num.NewUint(0), nil).AnyTimes() + + tracker.MarketProposed("a1", "m1", "me") + tracker.MarketProposed("a1", "m2", "me2") + + ds1 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, + Markets: []string{"m1"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds2 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, + Markets: []string{"m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds3 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, + Markets: []string{"m1", "m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds4 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_PAID, + Markets: []string{}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds5 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, + Markets: []string{"m1"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds6 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, + Markets: []string{"m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds7 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, + Markets: []string{"m1", "m2"}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + ds8 := &vgproto.DispatchStrategy{ + AssetForMetric: "a1", + Metric: vgproto.DispatchMetric_DISPATCH_METRIC_MAKER_FEES_RECEIVED, + Markets: []string{}, + EntityScope: vgproto.EntityScope_ENTITY_SCOPE_INDIVIDUALS, + IndividualScope: vgproto.IndividualScope_INDIVIDUAL_SCOPE_ALL, + WindowLength: 1, + DistributionStrategy: vgproto.DistributionStrategy_DISTRIBUTION_STRATEGY_PRO_RATA, + } + + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_START}) + + tracker.MarketProposed("a1", "market1", "me") + tracker.MarketProposed("a1", "market2", "me2") + + // update with a few transfers + transfersM1 := []*types.Transfer{ + {Owner: "p1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(100)}}, + {Owner: "p1", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(200)}}, + {Owner: "p1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(400)}}, + {Owner: "p1", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(300)}}, + {Owner: "p2", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(900)}}, + {Owner: "p2", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(800)}}, + {Owner: "p2", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(600)}}, + {Owner: "p2", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(200)}}, + } + tracker.UpdateFeesFromTransfers("a1", "m1", transfersM1) + + transfersM2 := []*types.Transfer{ + {Owner: "p1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "a2", Amount: num.NewUint(150)}}, + {Owner: "p2", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "a2", Amount: num.NewUint(150)}}, + } + tracker.UpdateFeesFromTransfers("a1", "m2", transfersM2) + + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5, ds6, ds7, ds8}, time.Unix(10, 0)) + require.Equal(t, 8, len(gameScoreEvents)) + + ps1 := gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "0.3333333333333333", ps1[0].Score) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "0.6666666666666667", ps1[1].Score) + + ps2 := gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "0", ps2[0].Score) + require.False(t, ps2[0].IsEligible) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "1", ps2[1].Score) + + ps3 := gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "0.303030303030303", ps3[0].Score) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "0.696969696969697", ps3[1].Score) + + ps4 := gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "0.303030303030303", ps4[0].Score) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "0.696969696969697", ps4[1].Score) + + ps5 := gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "0.25", ps5[0].Score) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "0.75", ps5[1].Score) + + ps6 := gameScoreEvents[5].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps6[0].Party) + require.Equal(t, "1", ps6[0].Score) + require.Equal(t, "p2", ps6[1].Party) + require.Equal(t, "0", ps6[1].Score) + require.False(t, ps6[1].IsEligible) + + ps7 := gameScoreEvents[6].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps7[0].Party) + require.Equal(t, "0.3023255813953488", ps7[0].Score) + require.Equal(t, "p2", ps7[1].Party) + require.Equal(t, "0.6976744186046512", ps7[1].Score) + + ps8 := gameScoreEvents[7].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps8[0].Party) + require.Equal(t, "0.3023255813953488", ps8[0].Score) + require.Equal(t, "p2", ps8[1].Party) + require.Equal(t, "0.6976744186046512", ps8[1].Score) + + epochService.target(context.Background(), types.Epoch{Seq: 1, Action: vgproto.EpochAction_EPOCH_ACTION_END}) + epochService.target(context.Background(), types.Epoch{Seq: 2, Action: vgproto.EpochAction_EPOCH_ACTION_START}) + + ds1.WindowLength = 2 + ds2.WindowLength = 2 + ds3.WindowLength = 2 + ds4.WindowLength = 2 + ds5.WindowLength = 2 + ds6.WindowLength = 2 + ds7.WindowLength = 2 + ds8.WindowLength = 2 + + // pay/receive some fees in me for the new epoch + transfersM1 = []*types.Transfer{ + {Owner: "p1", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(300)}}, + {Owner: "p1", Type: types.TransferTypeMakerFeePay, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(100)}}, + {Owner: "p2", Type: types.TransferTypeMakerFeeReceive, Amount: &types.FinancialAmount{Asset: "a1", Amount: num.NewUint(900)}}, + } + tracker.UpdateFeesFromTransfers("a1", "m1", transfersM1) + + gameScoreEvents = []events.Event{} + tracker.PublishGameMetric(ctx, []*vgproto.DispatchStrategy{ds1, ds2, ds3, ds4, ds5, ds6, ds7, ds8}, time.Unix(20, 0)) + require.Equal(t, 8, len(gameScoreEvents)) + + ps1 = gameScoreEvents[0].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps1[0].Party) + require.Equal(t, "0.375", ps1[0].Score) + require.Equal(t, "p2", ps1[1].Party) + require.Equal(t, "0.625", ps1[1].Score) + + ps2 = gameScoreEvents[1].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps2[0].Party) + require.Equal(t, "0", ps2[0].Score) + require.False(t, ps2[0].IsEligible) + require.Equal(t, "p2", ps2[1].Party) + require.Equal(t, "1", ps2[1].Score) + + ps3 = gameScoreEvents[2].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps3[0].Party) + require.Equal(t, "0.3428571428571429", ps3[0].Score) + require.Equal(t, "p2", ps3[1].Party) + require.Equal(t, "0.6571428571428571", ps3[1].Score) + + ps4 = gameScoreEvents[3].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps4[0].Party) + require.Equal(t, "0.3428571428571429", ps4[0].Score) + require.Equal(t, "p2", ps4[1].Party) + require.Equal(t, "0.6571428571428571", ps4[1].Score) + + ps5 = gameScoreEvents[4].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps5[0].Party) + require.Equal(t, "0.25", ps5[0].Score) + require.Equal(t, "p2", ps5[1].Party) + require.Equal(t, "0.75", ps5[1].Score) + + ps6 = gameScoreEvents[5].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps6[0].Party) + require.Equal(t, "1", ps6[0].Score) + require.Equal(t, "p2", ps6[1].Party) + require.Equal(t, "0", ps6[1].Score) + require.False(t, ps6[1].IsEligible) + + ps7 = gameScoreEvents[6].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps7[0].Party) + require.Equal(t, "0.2835820895522388", ps7[0].Score) + require.Equal(t, "p2", ps7[1].Party) + require.Equal(t, "0.7164179104477612", ps7[1].Score) + + ps8 = gameScoreEvents[7].StreamMessage().GetGameScores().PartyScores + require.Equal(t, "p1", ps8[0].Party) + require.Equal(t, "0.2835820895522388", ps8[0].Score) + require.Equal(t, "p2", ps8[1].Party) + require.Equal(t, "0.7164179104477612", ps8[1].Score) +} diff --git a/core/execution/common/mocks/mocks.go b/core/execution/common/mocks/mocks.go index 73d0643ac39..f64b6a4cada 100644 --- a/core/execution/common/mocks/mocks.go +++ b/core/execution/common/mocks/mocks.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: code.vegaprotocol.io/vega/core/execution/common (interfaces: TimeService,Assets,StateVarEngine,Collateral,OracleEngine,EpochEngine,AuctionState,LiquidityEngine,EquityLikeShares,MarketLiquidityEngine,Teams,AccountBalanceChecker,Banking) +// Source: code.vegaprotocol.io/vega/core/execution/common (interfaces: TimeService,Assets,StateVarEngine,Collateral,OracleEngine,EpochEngine,AuctionState,LiquidityEngine,EquityLikeShares,MarketLiquidityEngine,Teams,AccountBalanceChecker,Banking,Parties,DelayTransactionsTarget) // Package mocks is a generated GoMock package. package mocks @@ -251,6 +251,34 @@ func (mr *MockCollateralMockRecorder) CanCoverBond(arg0, arg1, arg2, arg3 interf return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanCoverBond", reflect.TypeOf((*MockCollateral)(nil).CanCoverBond), arg0, arg1, arg2, arg3) } +// CheckOrderSpam mocks base method. +func (m *MockCollateral) CheckOrderSpam(arg0, arg1 string, arg2 []string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckOrderSpam", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// CheckOrderSpam indicates an expected call of CheckOrderSpam. +func (mr *MockCollateralMockRecorder) CheckOrderSpam(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckOrderSpam", reflect.TypeOf((*MockCollateral)(nil).CheckOrderSpam), arg0, arg1, arg2) +} + +// CheckOrderSpamAllMarkets mocks base method. +func (m *MockCollateral) CheckOrderSpamAllMarkets(arg0 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckOrderSpamAllMarkets", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// CheckOrderSpamAllMarkets indicates an expected call of CheckOrderSpamAllMarkets. +func (mr *MockCollateralMockRecorder) CheckOrderSpamAllMarkets(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckOrderSpamAllMarkets", reflect.TypeOf((*MockCollateral)(nil).CheckOrderSpamAllMarkets), arg0) +} + // ClearInsurancepool mocks base method. func (m *MockCollateral) ClearInsurancepool(arg0 context.Context, arg1, arg2 string, arg3 bool) ([]*types.LedgerMovement, error) { m.ctrl.T.Helper() @@ -342,6 +370,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 +863,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() @@ -1197,6 +1287,18 @@ func (mr *MockAuctionStateMockRecorder) ExtendAuction(arg0 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExtendAuction", reflect.TypeOf((*MockAuctionState)(nil).ExtendAuction), arg0) } +// ExtendAuctionLongBlock mocks base method. +func (m *MockAuctionState) ExtendAuctionLongBlock(arg0 types.AuctionDuration) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "ExtendAuctionLongBlock", arg0) +} + +// ExtendAuctionLongBlock indicates an expected call of ExtendAuctionLongBlock. +func (mr *MockAuctionStateMockRecorder) ExtendAuctionLongBlock(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExtendAuctionLongBlock", reflect.TypeOf((*MockAuctionState)(nil).ExtendAuctionLongBlock), arg0) +} + // ExtendAuctionPrice mocks base method. func (m *MockAuctionState) ExtendAuctionPrice(arg0 types.AuctionDuration) { m.ctrl.T.Helper() @@ -1399,6 +1501,18 @@ func (mr *MockAuctionStateMockRecorder) StartGovernanceSuspensionAuction(arg0 in return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartGovernanceSuspensionAuction", reflect.TypeOf((*MockAuctionState)(nil).StartGovernanceSuspensionAuction), arg0) } +// StartLongBlockAuction mocks base method. +func (m *MockAuctionState) StartLongBlockAuction(arg0 time.Time, arg1 int64) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "StartLongBlockAuction", arg0, arg1) +} + +// StartLongBlockAuction indicates an expected call of StartLongBlockAuction. +func (mr *MockAuctionStateMockRecorder) StartLongBlockAuction(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StartLongBlockAuction", reflect.TypeOf((*MockAuctionState)(nil).StartLongBlockAuction), arg0, arg1) +} + // StartPriceAuction mocks base method. func (m *MockAuctionState) StartPriceAuction(arg0 time.Time, arg1 *types.AuctionDuration) { m.ctrl.T.Helper() @@ -1599,6 +1713,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() @@ -2054,6 +2182,20 @@ func (mr *MockEquityLikeSharesMockRecorder) AllShares() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllShares", reflect.TypeOf((*MockEquityLikeShares)(nil).AllShares)) } +// HasShares mocks base method. +func (m *MockEquityLikeShares) HasShares(arg0 string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "HasShares", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// HasShares indicates an expected call of HasShares. +func (mr *MockEquityLikeSharesMockRecorder) HasShares(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HasShares", reflect.TypeOf((*MockEquityLikeShares)(nil).HasShares), arg0) +} + // SetPartyStake mocks base method. func (m *MockEquityLikeShares) SetPartyStake(arg0 string, arg1 *num.Uint) { m.ctrl.T.Helper() @@ -2353,6 +2495,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() @@ -2540,3 +2694,73 @@ func (mr *MockBankingMockRecorder) RegisterTradingFees(arg0, arg1, arg2 interfac mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterTradingFees", reflect.TypeOf((*MockBanking)(nil).RegisterTradingFees), arg0, arg1, arg2) } + +// MockParties is a mock of Parties interface. +type MockParties struct { + ctrl *gomock.Controller + recorder *MockPartiesMockRecorder +} + +// MockPartiesMockRecorder is the mock recorder for MockParties. +type MockPartiesMockRecorder struct { + mock *MockParties +} + +// NewMockParties creates a new mock instance. +func NewMockParties(ctrl *gomock.Controller) *MockParties { + mock := &MockParties{ctrl: ctrl} + mock.recorder = &MockPartiesMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockParties) EXPECT() *MockPartiesMockRecorder { + return m.recorder +} + +// AssignDeriveKey mocks base method. +func (m *MockParties) AssignDeriveKey(arg0 context.Context, arg1 types.PartyID, arg2 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "AssignDeriveKey", arg0, arg1, arg2) +} + +// AssignDeriveKey indicates an expected call of AssignDeriveKey. +func (mr *MockPartiesMockRecorder) AssignDeriveKey(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AssignDeriveKey", reflect.TypeOf((*MockParties)(nil).AssignDeriveKey), arg0, arg1, arg2) +} + +// MockDelayTransactionsTarget is a mock of DelayTransactionsTarget interface. +type MockDelayTransactionsTarget struct { + ctrl *gomock.Controller + recorder *MockDelayTransactionsTargetMockRecorder +} + +// MockDelayTransactionsTargetMockRecorder is the mock recorder for MockDelayTransactionsTarget. +type MockDelayTransactionsTargetMockRecorder struct { + mock *MockDelayTransactionsTarget +} + +// NewMockDelayTransactionsTarget creates a new mock instance. +func NewMockDelayTransactionsTarget(ctrl *gomock.Controller) *MockDelayTransactionsTarget { + mock := &MockDelayTransactionsTarget{ctrl: ctrl} + mock.recorder = &MockDelayTransactionsTargetMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockDelayTransactionsTarget) EXPECT() *MockDelayTransactionsTargetMockRecorder { + return m.recorder +} + +// MarketDelayRequiredUpdated mocks base method. +func (m *MockDelayTransactionsTarget) MarketDelayRequiredUpdated(arg0 string, arg1 bool) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "MarketDelayRequiredUpdated", arg0, arg1) +} + +// MarketDelayRequiredUpdated indicates an expected call of MarketDelayRequiredUpdated. +func (mr *MockDelayTransactionsTargetMockRecorder) MarketDelayRequiredUpdated(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarketDelayRequiredUpdated", reflect.TypeOf((*MockDelayTransactionsTarget)(nil).MarketDelayRequiredUpdated), arg0, arg1) +} diff --git a/core/execution/common/mocks_amm/mocks.go b/core/execution/common/mocks_amm/mocks.go new file mode 100644 index 00000000000..84b9ca52ae0 --- /dev/null +++ b/core/execution/common/mocks_amm/mocks.go @@ -0,0 +1,147 @@ +// 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" + idgeneration "code.vegaprotocol.io/vega/core/idgeneration" + 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, arg2 *idgeneration.IDGenerator) ([]*types.Order, []*types.Order) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OrderbookShape", arg0, arg1, arg2) + 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, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OrderbookShape", reflect.TypeOf((*MockAMMPool)(nil).OrderbookShape), arg0, arg1, arg2) +} + +// 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)) +} + +// IsAMMPartyID mocks base method. +func (m *MockAMM) IsAMMPartyID(arg0 string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "IsAMMPartyID", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// IsAMMPartyID indicates an expected call of IsAMMPartyID. +func (mr *MockAMMMockRecorder) IsAMMPartyID(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsAMMPartyID", reflect.TypeOf((*MockAMM)(nil).IsAMMPartyID), arg0) +} diff --git a/core/execution/engine.go b/core/execution/engine.go index af6dc079b58..e1b1bf5a707 100644 --- a/core/execution/engine.go +++ b/core/execution/engine.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "sort" + "sync" "time" "code.vegaprotocol.io/vega/core/events" @@ -42,6 +43,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") @@ -83,6 +87,7 @@ type Engine struct { referralDiscountRewardService fee.ReferralDiscountRewardService volumeDiscountService fee.VolumeDiscountService banking common.Banking + parties common.Parties broker common.Broker timeService common.TimeService @@ -109,70 +114,13 @@ type Engine struct { isSuccessor map[string]string successorWindow time.Duration // only used once, during CP restore, this doesn't need to be included in a snapshot or checkpoint. - skipRestoreSuccessors map[string]struct{} -} - -type netParamsValues struct { - feeDistributionTimeStep time.Duration - marketValueWindowLength time.Duration - suppliedStakeToObligationFactor num.Decimal - infrastructureFee num.Decimal - makerFee num.Decimal - scalingFactors *types.ScalingFactors - maxLiquidityFee num.Decimal - bondPenaltyFactor num.Decimal - auctionMinDuration time.Duration - auctionMaxDuration time.Duration - probabilityOfTradingTauScaling num.Decimal - minProbabilityOfTradingLPOrders num.Decimal - minLpStakeQuantumMultiple num.Decimal - marketCreationQuantumMultiple num.Decimal - markPriceUpdateMaximumFrequency time.Duration - internalCompositePriceUpdateFrequency time.Duration - marketPartiesMaximumStopOrdersUpdate *num.Uint - - // Liquidity version 2. - liquidityV2BondPenaltyFactor num.Decimal - liquidityV2EarlyExitPenalty num.Decimal - liquidityV2MaxLiquidityFee num.Decimal - liquidityV2SLANonPerformanceBondPenaltyMax num.Decimal - liquidityV2SLANonPerformanceBondPenaltySlope num.Decimal - liquidityV2StakeToCCYVolume num.Decimal - liquidityV2ProvidersFeeCalculationTimeStep time.Duration - - // only used for protocol upgrade to v0.74 - chainID uint64 -} - -func defaultNetParamsValues() netParamsValues { - return netParamsValues{ - feeDistributionTimeStep: -1, - marketValueWindowLength: -1, - suppliedStakeToObligationFactor: num.DecimalFromInt64(-1), - infrastructureFee: num.DecimalFromInt64(-1), - makerFee: num.DecimalFromInt64(-1), - scalingFactors: nil, - maxLiquidityFee: num.DecimalFromInt64(-1), - bondPenaltyFactor: num.DecimalFromInt64(-1), - - auctionMinDuration: -1, - probabilityOfTradingTauScaling: num.DecimalFromInt64(-1), - minProbabilityOfTradingLPOrders: num.DecimalFromInt64(-1), - minLpStakeQuantumMultiple: num.DecimalFromInt64(-1), - marketCreationQuantumMultiple: num.DecimalFromInt64(-1), - markPriceUpdateMaximumFrequency: 5 * time.Second, // default is 5 seconds, should come from net params though - internalCompositePriceUpdateFrequency: 5 * time.Second, - marketPartiesMaximumStopOrdersUpdate: num.UintZero(), - - // Liquidity version 2. - liquidityV2BondPenaltyFactor: num.DecimalFromInt64(-1), - liquidityV2EarlyExitPenalty: num.DecimalFromInt64(-1), - liquidityV2MaxLiquidityFee: num.DecimalFromInt64(-1), - liquidityV2SLANonPerformanceBondPenaltyMax: num.DecimalFromInt64(-1), - liquidityV2SLANonPerformanceBondPenaltySlope: num.DecimalFromInt64(-1), - liquidityV2StakeToCCYVolume: num.DecimalFromInt64(-1), - liquidityV2ProvidersFeeCalculationTimeStep: time.Second * 5, - } + skipRestoreSuccessors map[string]struct{} + minMaintenanceMarginQuantumMultiplier num.Decimal + minHoldingQuantumMultiplier num.Decimal + + lock sync.RWMutex + + delayTransactionsTarget common.DelayTransactionsTarget } // NewEngine takes stores and engines and returns @@ -190,6 +138,8 @@ func NewEngine( referralDiscountRewardService fee.ReferralDiscountRewardService, volumeDiscountService fee.VolumeDiscountService, banking common.Banking, + parties common.Parties, + delayTransactionsTarget common.DelayTransactionsTarget, ) *Engine { // setup logger log = log.Named(namedLogger) @@ -216,6 +166,8 @@ func NewEngine( referralDiscountRewardService: referralDiscountRewardService, volumeDiscountService: volumeDiscountService, banking: banking, + parties: parties, + delayTransactionsTarget: delayTransactionsTarget, } // set the eligibility for proposer bonus checker @@ -288,6 +240,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. @@ -343,6 +343,12 @@ func (e *Engine) StartOpeningAuction(ctx context.Context, marketID string) error return ErrMarketDoesNotExist } +func (e *Engine) EnterLongBlockAuction(ctx context.Context, duration int64) { + for _, mkt := range e.allMarkets { + mkt.EnterLongBlockAuction(ctx, duration) + } +} + func (e *Engine) SucceedMarket(ctx context.Context, successor, parent string) error { return e.succeedOrRestore(ctx, successor, parent, false) } @@ -570,6 +576,7 @@ func (e *Engine) UpdateSpotMarket(ctx context.Context, marketConfig *types.Marke if err := mkt.Update(ctx, marketConfig); err != nil { return err } + e.delayTransactionsTarget.MarketDelayRequiredUpdated(mkt.GetID(), marketConfig.EnableTxReordering) e.publishUpdateMarketInfos(ctx, mkt.GetMarketData(), *mkt.Mkt()) return nil } @@ -627,6 +634,7 @@ func (e *Engine) UpdateMarket(ctx context.Context, marketConfig *types.Market) e if err := mkt.Update(ctx, marketConfig, e.oracle); err != nil { return err } + e.delayTransactionsTarget.MarketDelayRequiredUpdated(mkt.GetID(), marketConfig.EnableTxReordering) e.publishUpdateMarketInfos(ctx, mkt.GetMarketData(), *mkt.Mkt()) return nil } @@ -700,6 +708,7 @@ func (e *Engine) submitMarket(ctx context.Context, marketConfig *types.Market, o e.referralDiscountRewardService, e.volumeDiscountService, e.banking, + e.parties, ) if err != nil { e.log.Error("failed to instantiate market", @@ -709,11 +718,13 @@ func (e *Engine) submitMarket(ctx context.Context, marketConfig *types.Market, o return err } + e.lock.Lock() + e.delayTransactionsTarget.MarketDelayRequiredUpdated(mkt.GetID(), marketConfig.EnableTxReordering) e.futureMarkets[marketConfig.ID] = mkt e.futureMarketsCpy = append(e.futureMarketsCpy, mkt) e.allMarkets[marketConfig.ID] = mkt e.allMarketsCpy = append(e.allMarketsCpy, mkt) - + e.lock.Unlock() return e.propagateInitialNetParamsToFutureMarket(ctx, mkt, false) } @@ -788,12 +799,13 @@ func (e *Engine) submitSpotMarket(ctx context.Context, marketConfig *types.Marke ) return err } - + e.lock.Lock() + e.delayTransactionsTarget.MarketDelayRequiredUpdated(mkt.GetID(), marketConfig.EnableTxReordering) e.spotMarkets[marketConfig.ID] = mkt e.spotMarketsCpy = append(e.spotMarketsCpy, mkt) e.allMarkets[marketConfig.ID] = mkt e.allMarketsCpy = append(e.allMarketsCpy, mkt) - + e.lock.Unlock() e.collateral.CreateSpotMarketAccounts(ctx, marketConfig.ID, quoteAsset) if err := e.propagateSpotInitialNetParams(ctx, mkt, false); err != nil { @@ -803,142 +815,10 @@ func (e *Engine) submitSpotMarket(ctx context.Context, marketConfig *types.Marke return nil } -func (e *Engine) propagateSpotInitialNetParams(ctx context.Context, mkt *spot.Market, isRestore bool) error { - if !e.npv.minLpStakeQuantumMultiple.Equal(num.DecimalFromInt64(-1)) { - mkt.OnMarketMinLpStakeQuantumMultipleUpdate(ctx, e.npv.minLpStakeQuantumMultiple) - } - if e.npv.auctionMinDuration != -1 { - mkt.OnMarketAuctionMinimumDurationUpdate(ctx, e.npv.auctionMinDuration) - } - if e.npv.auctionMaxDuration > 0 { - mkt.OnMarketAuctionMaximumDurationUpdate(ctx, e.npv.auctionMaxDuration) - } - if !e.npv.infrastructureFee.Equal(num.DecimalFromInt64(-1)) { - mkt.OnFeeFactorsInfrastructureFeeUpdate(ctx, e.npv.infrastructureFee) - } - - if !e.npv.makerFee.Equal(num.DecimalFromInt64(-1)) { - mkt.OnFeeFactorsMakerFeeUpdate(ctx, e.npv.makerFee) - } - - if e.npv.marketValueWindowLength != -1 { - mkt.OnMarketValueWindowLengthUpdate(e.npv.marketValueWindowLength) - } - - if e.npv.markPriceUpdateMaximumFrequency > 0 { - mkt.OnMarkPriceUpdateMaximumFrequency(ctx, e.npv.markPriceUpdateMaximumFrequency) - } - - if !e.npv.liquidityV2EarlyExitPenalty.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2EarlyExitPenaltyUpdate(e.npv.liquidityV2EarlyExitPenalty) - } - - if !e.npv.liquidityV2MaxLiquidityFee.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(e.npv.liquidityV2MaxLiquidityFee) - } - - if !e.npv.liquidityV2SLANonPerformanceBondPenaltySlope.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltySlope) - } - - if !e.npv.liquidityV2SLANonPerformanceBondPenaltyMax.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltyMax) - } - - if !e.npv.liquidityV2StakeToCCYVolume.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2StakeToCCYVolume(e.npv.liquidityV2StakeToCCYVolume) - } - - mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, e.npv.marketPartiesMaximumStopOrdersUpdate) - - e.propagateSLANetParams(ctx, mkt, isRestore) - return nil -} - -func (e *Engine) propagateInitialNetParamsToFutureMarket(ctx context.Context, mkt *future.Market, isRestore bool) error { - if !e.npv.probabilityOfTradingTauScaling.Equal(num.DecimalFromInt64(-1)) { - mkt.OnMarketProbabilityOfTradingTauScalingUpdate(ctx, e.npv.probabilityOfTradingTauScaling) - } - if !e.npv.minProbabilityOfTradingLPOrders.Equal(num.DecimalFromInt64(-1)) { - mkt.OnMarketMinProbabilityOfTradingLPOrdersUpdate(ctx, e.npv.minProbabilityOfTradingLPOrders) - } - if !e.npv.minLpStakeQuantumMultiple.Equal(num.DecimalFromInt64(-1)) { - mkt.OnMarketMinLpStakeQuantumMultipleUpdate(ctx, e.npv.minLpStakeQuantumMultiple) - } - if e.npv.auctionMinDuration != -1 { - mkt.OnMarketAuctionMinimumDurationUpdate(ctx, e.npv.auctionMinDuration) - } - if e.npv.auctionMaxDuration > 0 { - mkt.OnMarketAuctionMaximumDurationUpdate(ctx, e.npv.auctionMaxDuration) - } - - if !e.npv.infrastructureFee.Equal(num.DecimalFromInt64(-1)) { - mkt.OnFeeFactorsInfrastructureFeeUpdate(ctx, e.npv.infrastructureFee) - } - - if !e.npv.makerFee.Equal(num.DecimalFromInt64(-1)) { - mkt.OnFeeFactorsMakerFeeUpdate(ctx, e.npv.makerFee) - } - - if e.npv.scalingFactors != nil { - if err := mkt.OnMarginScalingFactorsUpdate(ctx, e.npv.scalingFactors); err != nil { - return err - } - } - - if e.npv.marketValueWindowLength != -1 { - mkt.OnMarketValueWindowLengthUpdate(e.npv.marketValueWindowLength) - } - - if !e.npv.maxLiquidityFee.Equal(num.DecimalFromInt64(-1)) { - mkt.OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(e.npv.maxLiquidityFee) - } - if e.npv.markPriceUpdateMaximumFrequency > 0 { - mkt.OnMarkPriceUpdateMaximumFrequency(ctx, e.npv.markPriceUpdateMaximumFrequency) - } - if e.npv.internalCompositePriceUpdateFrequency > 0 { - mkt.OnInternalCompositePriceUpdateFrequency(ctx, e.npv.internalCompositePriceUpdateFrequency) - } - - mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, e.npv.marketPartiesMaximumStopOrdersUpdate) - - e.propagateSLANetParams(ctx, mkt, isRestore) - - return nil -} - -func (e *Engine) propagateSLANetParams(_ context.Context, mkt common.CommonMarket, isRestore bool) { - if !e.npv.liquidityV2BondPenaltyFactor.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2BondPenaltyFactorUpdate(e.npv.liquidityV2BondPenaltyFactor) - } - - if !e.npv.liquidityV2EarlyExitPenalty.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2EarlyExitPenaltyUpdate(e.npv.liquidityV2EarlyExitPenalty) - } - - if !e.npv.liquidityV2MaxLiquidityFee.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(e.npv.liquidityV2MaxLiquidityFee) - } - - if !e.npv.liquidityV2SLANonPerformanceBondPenaltySlope.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltySlope) - } - - if !e.npv.liquidityV2SLANonPerformanceBondPenaltyMax.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltyMax) - } - - if !e.npv.liquidityV2StakeToCCYVolume.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck - mkt.OnMarketLiquidityV2StakeToCCYVolume(e.npv.liquidityV2StakeToCCYVolume) - } - - if !isRestore && e.npv.liquidityV2ProvidersFeeCalculationTimeStep != 0 { - mkt.OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(e.npv.liquidityV2ProvidersFeeCalculationTimeStep) - } -} - func (e *Engine) removeMarket(mktID string) { e.log.Debug("removing market", logging.String("id", mktID)) + e.lock.Lock() + defer e.lock.Unlock() delete(e.allMarkets, mktID) for i, mkt := range e.allMarketsCpy { if mkt.GetID() == mktID { @@ -1098,6 +978,14 @@ func (e *Engine) SubmitOrder(ctx context.Context, submission *types.OrderSubmiss return nil, types.ErrInvalidMarketID } +func (e *Engine) ValidateSettlementData(mID string, data *num.Uint) bool { + mkt, ok := e.allMarkets[mID] + if !ok { + return false + } + return mkt.ValidateSettlementData(data) +} + // AmendOrder takes order amendment details and attempts to amend the order // if it exists and is in a editable state. func (e *Engine) AmendOrder(ctx context.Context, amendment *types.OrderAmendment, party string, idgen common.IDGenerator) (*types.OrderConfirmation, error) { @@ -1501,10 +1389,18 @@ func (e *Engine) BlockEnd(ctx context.Context) { } } -func (e *Engine) BeginBlock(ctx context.Context) { +func (e *Engine) BeginBlock(ctx context.Context, prevBlockDuration time.Duration) { for _, mkt := range e.allMarketsCpy { mkt.BeginBlock(ctx) } + longBlockAuctionDuration := e.npv.lbadTable.GetLongBlockAuctionDurationForBlockDuration(prevBlockDuration) + if longBlockAuctionDuration == nil { + return + } + auctionDurationInSeconds := int64(longBlockAuctionDuration.Seconds()) + for _, mkt := range e.allMarketsCpy { + mkt.EnterLongBlockAuction(ctx, auctionDurationInSeconds) + } } func (e *Engine) GetMarketState(mktID string) (types.MarketState, error) { @@ -1530,330 +1426,6 @@ func (e *Engine) GetMarketData(mktID string) (types.MarketData, error) { return types.MarketData{}, types.ErrInvalidMarketID } -func (e *Engine) OnMarketAuctionMinimumDurationUpdate(ctx context.Context, d time.Duration) error { - for _, mkt := range e.allMarketsCpy { - mkt.OnMarketAuctionMinimumDurationUpdate(ctx, d) - } - e.npv.auctionMinDuration = d - return nil -} - -func (e *Engine) OnMarketAuctionMaximumDurationUpdate(ctx context.Context, d time.Duration) error { - for _, mkt := range e.allMarketsCpy { - if mkt.IsOpeningAuction() { - mkt.OnMarketAuctionMaximumDurationUpdate(ctx, d) - } - } - e.npv.auctionMaxDuration = d - return nil -} - -func (e *Engine) OnMarkPriceUpdateMaximumFrequency(ctx context.Context, d time.Duration) error { - for _, mkt := range e.allMarketsCpy { - mkt.OnMarkPriceUpdateMaximumFrequency(ctx, d) - } - e.npv.markPriceUpdateMaximumFrequency = d - return nil -} - -func (e *Engine) OnInternalCompositePriceUpdateFrequency(ctx context.Context, d time.Duration) error { - for _, mkt := range e.futureMarkets { - mkt.OnInternalCompositePriceUpdateFrequency(ctx, d) - } - e.npv.internalCompositePriceUpdateFrequency = d - return nil -} - -// OnMarketLiquidityV2BondPenaltyUpdate stores net param on execution engine and applies to markets at the start of new epoch. -func (e *Engine) OnMarketLiquidityV2BondPenaltyUpdate(_ context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update market liquidity bond penalty (liquidity v2)", - logging.Decimal("bond-penalty-factor", d), - ) - } - - // Set immediately during opening auction - for _, mkt := range e.allMarketsCpy { - if mkt.IsOpeningAuction() { - mkt.OnMarketLiquidityV2BondPenaltyFactorUpdate(d) - } - } - - e.npv.liquidityV2BondPenaltyFactor = d - return nil -} - -// OnMarketLiquidityV2EarlyExitPenaltyUpdate stores net param on execution engine and applies to markets -// at the start of new epoch. -func (e *Engine) OnMarketLiquidityV2EarlyExitPenaltyUpdate(_ context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update market liquidity early exit penalty (liquidity v2)", - logging.Decimal("early-exit-penalty", d), - ) - } - - // Set immediately during opening auction - for _, mkt := range e.allMarketsCpy { - if mkt.IsOpeningAuction() { - mkt.OnMarketLiquidityV2EarlyExitPenaltyUpdate(d) - } - } - - e.npv.liquidityV2EarlyExitPenalty = d - return nil -} - -// OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate stores net param on execution engine and -// applies at the start of new epoch. -func (e *Engine) OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(_ context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update liquidity provision max liquidity fee factor (liquidity v2)", - logging.Decimal("max-liquidity-fee", d), - ) - } - - // Set immediately during opening auction - for _, mkt := range e.allMarketsCpy { - if mkt.IsOpeningAuction() { - mkt.OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(d) - } - } - - e.npv.liquidityV2MaxLiquidityFee = d - return nil -} - -// OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate stores net param on execution engine and applies to markets at the -// start of new epoch. -func (e *Engine) OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(_ context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update market SLA non performance bond penalty slope (liquidity v2)", - logging.Decimal("bond-penalty-slope", d), - ) - } - - // Set immediately during opening auction - for _, mkt := range e.allMarketsCpy { - if mkt.IsOpeningAuction() { - mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(d) - } - } - - e.npv.liquidityV2SLANonPerformanceBondPenaltySlope = d - return nil -} - -// OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate stores net param on execution engine and applies to markets -// at the start of new epoch. -func (e *Engine) OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(_ context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update market SLA non performance bond penalty max (liquidity v2)", - logging.Decimal("bond-penalty-max", d), - ) - } - - for _, m := range e.futureMarketsCpy { - // Set immediately during opening auction - if m.IsOpeningAuction() { - m.OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(d) - } - } - - e.npv.liquidityV2SLANonPerformanceBondPenaltyMax = d - return nil -} - -// OnMarketLiquidityV2StakeToCCYVolumeUpdate stores net param on execution engine and applies to markets -// at the start of new epoch. -func (e *Engine) OnMarketLiquidityV2StakeToCCYVolumeUpdate(_ context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update market stake to CCYVolume (liquidity v2)", - logging.Decimal("stake-to-ccy-volume", d), - ) - } - - for _, m := range e.futureMarketsCpy { - // Set immediately during opening auction - if m.IsOpeningAuction() { - m.OnMarketLiquidityV2StakeToCCYVolume(d) - } - } - - e.npv.liquidityV2StakeToCCYVolume = d - return nil -} - -// OnMarketLiquidityV2ProvidersFeeCalculationTimeStep stores net param on execution engine and applies to markets -// at the start of new epoch. -func (e *Engine) OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(_ context.Context, d time.Duration) error { - if e.log.IsDebug() { - e.log.Debug("update market SLA providers fee calculation time step (liquidity v2)", - logging.Duration("providersFeeCalculationTimeStep", d), - ) - } - - for _, m := range e.allMarketsCpy { - // Set immediately during opening auction - if m.IsOpeningAuction() { - m.OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(d) - } - } - - e.npv.liquidityV2ProvidersFeeCalculationTimeStep = d - return nil -} - -func (e *Engine) OnMarketMarginScalingFactorsUpdate(ctx context.Context, v interface{}) error { - if e.log.IsDebug() { - e.log.Debug("update market scaling factors", - logging.Reflect("scaling-factors", v), - ) - } - - pscalingFactors, ok := v.(*vega.ScalingFactors) - if !ok { - return errors.New("invalid types for Margin ScalingFactors") - } - scalingFactors := types.ScalingFactorsFromProto(pscalingFactors) - for _, mkt := range e.futureMarketsCpy { - if err := mkt.OnMarginScalingFactorsUpdate(ctx, scalingFactors); err != nil { - return err - } - } - e.npv.scalingFactors = scalingFactors - return nil -} - -func (e *Engine) OnMarketFeeFactorsMakerFeeUpdate(ctx context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update maker fee in market fee factors", - logging.Decimal("maker-fee", d), - ) - } - - for _, mkt := range e.allMarketsCpy { - mkt.OnFeeFactorsMakerFeeUpdate(ctx, d) - } - e.npv.makerFee = d - return nil -} - -func (e *Engine) OnMarketFeeFactorsInfrastructureFeeUpdate(ctx context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update infrastructure fee in market fee factors", - logging.Decimal("infrastructure-fee", d), - ) - } - for _, mkt := range e.allMarketsCpy { - mkt.OnFeeFactorsInfrastructureFeeUpdate(ctx, d) - } - e.npv.infrastructureFee = d - return nil -} - -func (e *Engine) OnMarketValueWindowLengthUpdate(_ context.Context, d time.Duration) error { - if e.log.IsDebug() { - e.log.Debug("update market value window length", - logging.Duration("window-length", d), - ) - } - - for _, mkt := range e.allMarketsCpy { - mkt.OnMarketValueWindowLengthUpdate(d) - } - e.npv.marketValueWindowLength = d - return nil -} - -// to be removed and replaced by its v2 counterpart. in use only for future. -func (e *Engine) OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(_ context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update liquidity provision max liquidity fee factor", - logging.Decimal("max-liquidity-fee", d), - ) - } - - for _, mkt := range e.futureMarketsCpy { - mkt.OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(d) - } - e.npv.maxLiquidityFee = 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", - logging.Decimal("probability-of-trading-tau-scaling", d), - ) - } - for _, mkt := range e.allMarketsCpy { - mkt.OnMarketProbabilityOfTradingTauScalingUpdate(ctx, d) - } - e.npv.probabilityOfTradingTauScaling = d - return nil -} - -func (e *Engine) OnMarketMinProbabilityOfTradingForLPOrdersUpdate(ctx context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update min probability of trading tau scaling", - logging.Decimal("min-probability-of-trading-lp-orders", d), - ) - } - - for _, mkt := range e.allMarketsCpy { - mkt.OnMarketMinProbabilityOfTradingLPOrdersUpdate(ctx, d) - } - e.npv.minProbabilityOfTradingLPOrders = d - return nil -} - -func (e *Engine) OnMinLpStakeQuantumMultipleUpdate(ctx context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update min lp stake quantum multiple", - logging.Decimal("min-lp-stake-quantum-multiple", d), - ) - } - for _, mkt := range e.allMarketsCpy { - mkt.OnMarketMinLpStakeQuantumMultipleUpdate(ctx, d) - } - e.npv.minLpStakeQuantumMultiple = d - return nil -} - -func (e *Engine) OnMarketCreationQuantumMultipleUpdate(ctx context.Context, d num.Decimal) error { - if e.log.IsDebug() { - e.log.Debug("update market creation quantum multiple", - logging.Decimal("market-creation-quantum-multiple", d), - ) - } - e.npv.marketCreationQuantumMultiple = d - return nil -} - -func (e *Engine) OnMarketPartiesMaximumStopOrdersUpdate(ctx context.Context, u *num.Uint) error { - if e.log.IsDebug() { - e.log.Debug("update market parties maxiumum stop orders", - logging.BigUint("value", u), - ) - } - e.npv.marketPartiesMaximumStopOrdersUpdate = u - for _, mkt := range e.allMarketsCpy { - mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, u) - } - return nil -} - -func (e *Engine) OnMaxPeggedOrderUpdate(ctx context.Context, max *num.Uint) error { - if e.log.IsDebug() { - e.log.Debug("update max pegged orders", - logging.Uint64("max-pegged-orders", max.Uint64()), - ) - } - e.maxPeggedOrders = max.Uint64() - return nil -} - func (e *Engine) MarketExists(market string) bool { _, ok := e.allMarkets[market] return ok @@ -1936,6 +1508,48 @@ func (e *Engine) UpdateMarginMode(ctx context.Context, party, marketID string, m return market.UpdateMarginMode(ctx, party, marginMode, marginFactor) } +func (e *Engine) OnMinimalMarginQuantumMultipleUpdate(_ context.Context, multiplier num.Decimal) error { + e.minMaintenanceMarginQuantumMultiplier = multiplier + for _, mkt := range e.futureMarketsCpy { + mkt.OnMinimalMarginQuantumMultipleUpdate(multiplier) + } + return nil +} + +func (e *Engine) OnMinimalHoldingQuantumMultipleUpdate(_ context.Context, multiplier num.Decimal) error { + e.minHoldingQuantumMultiplier = multiplier + for _, mkt := range e.spotMarketsCpy { + mkt.OnMinimalHoldingQuantumMultipleUpdate(multiplier) + } + return nil +} + +func (e *Engine) CheckCanSubmitOrderOrLiquidityCommitment(party, market string) error { + if len(market) == 0 { + return e.collateral.CheckOrderSpamAllMarkets(party) + } + e.lock.RLock() + defer e.lock.RUnlock() + mkt, ok := e.allMarkets[market] + if !ok { + return fmt.Errorf("market does not exist") + } + assets := mkt.GetAssets() + return e.collateral.CheckOrderSpam(party, market, assets) +} + +func (e *Engine) CheckOrderSubmissionForSpam(orderSubmission *types.OrderSubmission, party string) error { + e.lock.RLock() + defer e.lock.RUnlock() + if mkt := e.allMarkets[orderSubmission.MarketID]; mkt == nil { + return types.ErrInvalidMarketID + } + if ftr := e.futureMarkets[orderSubmission.MarketID]; ftr != nil { + return ftr.CheckOrderSubmissionForSpam(orderSubmission, party, e.minMaintenanceMarginQuantumMultiplier) + } + return e.spotMarkets[orderSubmission.MarketID].CheckOrderSubmissionForSpam(orderSubmission, party, e.minHoldingQuantumMultiplier) +} + func (e *Engine) GetFillPriceForMarket(marketID string, volume uint64, side types.Side) (*num.Uint, error) { if mkt, ok := e.allMarkets[marketID]; ok { return mkt.GetFillPrice(volume, side) diff --git a/core/execution/engine_netparams.go b/core/execution/engine_netparams.go new file mode 100644 index 00000000000..85b3033d7ba --- /dev/null +++ b/core/execution/engine_netparams.go @@ -0,0 +1,632 @@ +// 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 execution + +import ( + "context" + "errors" + "time" + + "code.vegaprotocol.io/vega/core/execution/common" + "code.vegaprotocol.io/vega/core/execution/future" + "code.vegaprotocol.io/vega/core/execution/spot" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/logging" + "code.vegaprotocol.io/vega/protos/vega" +) + +type netParamsValues struct { + feeDistributionTimeStep time.Duration + marketValueWindowLength time.Duration + suppliedStakeToObligationFactor num.Decimal + infrastructureFee num.Decimal + makerFee num.Decimal + scalingFactors *types.ScalingFactors + maxLiquidityFee num.Decimal + bondPenaltyFactor num.Decimal + auctionMinDuration time.Duration + auctionMaxDuration time.Duration + probabilityOfTradingTauScaling num.Decimal + minProbabilityOfTradingLPOrders num.Decimal + minLpStakeQuantumMultiple num.Decimal + marketCreationQuantumMultiple num.Decimal + markPriceUpdateMaximumFrequency time.Duration + internalCompositePriceUpdateFrequency time.Duration + marketPartiesMaximumStopOrdersUpdate *num.Uint + + // Liquidity version 2. + liquidityV2BondPenaltyFactor num.Decimal + liquidityV2EarlyExitPenalty num.Decimal + liquidityV2MaxLiquidityFee num.Decimal + liquidityV2SLANonPerformanceBondPenaltyMax num.Decimal + liquidityV2SLANonPerformanceBondPenaltySlope num.Decimal + liquidityV2StakeToCCYVolume num.Decimal + liquidityV2ProvidersFeeCalculationTimeStep time.Duration + liquidityELSFeeFraction num.Decimal + + // AMM + ammCommitmentQuantum *num.Uint + ammCalculationLevels *num.Uint + + // only used for protocol upgrade to v0.74 + chainID uint64 + + // network wide auction duration + lbadTable *types.LongBlockAuctionDurationTable +} + +func defaultNetParamsValues() netParamsValues { + return netParamsValues{ + feeDistributionTimeStep: -1, + marketValueWindowLength: -1, + suppliedStakeToObligationFactor: num.DecimalFromInt64(-1), + infrastructureFee: num.DecimalFromInt64(-1), + makerFee: num.DecimalFromInt64(-1), + scalingFactors: nil, + maxLiquidityFee: num.DecimalFromInt64(-1), + bondPenaltyFactor: num.DecimalFromInt64(-1), + + auctionMinDuration: -1, + probabilityOfTradingTauScaling: num.DecimalFromInt64(-1), + minProbabilityOfTradingLPOrders: num.DecimalFromInt64(-1), + minLpStakeQuantumMultiple: num.DecimalFromInt64(-1), + marketCreationQuantumMultiple: num.DecimalFromInt64(-1), + markPriceUpdateMaximumFrequency: 5 * time.Second, // default is 5 seconds, should come from net params though + internalCompositePriceUpdateFrequency: 5 * time.Second, + marketPartiesMaximumStopOrdersUpdate: num.UintZero(), + + // Liquidity version 2. + liquidityV2BondPenaltyFactor: num.DecimalFromInt64(-1), + liquidityV2EarlyExitPenalty: num.DecimalFromInt64(-1), + liquidityV2MaxLiquidityFee: num.DecimalFromInt64(-1), + liquidityV2SLANonPerformanceBondPenaltyMax: num.DecimalFromInt64(-1), + liquidityV2SLANonPerformanceBondPenaltySlope: num.DecimalFromInt64(-1), + liquidityV2StakeToCCYVolume: num.DecimalFromInt64(-1), + liquidityV2ProvidersFeeCalculationTimeStep: time.Second * 5, + + ammCommitmentQuantum: num.UintZero(), + ammCalculationLevels: num.NewUint(100), + } +} + +func (e *Engine) OnMarketAuctionMinimumDurationUpdate(ctx context.Context, d time.Duration) error { + for _, mkt := range e.allMarketsCpy { + mkt.OnMarketAuctionMinimumDurationUpdate(ctx, d) + } + e.npv.auctionMinDuration = d + return nil +} + +func (e *Engine) OnMarketAuctionMaximumDurationUpdate(ctx context.Context, d time.Duration) error { + for _, mkt := range e.allMarketsCpy { + if mkt.IsOpeningAuction() { + mkt.OnMarketAuctionMaximumDurationUpdate(ctx, d) + } + } + e.npv.auctionMaxDuration = d + return nil +} + +func (e *Engine) OnMarkPriceUpdateMaximumFrequency(ctx context.Context, d time.Duration) error { + for _, mkt := range e.allMarketsCpy { + mkt.OnMarkPriceUpdateMaximumFrequency(ctx, d) + } + e.npv.markPriceUpdateMaximumFrequency = d + return nil +} + +func (e *Engine) OnInternalCompositePriceUpdateFrequency(ctx context.Context, d time.Duration) error { + for _, mkt := range e.futureMarkets { + mkt.OnInternalCompositePriceUpdateFrequency(ctx, d) + } + e.npv.internalCompositePriceUpdateFrequency = d + return nil +} + +// OnMarketLiquidityV2BondPenaltyUpdate stores net param on execution engine and applies to markets at the start of new epoch. +func (e *Engine) OnMarketLiquidityV2BondPenaltyUpdate(_ context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update market liquidity bond penalty (liquidity v2)", + logging.Decimal("bond-penalty-factor", d), + ) + } + + // Set immediately during opening auction + for _, mkt := range e.allMarketsCpy { + if mkt.IsOpeningAuction() { + mkt.OnMarketLiquidityV2BondPenaltyFactorUpdate(d) + } + } + + e.npv.liquidityV2BondPenaltyFactor = d + return nil +} + +// OnMarketLiquidityV2EarlyExitPenaltyUpdate stores net param on execution engine and applies to markets +// at the start of new epoch. +func (e *Engine) OnMarketLiquidityV2EarlyExitPenaltyUpdate(_ context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update market liquidity early exit penalty (liquidity v2)", + logging.Decimal("early-exit-penalty", d), + ) + } + + // Set immediately during opening auction + for _, mkt := range e.allMarketsCpy { + if mkt.IsOpeningAuction() { + mkt.OnMarketLiquidityV2EarlyExitPenaltyUpdate(d) + } + } + + e.npv.liquidityV2EarlyExitPenalty = d + return nil +} + +// OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate stores net param on execution engine and +// applies at the start of new epoch. +func (e *Engine) OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(_ context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update liquidity provision max liquidity fee factor (liquidity v2)", + logging.Decimal("max-liquidity-fee", d), + ) + } + + // Set immediately during opening auction + for _, mkt := range e.allMarketsCpy { + if mkt.IsOpeningAuction() { + mkt.OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(d) + } + } + + e.npv.liquidityV2MaxLiquidityFee = d + return nil +} + +// OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate stores net param on execution engine and applies to markets at the +// start of new epoch. +func (e *Engine) OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(_ context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update market SLA non performance bond penalty slope (liquidity v2)", + logging.Decimal("bond-penalty-slope", d), + ) + } + + // Set immediately during opening auction + for _, mkt := range e.allMarketsCpy { + if mkt.IsOpeningAuction() { + mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(d) + } + } + + e.npv.liquidityV2SLANonPerformanceBondPenaltySlope = d + return nil +} + +// OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate stores net param on execution engine and applies to markets +// at the start of new epoch. +func (e *Engine) OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(_ context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update market SLA non performance bond penalty max (liquidity v2)", + logging.Decimal("bond-penalty-max", d), + ) + } + + for _, m := range e.futureMarketsCpy { + // Set immediately during opening auction + if m.IsOpeningAuction() { + m.OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(d) + } + } + + e.npv.liquidityV2SLANonPerformanceBondPenaltyMax = d + return nil +} + +// OnMarketLiquidityV2StakeToCCYVolumeUpdate stores net param on execution engine and applies to markets +// at the start of new epoch. +func (e *Engine) OnMarketLiquidityV2StakeToCCYVolumeUpdate(_ context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update market stake to CCYVolume (liquidity v2)", + logging.Decimal("stake-to-ccy-volume", d), + ) + } + + for _, m := range e.futureMarketsCpy { + // Set immediately during opening auction + if m.IsOpeningAuction() { + m.OnMarketLiquidityV2StakeToCCYVolume(d) + } + } + + e.npv.liquidityV2StakeToCCYVolume = d + return nil +} + +// OnMarketLiquidityV2ProvidersFeeCalculationTimeStep stores net param on execution engine and applies to markets +// at the start of new epoch. +func (e *Engine) OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(_ context.Context, d time.Duration) error { + if e.log.IsDebug() { + e.log.Debug("update market SLA providers fee calculation time step (liquidity v2)", + logging.Duration("providersFeeCalculationTimeStep", d), + ) + } + + for _, m := range e.allMarketsCpy { + // Set immediately during opening auction + if m.IsOpeningAuction() { + m.OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(d) + } + } + + e.npv.liquidityV2ProvidersFeeCalculationTimeStep = d + return nil +} + +func (e *Engine) OnNetworkWideAuctionDurationUpdated(ctx context.Context, v interface{}) error { + if e.log.IsDebug() { + e.log.Debug("update network wide auction duration", + logging.Reflect("network-wide-auction-duration", v), + ) + } + lbadTable, ok := v.(*vega.LongBlockAuctionDurationTable) + if !ok { + return errors.New("invalid long block auction duration table") + } + lbads, err := types.LongBlockAuctionDurationTableFromProto(lbadTable) + if err != nil { + return err + } + e.npv.lbadTable = lbads + return nil +} + +func (e *Engine) OnMarketMarginScalingFactorsUpdate(ctx context.Context, v interface{}) error { + if e.log.IsDebug() { + e.log.Debug("update market scaling factors", + logging.Reflect("scaling-factors", v), + ) + } + + pscalingFactors, ok := v.(*vega.ScalingFactors) + if !ok { + return errors.New("invalid types for Margin ScalingFactors") + } + scalingFactors := types.ScalingFactorsFromProto(pscalingFactors) + for _, mkt := range e.futureMarketsCpy { + if err := mkt.OnMarginScalingFactorsUpdate(ctx, scalingFactors); err != nil { + return err + } + } + e.npv.scalingFactors = scalingFactors + return nil +} + +func (e *Engine) OnMarketFeeFactorsMakerFeeUpdate(ctx context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update maker fee in market fee factors", + logging.Decimal("maker-fee", d), + ) + } + + for _, mkt := range e.allMarketsCpy { + mkt.OnFeeFactorsMakerFeeUpdate(ctx, d) + } + e.npv.makerFee = d + return nil +} + +func (e *Engine) OnMarketFeeFactorsInfrastructureFeeUpdate(ctx context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update infrastructure fee in market fee factors", + logging.Decimal("infrastructure-fee", d), + ) + } + for _, mkt := range e.allMarketsCpy { + mkt.OnFeeFactorsInfrastructureFeeUpdate(ctx, d) + } + e.npv.infrastructureFee = d + return nil +} + +func (e *Engine) OnMarketValueWindowLengthUpdate(_ context.Context, d time.Duration) error { + if e.log.IsDebug() { + e.log.Debug("update market value window length", + logging.Duration("window-length", d), + ) + } + + for _, mkt := range e.allMarketsCpy { + mkt.OnMarketValueWindowLengthUpdate(d) + } + e.npv.marketValueWindowLength = d + return nil +} + +// to be removed and replaced by its v2 counterpart. in use only for future. +func (e *Engine) OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(_ context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update liquidity provision max liquidity fee factor", + logging.Decimal("max-liquidity-fee", d), + ) + } + + for _, mkt := range e.futureMarketsCpy { + mkt.OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(d) + } + e.npv.maxLiquidityFee = d + + 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", + logging.Decimal("probability-of-trading-tau-scaling", d), + ) + } + for _, mkt := range e.allMarketsCpy { + mkt.OnMarketProbabilityOfTradingTauScalingUpdate(ctx, d) + } + e.npv.probabilityOfTradingTauScaling = d + return nil +} + +func (e *Engine) OnMarketMinProbabilityOfTradingForLPOrdersUpdate(ctx context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update min probability of trading tau scaling", + logging.Decimal("min-probability-of-trading-lp-orders", d), + ) + } + + for _, mkt := range e.allMarketsCpy { + mkt.OnMarketMinProbabilityOfTradingLPOrdersUpdate(ctx, d) + } + e.npv.minProbabilityOfTradingLPOrders = d + return nil +} + +func (e *Engine) OnMinLpStakeQuantumMultipleUpdate(ctx context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update min lp stake quantum multiple", + logging.Decimal("min-lp-stake-quantum-multiple", d), + ) + } + for _, mkt := range e.allMarketsCpy { + mkt.OnMarketMinLpStakeQuantumMultipleUpdate(ctx, d) + } + e.npv.minLpStakeQuantumMultiple = d + return nil +} + +func (e *Engine) OnMarketCreationQuantumMultipleUpdate(ctx context.Context, d num.Decimal) error { + if e.log.IsDebug() { + e.log.Debug("update market creation quantum multiple", + logging.Decimal("market-creation-quantum-multiple", d), + ) + } + e.npv.marketCreationQuantumMultiple = d + return nil +} + +func (e *Engine) OnMarketPartiesMaximumStopOrdersUpdate(ctx context.Context, u *num.Uint) error { + if e.log.IsDebug() { + e.log.Debug("update market parties maxiumum stop orders", + logging.BigUint("value", u), + ) + } + e.npv.marketPartiesMaximumStopOrdersUpdate = u + for _, mkt := range e.allMarketsCpy { + mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, u) + } + return nil +} + +func (e *Engine) OnMaxPeggedOrderUpdate(ctx context.Context, max *num.Uint) error { + if e.log.IsDebug() { + e.log.Debug("update max pegged orders", + logging.Uint64("max-pegged-orders", max.Uint64()), + ) + } + e.maxPeggedOrders = max.Uint64() + 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 + for _, m := range e.allMarketsCpy { + m.OnAMMMinCommitmentQuantumUpdate(ctx, c.Clone()) + } + + return nil +} + +func (e *Engine) OnMarketAMMMaxCalculationLevels(ctx context.Context, c *num.Uint) error { + if e.log.IsDebug() { + e.log.Debug("update amm max calculation levels", + logging.BigUint("ccalculation-levels", c), + ) + } + e.npv.ammCalculationLevels = c + for _, m := range e.allMarketsCpy { + m.OnMarketAMMMaxCalculationLevels(ctx, c.Clone()) + } + return nil +} + +func (e *Engine) propagateSpotInitialNetParams(ctx context.Context, mkt *spot.Market, isRestore bool) error { + if !e.npv.minLpStakeQuantumMultiple.Equal(num.DecimalFromInt64(-1)) { + mkt.OnMarketMinLpStakeQuantumMultipleUpdate(ctx, e.npv.minLpStakeQuantumMultiple) + } + if e.npv.auctionMinDuration != -1 { + mkt.OnMarketAuctionMinimumDurationUpdate(ctx, e.npv.auctionMinDuration) + } + if e.npv.auctionMaxDuration > 0 { + mkt.OnMarketAuctionMaximumDurationUpdate(ctx, e.npv.auctionMaxDuration) + } + if !e.npv.infrastructureFee.Equal(num.DecimalFromInt64(-1)) { + mkt.OnFeeFactorsInfrastructureFeeUpdate(ctx, e.npv.infrastructureFee) + } + + if !e.npv.makerFee.Equal(num.DecimalFromInt64(-1)) { + mkt.OnFeeFactorsMakerFeeUpdate(ctx, e.npv.makerFee) + } + + if e.npv.marketValueWindowLength != -1 { + mkt.OnMarketValueWindowLengthUpdate(e.npv.marketValueWindowLength) + } + + if e.npv.markPriceUpdateMaximumFrequency > 0 { + mkt.OnMarkPriceUpdateMaximumFrequency(ctx, e.npv.markPriceUpdateMaximumFrequency) + } + + if !e.npv.liquidityV2EarlyExitPenalty.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2EarlyExitPenaltyUpdate(e.npv.liquidityV2EarlyExitPenalty) + } + + if !e.npv.liquidityV2MaxLiquidityFee.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(e.npv.liquidityV2MaxLiquidityFee) + } + + if !e.npv.liquidityV2SLANonPerformanceBondPenaltySlope.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltySlope) + } + + if !e.npv.liquidityV2SLANonPerformanceBondPenaltyMax.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltyMax) + } + + if !e.npv.liquidityV2StakeToCCYVolume.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2StakeToCCYVolume(e.npv.liquidityV2StakeToCCYVolume) + } + + mkt.OnMarketPartiesMaximumStopOrdersUpdate(ctx, e.npv.marketPartiesMaximumStopOrdersUpdate) + mkt.OnMinimalHoldingQuantumMultipleUpdate(e.minHoldingQuantumMultiplier) + + e.propagateSLANetParams(ctx, mkt, isRestore) + + if !e.npv.liquidityELSFeeFraction.IsZero() { + mkt.OnMarketLiquidityEquityLikeShareFeeFractionUpdate(e.npv.liquidityELSFeeFraction) + } + return nil +} + +func (e *Engine) propagateInitialNetParamsToFutureMarket(ctx context.Context, mkt *future.Market, isRestore bool) error { + if !e.npv.probabilityOfTradingTauScaling.Equal(num.DecimalFromInt64(-1)) { + mkt.OnMarketProbabilityOfTradingTauScalingUpdate(ctx, e.npv.probabilityOfTradingTauScaling) + } + if !e.npv.minProbabilityOfTradingLPOrders.Equal(num.DecimalFromInt64(-1)) { + mkt.OnMarketMinProbabilityOfTradingLPOrdersUpdate(ctx, e.npv.minProbabilityOfTradingLPOrders) + } + if !e.npv.minLpStakeQuantumMultiple.Equal(num.DecimalFromInt64(-1)) { + mkt.OnMarketMinLpStakeQuantumMultipleUpdate(ctx, e.npv.minLpStakeQuantumMultiple) + } + if e.npv.auctionMinDuration != -1 { + mkt.OnMarketAuctionMinimumDurationUpdate(ctx, e.npv.auctionMinDuration) + } + if e.npv.auctionMaxDuration > 0 { + mkt.OnMarketAuctionMaximumDurationUpdate(ctx, e.npv.auctionMaxDuration) + } + + if !e.npv.infrastructureFee.Equal(num.DecimalFromInt64(-1)) { + mkt.OnFeeFactorsInfrastructureFeeUpdate(ctx, e.npv.infrastructureFee) + } + + if !e.npv.makerFee.Equal(num.DecimalFromInt64(-1)) { + mkt.OnFeeFactorsMakerFeeUpdate(ctx, e.npv.makerFee) + } + + if e.npv.scalingFactors != nil { + if err := mkt.OnMarginScalingFactorsUpdate(ctx, e.npv.scalingFactors); err != nil { + return err + } + } + + if e.npv.marketValueWindowLength != -1 { + mkt.OnMarketValueWindowLengthUpdate(e.npv.marketValueWindowLength) + } + + if !e.npv.maxLiquidityFee.Equal(num.DecimalFromInt64(-1)) { + mkt.OnMarketLiquidityMaximumLiquidityFeeFactorLevelUpdate(e.npv.maxLiquidityFee) + } + if e.npv.markPriceUpdateMaximumFrequency > 0 { + mkt.OnMarkPriceUpdateMaximumFrequency(ctx, e.npv.markPriceUpdateMaximumFrequency) + } + 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.OnMinimalMarginQuantumMultipleUpdate(e.minMaintenanceMarginQuantumMultiplier) + + mkt.OnAMMMinCommitmentQuantumUpdate(ctx, e.npv.ammCommitmentQuantum) + mkt.OnMarketAMMMaxCalculationLevels(ctx, e.npv.ammCalculationLevels) + + e.propagateSLANetParams(ctx, mkt, isRestore) + + return nil +} + +func (e *Engine) propagateSLANetParams(_ context.Context, mkt common.CommonMarket, isRestore bool) { + if !e.npv.liquidityV2BondPenaltyFactor.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2BondPenaltyFactorUpdate(e.npv.liquidityV2BondPenaltyFactor) + } + + if !e.npv.liquidityV2EarlyExitPenalty.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2EarlyExitPenaltyUpdate(e.npv.liquidityV2EarlyExitPenalty) + } + + if !e.npv.liquidityV2MaxLiquidityFee.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2MaximumLiquidityFeeFactorLevelUpdate(e.npv.liquidityV2MaxLiquidityFee) + } + + if !e.npv.liquidityV2SLANonPerformanceBondPenaltySlope.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltySlopeUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltySlope) + } + + if !e.npv.liquidityV2SLANonPerformanceBondPenaltyMax.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2SLANonPerformanceBondPenaltyMaxUpdate(e.npv.liquidityV2SLANonPerformanceBondPenaltyMax) + } + + if !e.npv.liquidityV2StakeToCCYVolume.Equal(num.DecimalFromInt64(-1)) { //nolint:staticcheck + mkt.OnMarketLiquidityV2StakeToCCYVolume(e.npv.liquidityV2StakeToCCYVolume) + } + + if !isRestore && e.npv.liquidityV2ProvidersFeeCalculationTimeStep != 0 { + mkt.OnMarketLiquidityV2ProvidersFeeCalculationTimeStep(e.npv.liquidityV2ProvidersFeeCalculationTimeStep) + } +} diff --git a/core/execution/engine_snapshot.go b/core/execution/engine_snapshot.go index 82ebd5eedc5..05a56317fef 100644 --- a/core/execution/engine_snapshot.go +++ b/core/execution/engine_snapshot.go @@ -22,6 +22,7 @@ import ( "time" "code.vegaprotocol.io/vega/core/assets" + "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/execution/common" "code.vegaprotocol.io/vega/core/execution/future" "code.vegaprotocol.io/vega/core/execution/spot" @@ -146,7 +147,7 @@ func (e *Engine) restoreSpotMarket(ctx context.Context, em *types.ExecSpotMarket ) return nil, err } - + e.delayTransactionsTarget.MarketDelayRequiredUpdated(mkt.GetID(), marketConfig.EnableTxReordering) e.spotMarkets[marketConfig.ID] = mkt e.spotMarketsCpy = append(e.spotMarketsCpy, mkt) e.allMarkets[marketConfig.ID] = mkt @@ -156,8 +157,6 @@ func (e *Engine) restoreSpotMarket(ctx context.Context, em *types.ExecSpotMarket } // ensure this is set correctly mkt.SetNextMTM(nextMTM) - - e.publishNewMarketInfos(ctx, mkt.GetMarketData(), *mkt.Mkt()) return mkt, nil } @@ -217,6 +216,7 @@ func (e *Engine) restoreMarket(ctx context.Context, em *types.ExecMarket) (*futu e.referralDiscountRewardService, e.volumeDiscountService, e.banking, + e.parties, ) if err != nil { e.log.Error("failed to instantiate market", @@ -229,6 +229,7 @@ func (e *Engine) restoreMarket(ctx context.Context, em *types.ExecMarket) (*futu mkt.SetSucceeded() } + e.delayTransactionsTarget.MarketDelayRequiredUpdated(mkt.GetID(), marketConfig.EnableTxReordering) e.futureMarkets[marketConfig.ID] = mkt e.futureMarketsCpy = append(e.futureMarketsCpy, mkt) e.allMarkets[marketConfig.ID] = mkt @@ -239,8 +240,6 @@ func (e *Engine) restoreMarket(ctx context.Context, em *types.ExecMarket) (*futu // ensure this is set correctly mkt.SetNextMTM(nextMTM) mkt.SetNextInternalCompositePriceCalc(nextInternalCompositePriceCalc) - - e.publishNewMarketInfos(ctx, mkt.GetMarketData(), *mkt.Mkt()) return mkt, nil } @@ -402,6 +401,11 @@ func (e *Engine) OnStateLoaded(ctx context.Context) error { if err := m.PostRestore(ctx); err != nil { return err } + + // let the core state API know about the market, but not the market data since that will get sent on the very next tick + // if we sent it now it will create market-data from the core state at the *end* of the block when it was originally + // created from core-state at the *start* of the block. + e.broker.Send(events.NewMarketCreatedEvent(ctx, *m.Mkt())) } // use the time as restored by the snapshot t := e.timeService.GetTimeNow() diff --git a/core/execution/engine_snapshot_test.go b/core/execution/engine_snapshot_test.go index 89bb5a1b62b..9453f95d09b 100644 --- a/core/execution/engine_snapshot_test.go +++ b/core/execution/engine_snapshot_test.go @@ -96,9 +96,11 @@ func getMockedEngine(t *testing.T) *engineFake { volumeDiscount.EXPECT().VolumeDiscountFactorForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() referralDiscountReward.EXPECT().GetReferrer(gomock.Any()).Return(types.PartyID(""), errors.New("not a referrer")).AnyTimes() banking := mocks.NewMockBanking(ctrl) - + parties := mocks.NewMockParties(ctrl) + delayTarget := mocks.NewMockDelayTransactionsTarget(ctrl) + delayTarget.EXPECT().MarketDelayRequiredUpdated(gomock.Any(), gomock.Any()).AnyTimes() mat := common.NewMarketActivityTracker(log, teams, balanceChecker, broker) - exec := execution.NewEngine(log, execConfig, timeService, collateralService, oracleService, broker, statevar, mat, asset, referralDiscountReward, volumeDiscount, banking) + exec := execution.NewEngine(log, execConfig, timeService, collateralService, oracleService, broker, statevar, mat, asset, referralDiscountReward, volumeDiscount, banking, parties, delayTarget) epochEngine.NotifyOnEpoch(mat.OnEpochEvent, mat.OnEpochRestore) return &engineFake{ Engine: exec, @@ -163,8 +165,10 @@ func createEngine(t *testing.T) (*execution.Engine, *gomock.Controller) { referralDiscountReward.EXPECT().GetReferrer(gomock.Any()).Return(types.PartyID(""), errors.New("not a referrer")).AnyTimes() mat := common.NewMarketActivityTracker(log, teams, balanceChecker, broker) banking := mocks.NewMockBanking(ctrl) - - e := execution.NewEngine(log, executionConfig, timeService, collateralService, oracleService, broker, statevar, mat, asset, referralDiscountReward, volumeDiscount, banking) + parties := mocks.NewMockParties(ctrl) + delayTarget := mocks.NewMockDelayTransactionsTarget(ctrl) + delayTarget.EXPECT().MarketDelayRequiredUpdated(gomock.Any(), gomock.Any()).AnyTimes() + e := execution.NewEngine(log, executionConfig, timeService, collateralService, oracleService, broker, statevar, mat, asset, referralDiscountReward, volumeDiscount, banking, parties, delayTarget) epochEngine.NotifyOnEpoch(mat.OnEpochEvent, mat.OnEpochRestore) return e, ctrl } diff --git a/core/execution/future/auction.go b/core/execution/future/auction.go index 66d8368c90b..94332e6298c 100644 --- a/core/execution/future/auction.go +++ b/core/execution/future/auction.go @@ -126,6 +126,13 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I if m.as.Trigger() == types.AuctionTriggerLiquidityTargetNotMet || m.as.Trigger() == types.AuctionTriggerUnableToDeployLPOrders { m.as.SetReadyToLeave() } + + if m.as.Trigger() == types.AuctionTriggerLongBlock || m.as.ExtensionTrigger() == types.AuctionTriggerLongBlock { + if endTS := m.as.ExpiresAt(); endTS != nil && endTS.Before(now) { + m.as.SetReadyToLeave() + } + } + // price and liquidity auctions isPrice := m.as.IsPriceAuction() || m.as.IsPriceExtension() if !isPrice { diff --git a/core/execution/future/isolated_margin.go b/core/execution/future/isolated_margin.go index 6131ff22adb..cb908babe62 100644 --- a/core/execution/future/isolated_margin.go +++ b/core/execution/future/isolated_margin.go @@ -71,6 +71,11 @@ func (m *Market) getIsolatedMarginContext(mpos *positions.MarketPosition, order func (m *Market) getAuctionPrice() *num.Uint { var auctionPrice *num.Uint if m.as.InAuction() { + if m.capMax != nil && m.fCap.FullyCollateralised { + // if this is a capped market with max price, this is the price we need to use all the time + // this function is called to calculate margins, and margin calculations are always going to be based on the max price. + return m.capMax.Clone() + } auctionPrice = m.matching.GetIndicativePrice() if markPrice := m.getCurrentMarkPrice(); markPrice != nil && !markPrice.IsZero() && (markPrice.GT(auctionPrice) || auctionPrice == nil) { auctionPrice = markPrice diff --git a/core/execution/future/margin.go b/core/execution/future/margin.go index eea9e5e6037..6574fcdf430 100644 --- a/core/execution/future/margin.go +++ b/core/execution/future/margin.go @@ -33,7 +33,7 @@ func (m *Market) calcMargins(ctx context.Context, pos *positions.MarketPosition, } func (m *Market) updateMargin(ctx context.Context, pos []events.MarketPosition) []events.Risk { - price := m.getCurrentMarkPrice() + price := m.getCurrentMarkPriceForMargin() mID := m.GetID() margins := make([]events.Margin, 0, len(pos)) for _, p := range pos { diff --git a/core/execution/future/market.go b/core/execution/future/market.go index 5bb8a65dce0..4bf2c65722a 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" @@ -79,10 +80,12 @@ type Market struct { closingAt time.Time timeService common.TimeService - mu sync.Mutex + mu sync.RWMutex + markPriceLock sync.RWMutex lastTradedPrice *num.Uint priceFactor num.Decimal + assetFactor num.Decimal // own engines matching *matching.CachedOrderBook @@ -121,9 +124,10 @@ type Market struct { lastMidBuyPrice *num.Uint lastMidSellPrice *num.Uint - bondPenaltyFactor num.Decimal - lastMarketValueProxy num.Decimal - marketValueWindowLength time.Duration + bondPenaltyFactor num.Decimal + lastMarketValueProxy num.Decimal + marketValueWindowLength time.Duration + minMaintenanceMarginQuantumMultiplier num.Decimal // Liquidity Fee feeSplitter *common.FeeSplitter @@ -164,6 +168,11 @@ type Market struct { partyMarginFactor map[string]num.Decimal markPriceCalculator *common.CompositePriceCalculator internalCompositePriceCalculator *common.CompositePriceCalculator + + amm *amm.Engine + + fCap *types.FutureCap + capMax *num.Uint } // NewMarket creates a new market using the market framework configuration and creates underlying engines. @@ -189,6 +198,7 @@ func NewMarket( referralDiscountRewardService fee.ReferralDiscountRewardService, volumeDiscountService fee.VolumeDiscountService, banking common.Banking, + parties common.Parties, ) (*Market, error) { if len(mkt.ID) == 0 { return nil, common.ErrEmptyMarketID @@ -205,11 +215,17 @@ func NewMarket( if exp := int(assetDecimals) - int(mkt.DecimalPlaces); exp != 0 { priceFactor = num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(exp))) } + assetFactor := num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(assetDecimals))) + + asset := tradableInstrument.Instrument.Product.GetAsset() + positionEngine := positions.NewSnapshotEngine(log, positionConfig, mkt.ID, broker) + + ammEngine := amm.New(log, broker, collateralEngine, mkt.GetID(), asset, positionEngine, priceFactor, positionFactor, marketActivityTracker, parties) // @TODO -> the raw auctionstate shouldn't be something exposed to the matching engine // as far as matching goes: it's either an auction or not book := matching.NewCachedOrderBook(log, matchingConfig, mkt.ID, auctionState.InAuction(), peggedOrderNotify) - asset := tradableInstrument.Instrument.Product.GetAsset() + book.SetOffbookSource(ammEngine) riskEngine := risk.NewEngine(log, riskConfig, @@ -238,7 +254,6 @@ func NewMarket( broker, positionFactor, ) - positionEngine := positions.NewSnapshotEngine(log, positionConfig, mkt.ID, broker) feeEngine, err := fee.New(log, feeConfig, *mkt.Fees, asset, positionFactor) if err != nil { @@ -263,6 +278,7 @@ func NewMarket( marketLiquidity := common.NewMarketLiquidity( log, liquidityEngine, collateralEngine, broker, book, equityShares, marketActivityTracker, feeEngine, common.FutureMarketType, mkt.ID, asset, priceFactor, mkt.LiquiditySLAParams.PriceRange, + ammEngine, ) // The market is initially created in a proposed state @@ -290,7 +306,6 @@ func NewMarket( if mkt.LiquidationStrategy == nil { mkt.LiquidationStrategy = liquidation.GetLegacyStrat() } - le := liquidation.New(log, mkt.LiquidationStrategy, mkt.GetID(), broker, book, auctionState, timeService, positionEngine, pMonitor) marketType := mkt.MarketType() market := &Market{ @@ -323,6 +338,7 @@ func NewMarket( stateVarEngine: stateVarEngine, marketActivityTracker: marketActivityTracker, priceFactor: priceFactor, + assetFactor: assetFactor, positionFactor: positionFactor, nextMTM: time.Time{}, // default to zero time maxStopOrdersPerParties: num.UintZero(), @@ -332,11 +348,20 @@ func NewMarket( referralDiscountRewardService: referralDiscountRewardService, volumeDiscountService: volumeDiscountService, partyMarginFactor: map[string]num.Decimal{}, - liquidation: le, banking: banking, markPriceCalculator: common.NewCompositePriceCalculator(ctx, mkt.MarkPriceConfiguration, oracleEngine, timeService), + amm: ammEngine, } + + le := liquidation.New(log, mkt.LiquidationStrategy, mkt.GetID(), broker, book, auctionState, timeService, positionEngine, pMonitor, market.amm) + market.liquidation = le + market.markPriceCalculator.SetOraclePriceScalingFunc(market.scaleOracleData) + if fCap := mkt.TradableInstrument.Instrument.Product.Cap(); fCap != nil { + market.fCap = fCap + market.capMax, _ = num.UintFromDecimal(fCap.MaxPrice.ToDecimal().Mul(priceFactor)) + market.markPriceCalculator.SetMaxPriceCap(market.capMax.Clone()) + } if market.IsPerp() { internalCompositePriceConfig := mkt.TradableInstrument.Instrument.GetPerps().InternalCompositePriceConfig @@ -346,6 +371,9 @@ func NewMarket( } } + // now set AMM engine on liquidity market. + market.liquidity.SetAMM(market.amm) + assets, _ := mkt.GetAssets() market.settlementAsset = assets[0] @@ -395,6 +423,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) @@ -508,6 +540,10 @@ func (m *Market) BeginBlock(ctx context.Context) { } } +func (m *Market) GetAssets() []string { + return []string{m.settlementAsset} +} + // GetPartiesStats is called at the end of the epoch, only once to // be sent to the activity streak engine. This is using the calculated // at the end of the epoch based on the countrer in the position engine. @@ -602,7 +638,7 @@ func (m *Market) Update(ctx context.Context, config *types.Market, oracleEngine m.risk.UpdateModel(m.stateVarEngine, m.tradableInstrument.MarginCalculator, m.tradableInstrument.RiskModel, m.mkt.LinearSlippageFactor, m.mkt.QuadraticSlippageFactor) m.settlement.UpdateProduct(m.tradableInstrument.Instrument.Product) m.tsCalc.UpdateParameters(*m.mkt.LiquidityMonitoringParameters.TargetStakeParameters) - m.pMonitor.UpdateSettings(m.tradableInstrument.RiskModel, m.mkt.PriceMonitoringSettings) + m.pMonitor.UpdateSettings(m.tradableInstrument.RiskModel, m.mkt.PriceMonitoringSettings, m.as) m.liquidity.UpdateMarketConfig(m.tradableInstrument.RiskModel, m.pMonitor) if err := m.markPriceCalculator.UpdateConfig(ctx, oracleEngine, m.mkt.MarkPriceConfiguration); err != nil { m.markPriceCalculator.SetOraclePriceScalingFunc(m.scaleOracleData) @@ -643,6 +679,8 @@ func (m *Market) Update(ctx context.Context, config *types.Market, oracleEngine if tickSizeChanged { peggedOrders := m.matching.GetActivePeggedOrderIDs() peggedOrders = append(peggedOrders, m.peggedOrders.GetParkedIDs()...) + + tickSizeInAsset, _ := num.UintFromDecimal(m.mkt.TickSize.ToDecimal().Mul(m.priceFactor)) for _, po := range peggedOrders { order, err := m.matching.GetOrderByID(po) if err != nil { @@ -651,7 +689,9 @@ func (m *Market) Update(ctx context.Context, config *types.Market, oracleEngine continue } } - if !num.UintZero().Mod(order.PeggedOrder.Offset, m.mkt.TickSize).IsZero() { + offsetInAsset, _ := num.UintFromDecimal(order.PeggedOrder.Offset.ToDecimal().Mul(m.priceFactor)) + if !num.UintZero().Mod(order.PeggedOrder.Offset, m.mkt.TickSize).IsZero() || + (order.PeggedOrder.Reference == types.PeggedReferenceMid && offsetInAsset.IsZero() && tickSizeInAsset.IsZero()) { m.cancelOrder(ctx, order.Party, order.ID) } } @@ -747,7 +787,7 @@ func (m *Market) GetMarketData() types.MarketData { } else { targetStake = m.getTargetStake().String() } - bounds := m.pMonitor.GetCurrentBounds() + bounds := m.pMonitor.GetBounds() for _, b := range bounds { b.MaxValidPrice = m.priceToMarketPrecision(b.MaxValidPrice) // effictively floors this b.MinValidPrice = m.priceToMarketPrecision(b.MinValidPrice) @@ -1033,6 +1073,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) @@ -1098,7 +1139,8 @@ func (m *Market) BlockEnd(ctx context.Context) { // if it's time for mtm, let's do it if (m.nextMTM.IsZero() || !m.nextMTM.After(t)) && !m.as.InAuction() { prevMarkPrice := m.markPriceCalculator.GetPrice() - if _, err := m.markPriceCalculator.CalculateMarkPrice( + m.markPriceLock.Lock() + _, err := m.markPriceCalculator.CalculateMarkPrice( ctx, m.pMonitor, m.as, @@ -1109,7 +1151,9 @@ func (m *Market) BlockEnd(ctx context.Context) { m.mkt.LinearSlippageFactor, m.risk.GetRiskFactors().Short, m.risk.GetRiskFactors().Long, - true, false); err != nil { + true, false) + m.markPriceLock.Unlock() + if err != nil { // start the monitoring auction if required if m.as.AuctionStart() { m.enterAuction(ctx) @@ -1123,17 +1167,22 @@ func (m *Market) BlockEnd(ctx context.Context) { m.tradableInstrument.Instrument.Product.SubmitDataPoint(ctx, m.getCurrentMarkPrice(), m.timeService.GetTimeNow().UnixNano()) } } - m.nextMTM = t.Add(m.mtmDelta) + // mark price mustn't be zero, except for capped futures, where a zero price may well be possible if !m.as.InAuction() && (prevMarkPrice == nil || !m.markPriceCalculator.GetPrice().EQ(prevMarkPrice) || m.settlement.HasTraded()) && - !m.getCurrentMarkPrice().IsZero() { - m.confirmMTM(ctx, false) - closedPositions := m.position.GetClosedPositions() - if len(closedPositions) > 0 { - m.releaseExcessMargin(ctx, closedPositions...) - // also remove all stop orders - m.removeAllStopOrders(ctx, closedPositions...) + (!m.getCurrentMarkPrice().IsZero() || m.capMax != nil) { + if m.confirmMTM(ctx, false) { + closedPositions := m.position.GetClosedPositions() + if len(closedPositions) > 0 { + m.releaseExcessMargin(ctx, closedPositions...) + // also remove all stop orders + m.removeAllStopOrders(ctx, closedPositions...) + } + } else { + // do not increment the next MTM time to now + delta + // this ensures we try to perform the MTM settlement ASAP. + m.nextMTM = t } } } @@ -1235,6 +1284,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() @@ -1268,7 +1321,7 @@ func (m *Market) recordPositionActivity(t *types.Transfer) { } if t.Type == types.TransferTypeMTMWin || t.Type == types.TransferTypeMTMLoss || t.Type == types.TransferTypePerpFundingWin || t.Type == types.TransferTypePerpFundingLoss { - m.marketActivityTracker.RecordM2M(m.settlementAsset, t.Owner, m.mkt.ID, amt) + m.marketActivityTracker.RecordM2M(m.settlementAsset, t.Owner, m.mkt.ID, amt.Div(m.assetFactor)) } if t.Type == types.TransferTypePerpFundingWin || t.Type == types.TransferTypePerpFundingLoss { m.marketActivityTracker.RecordFundingPayment(m.settlementAsset, t.Owner, m.mkt.ID, amt) @@ -1374,27 +1427,45 @@ func (m *Market) getNewPeggedPrice(order *types.Order) (*num.Uint, error) { return num.UintZero(), common.ErrUnableToReprice } - offset, _ := num.UintFromDecimal(order.PeggedOrder.Offset.ToDecimal().Mul(m.priceFactor)) + // we're converting both offset and tick size to asset decimals so we can adjust the price (in asset) directly + priceInMarket, _ := num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) if order.Side == types.SideSell { - price = price.AddSum(offset) + priceInMarket.AddSum(order.PeggedOrder.Offset) // this can only happen when pegged to mid, in which case we want to round to the nearest *better* tick size // but this can never cross the mid by construction as the the minimum offset is 1 tick size and all prices must be // whole multiples of tick size. - if mod := num.UintZero().Mod(price, m.mkt.TickSize); !mod.IsZero() { - price.Sub(price, mod) + if mod := num.UintZero().Mod(priceInMarket, m.mkt.TickSize); !mod.IsZero() { + priceInMarket.Sub(priceInMarket, mod) + } + price, _ := num.UintFromDecimal(priceInMarket.ToDecimal().Mul(m.priceFactor)) + + if m.capMax != nil { + upper := num.UintZero().Sub(m.capMax, num.UintOne()) + price = num.Min(price, upper) + } + if price.IsZero() { + price = num.UintOne() } return price, nil } - if price.LTE(offset) { + if priceInMarket.LTE(order.PeggedOrder.Offset) { return num.UintZero(), common.ErrUnableToReprice } - price.Sub(price, offset) - if mod := num.UintZero().Mod(price, m.mkt.TickSize); !mod.IsZero() { - price = num.UintZero().Sub(price.AddSum(m.mkt.TickSize), mod) + priceInMarket.Sub(priceInMarket, order.PeggedOrder.Offset) + if mod := num.UintZero().Mod(priceInMarket, m.mkt.TickSize); !mod.IsZero() { + priceInMarket = num.UintZero().Sub(priceInMarket.AddSum(m.mkt.TickSize), mod) } + price, _ = num.UintFromDecimal(priceInMarket.ToDecimal().Mul(m.priceFactor)) + if m.capMax != nil { + upper := num.UintZero().Sub(m.capMax, num.UintOne()) + price = num.Min(price, upper) + } + if price.IsZero() { + price = num.UintOne() + } return price, nil } @@ -1427,6 +1498,31 @@ func (m *Market) uncrossOrderAtAuctionEnd(ctx context.Context) { m.uncrossOnLeaveAuction(ctx) } +func (m *Market) EnterLongBlockAuction(ctx context.Context, duration int64) { + if !m.canTrade() { + return + } + + m.mkt.State = types.MarketStateSuspended + m.mkt.TradingMode = types.MarketTradingModelLongBlockAuction + if m.as.InAuction() { + effDuration := int(m.timeService.GetTimeNow().UnixNano()/1e9) + int(duration) - int(m.as.ExpiresAt().UnixNano()/1e9) + if effDuration <= 0 { + return + } + m.as.ExtendAuctionLongBlock(types.AuctionDuration{Duration: int64(effDuration)}) + evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()) + if evt != nil { + m.broker.Send(evt) + } + } else { + m.as.StartLongBlockAuction(m.timeService.GetTimeNow(), duration) + m.tradableInstrument.Instrument.UpdateAuctionState(ctx, true) + m.enterAuction(ctx) + m.broker.Send(events.NewMarketUpdatedEvent(ctx, *m.mkt)) + } +} + func (m *Market) UpdateMarketState(ctx context.Context, changes *types.MarketStateUpdateConfiguration) error { _, blockHash := vegacontext.TraceIDFromContext(ctx) // make deterministic ID for this market, concatenate @@ -1441,9 +1537,14 @@ func (m *Market) UpdateMarketState(ctx context.Context, changes *types.MarketSta if m.mkt.State == types.MarketStatePending || m.mkt.State == types.MarketStateProposed { final = types.MarketStateCancelled } - m.uncrossOrderAtAuctionEnd(ctx) // terminate and settle data (either last traded price for perp, or settlement data provided via governance settlement, _ := num.UintFromDecimal(changes.SettlementPrice.ToDecimal().Mul(m.priceFactor)) + if !m.validateSettlementData(settlement) { + // final settlement is not valid/impossible + return common.ErrSettlementDataOutOfRange + } + // in case we're in auction, uncross + m.uncrossOrderAtAuctionEnd(ctx) m.tradingTerminatedWithFinalState(ctx, final, settlement) } else if changes.UpdateType == types.MarketStateUpdateTypeSuspend { m.mkt.State = types.MarketStateSuspendedViaGovernance @@ -1539,6 +1640,14 @@ func (m *Market) uncrossOnLeaveAuction(ctx context.Context) ([]*types.OrderConfi } } + // if the uncrossed order was generated by an AMM then register its position as if it was submitted + order := uncrossedOrder.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) + } + // then do the confirmation m.handleConfirmation(ctx, uncrossedOrder, nil) @@ -1638,6 +1747,7 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) { t := m.timeService.GetTimeNow().UnixNano() m.markPriceCalculator.SetBookPriceAtTimeT(m.lastTradedPrice, t) + m.markPriceLock.Lock() if _, err := m.markPriceCalculator.CalculateMarkPrice( ctx, m.pMonitor, @@ -1660,7 +1770,7 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) { m.enterAuction(ctx) } } - + m.markPriceLock.Unlock() if wasOpeningAuction && !m.as.IsOpeningAuction() && m.getCurrentMarkPrice().IsZero() { m.markPriceCalculator.OverridePrice(m.lastTradedPrice) m.pMonitor.ResetPriceHistory(m.lastTradedPrice) @@ -1700,9 +1810,10 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) { // now that we've left the auction and all the orders have been unparked, // we can mark all positions using the margin calculation method appropriate // for non-auction mode and carry out any closeouts if need be - m.confirmMTM(ctx, false) - // set next MTM - m.nextMTM = m.timeService.GetTimeNow().Add(m.mtmDelta) + if m.confirmMTM(ctx, false) { + // set next MTM + m.nextMTM = m.timeService.GetTimeNow().Add(m.mtmDelta) + } // we have just left auction, check the network position, dispose of volume if possible m.checkNetwork(ctx, now) } @@ -1782,6 +1893,13 @@ func (m *Market) validateOrder(ctx context.Context, order *types.Order) (err err } return reason } + if order.PeggedOrder.Reference == types.PeggedReferenceMid { + offsetInAsset, _ := num.UintFromDecimal(order.PeggedOrder.Offset.ToDecimal().Mul(m.priceFactor)) + tickSizeInAsset, _ := num.UintFromDecimal(m.mkt.TickSize.ToDecimal().Mul(m.priceFactor)) + if offsetInAsset.IsZero() && tickSizeInAsset.IsZero() { + return fmt.Errorf("invalid offset - pegged mid will cross") + } + } return m.validateTickSize(order.PeggedOrder.Offset) } @@ -1792,6 +1910,8 @@ func (m *Market) validateOrder(ctx context.Context, order *types.Order) (err err return nil } +// validateOrder checks that the order parameters are valid for the market. +// NB: price in market, tickSize in market decimals. func (m *Market) validateTickSize(price *num.Uint) error { d := num.UintZero().Mod(price, m.mkt.TickSize) if !d.IsZero() { @@ -2229,12 +2349,26 @@ func (m *Market) SubmitOrderWithIDGeneratorAndOrderID( m.triggerStopOrders(ctx, idgen) }() order := orderSubmission.IntoOrder(party) + order.CreatedAt = m.timeService.GetTimeNow().UnixNano() + order.ID = orderID if order.Price != nil { order.OriginalPrice = order.Price.Clone() order.Price, _ = num.UintFromDecimal(order.Price.ToDecimal().Mul(m.priceFactor)) + if order.Type == types.OrderTypeLimit && order.PeggedOrder == nil && order.Price.IsZero() { + // limit orders need to be priced > 0 + order.Status = types.OrderStatusRejected + order.Reason = types.OrderErrorPriceNotInTickSize // @TODO add new error + m.broker.Send(events.NewOrderEvent(ctx, order)) + return nil, common.ErrInvalidOrderPrice + } + } + // check max price in case of capped market + if m.capMax != nil && order.Price != nil && order.Price.GTE(m.capMax) { + order.Status = types.OrderStatusRejected + order.Reason = types.OrderErrorPriceLTEMaxPrice + m.broker.Send(events.NewOrderEvent(ctx, order)) + return nil, common.ErrInvalidOrderPrice } - order.CreatedAt = m.timeService.GetTimeNow().UnixNano() - order.ID = orderID if !m.canTrade() { order.Status = types.OrderStatusRejected @@ -2614,6 +2748,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)) @@ -2773,9 +2915,14 @@ func (m *Market) handleConfirmation(ctx context.Context, conf *types.OrderConfir return orderUpdates } -func (m *Market) confirmMTM(ctx context.Context, skipMargin bool) { +// confirmMTM returns false if the MTM settlement was skipped due to price cap. +func (m *Market) confirmMTM(ctx context.Context, skipMargin bool) bool { // now let's get the transfers for MTM settlement mp := m.getCurrentMarkPrice() + // if this is a capped market with a max price, skip MTM until the mark price is within the [0,max_price] range. + if m.capMax != nil && m.capMax.LT(mp) { + return false + } m.liquidation.UpdateMarkPrice(mp.Clone()) evts := m.position.UpdateMarkPrice(mp) settle := m.settlement.SettleMTM(ctx, mp, evts) @@ -2796,6 +2943,10 @@ 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) + return true } func (m *Market) handleRiskEvts(ctx context.Context, margins []events.Risk, isolatedMargin []events.Risk) []*types.Order { @@ -2838,6 +2989,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 +3008,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 { @@ -2973,7 +3132,13 @@ func (m *Market) resolveClosedOutParties(ctx context.Context, distressedMarginEv // so it'll separate the positions still in distress from the // which have acceptable margins increment := m.tradableInstrument.Instrument.Product.GetMarginIncrease(m.timeService.GetTimeNow().UnixNano()) - okPos, closed = m.risk.ExpectMargins(distressedMarginEvts, m.lastTradedPrice.Clone(), increment, m.getAuctionPrice()) + var pr *num.Uint + if m.capMax != nil && m.fCap.FullyCollateralised { + pr = m.capMax.Clone() + } else { + pr = m.lastTradedPrice.Clone() + } + okPos, closed = m.risk.ExpectMargins(distressedMarginEvts, pr, increment, m.getAuctionPrice()) parties := make([]string, 0, len(okPos)) for _, v := range okPos { @@ -3042,6 +3207,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) @@ -3271,7 +3439,7 @@ func (m *Market) collateralAndRisk(ctx context.Context, settle []events.Transfer } } - crossRiskUpdates := m.risk.UpdateMarginsOnSettlement(ctx, crossEvts, m.getCurrentMarkPrice(), increment, m.getAuctionPrice()) + crossRiskUpdates := m.risk.UpdateMarginsOnSettlement(ctx, crossEvts, m.getCurrentMarkPriceForMargin(), increment, m.getAuctionPrice()) isolatedMarginPartiesToClose := []events.Risk{} for _, evt := range isolatedEvts { mrgns, err := m.risk.CheckMarginInvariants(ctx, evt, m.getMarketObservable(nil), increment, m.matching.GetOrdersPerParty(evt.Party()), m.getMarginFactor(evt.Party())) @@ -3678,6 +3846,10 @@ func (m *Market) amendOrder( return nil, nil, err } + if err := m.checkOrderAmendForSpam(amendedOrder); err != nil { + return nil, nil, err + } + if orderAmendment.Price != nil && amendedOrder.OriginalPrice != nil { if err = m.validateTickSize(amendedOrder.OriginalPrice); err != nil { return nil, nil, err @@ -3949,7 +4121,6 @@ func (m *Market) validateOrderAmendment( // We cannot amend from a GFA/GFN orders return types.OrderErrorCannotAmendFromGFAOrGFN } - if order.PeggedOrder == nil { // We cannot change a pegged orders details on a non pegged order if amendment.PeggedOffset != nil || @@ -4490,6 +4661,7 @@ func (m *Market) terminateMarket(ctx context.Context, finalState types.MarketSta }() // we have trades, and the market has been closed. Perform MTM sequence now so the final settlement // works as expected. + m.markPriceLock.Lock() m.markPriceCalculator.CalculateMarkPrice( ctx, m.pMonitor, @@ -4503,6 +4675,7 @@ func (m *Market) terminateMarket(ctx context.Context, finalState types.MarketSta m.risk.GetRiskFactors().Long, false, false) + m.markPriceLock.Unlock() if m.internalCompositePriceCalculator != nil { m.internalCompositePriceCalculator.CalculateMarkPrice( @@ -4543,16 +4716,21 @@ func (m *Market) terminateMarket(ctx context.Context, finalState types.MarketSta m.broker.Send(events.NewMarketUpdatedEvent(ctx, *m.mkt)) var err error - if settlementDataInAsset != nil { + if settlementDataInAsset != nil && m.validateSettlementData(settlementDataInAsset) { m.settlementDataWithLock(ctx, finalState, settlementDataInAsset) } else if m.settlementDataInMarket != nil { // because we need to be able to perform the MTM settlement, only update market state now settlementDataInAsset, err = m.tradableInstrument.Instrument.Product.ScaleSettlementDataToDecimalPlaces(m.settlementDataInMarket, m.assetDP) if err != nil { m.log.Error(err.Error()) - } else { - m.settlementDataWithLock(ctx, finalState, settlementDataInAsset) + return + } + if !m.validateSettlementData(settlementDataInAsset) { + m.log.Warn("invalid settlement data", logging.MarketID(m.GetID())) + m.settlementDataInMarket = nil + return } + m.settlementDataWithLock(ctx, finalState, settlementDataInAsset) } else { m.log.Debug("no settlement data", logging.MarketID(m.GetID())) } @@ -4605,6 +4783,13 @@ func (m *Market) settlementData(ctx context.Context, settlementData *num.Numeric return } + // validate the settlement data + if !m.validateSettlementData(settlementDataInAsset) { + m.log.Warn("settlement data for capped market is invalid", logging.MarketID(m.GetID())) + // reset settlement data, it's not valid + m.settlementDataInMarket = nil + return + } m.settlementDataWithLock(ctx, types.MarketStateSettled, settlementDataInAsset) } @@ -4671,7 +4856,7 @@ func (m *Market) settlementDataPerp(ctx context.Context, settlementData *num.Num // check margin balances increment := m.tradableInstrument.Instrument.Product.GetMarginIncrease(m.timeService.GetTimeNow().UnixNano()) - riskUpdates := m.risk.UpdateMarginsOnSettlement(ctx, crossEvts, m.getCurrentMarkPrice(), increment, m.getAuctionPrice()) + riskUpdates := m.risk.UpdateMarginsOnSettlement(ctx, crossEvts, m.getCurrentMarkPriceForMargin(), increment, m.getAuctionPrice()) isolatedMarginPartiesToClose := []events.Risk{} for _, evt := range isolatedEvts { mrgns, err := m.risk.CheckMarginInvariants(ctx, evt, m.getMarketObservable(nil), increment, m.matching.GetOrdersPerParty(evt.Party()), m.getMarginFactor(evt.Party())) @@ -4690,11 +4875,46 @@ func (m *Market) settlementDataPerp(ctx context.Context, settlementData *num.Num m.checkForReferenceMoves(ctx, orderUpdates, false) } +func (m *Market) ValidateSettlementData(data *num.Uint) bool { + // convert to asset precision + settlement, _ := num.UintFromDecimal(data.ToDecimal().Mul(m.priceFactor)) + return m.validateSettlementData(settlement) +} + +func (m *Market) validateSettlementData(data *num.Uint) bool { + if m.closed { + return false + } + // not capped, accept the data + if m.fCap == nil { + return true + } + // data > max + if m.capMax.LT(data) { + return false + } + // binary capped market: reject if data is not zero and not == max price. + if m.fCap.Binary && !data.IsZero() && !data.EQ(m.capMax) { + return false + } + return true +} + // NB this must be called with the lock already acquired. func (m *Market) settlementDataWithLock(ctx context.Context, finalState types.MarketState, settlementDataInAsset *num.Uint) { if m.closed { return } + if m.capMax != nil && m.capMax.LT(settlementDataInAsset) { + return + } + if m.fCap != nil && m.fCap.Binary { + // binary settlement is either 0 or max price: + if !settlementDataInAsset.IsZero() && !settlementDataInAsset.EQ(m.capMax) { + // not zero, not max price -> no final settlement can occur yet + return + } + } if m.mkt.State == types.MarketStateTradingTerminated && settlementDataInAsset != nil { err := m.closeMarket(ctx, m.timeService.GetTimeNow(), finalState, settlementDataInAsset) @@ -4811,6 +5031,10 @@ func (m *Market) GetTotalOpenPositionCount() uint64 { // getMarketObservable returns current mark price once market is out of opening auction, during opening auction the indicative uncrossing price is returned. func (m *Market) getMarketObservable(fallbackPrice *num.Uint) *num.Uint { + // this is used for margin calculations, so if there's a max price, return that. + if m.capMax != nil && m.fCap.FullyCollateralised { + return m.capMax.Clone() + } // during opening auction we don't have a last traded price, so we use the indicative price instead if m.as.IsOpeningAuction() { if ip := m.matching.GetIndicativePrice(); !ip.IsZero() { @@ -4844,7 +5068,18 @@ func (m *Market) getCurrentInternalCompositePrice() *num.Uint { return m.internalCompositePriceCalculator.GetPrice().Clone() } +// getCurrentMarkPriceForMargin is the same as getCurrentMarkPrice, but adds a check for capped futures. +// if this is called on a future with a max price, then the max price will be returned. This is useful for margin checks. +func (m *Market) getCurrentMarkPriceForMargin() *num.Uint { + if m.capMax != nil && m.fCap.FullyCollateralised { + return m.capMax.Clone() + } + return m.getCurrentMarkPrice() +} + func (m *Market) getCurrentMarkPrice() *num.Uint { + m.markPriceLock.RLock() + defer m.markPriceLock.RUnlock() if m.markPriceCalculator.GetPrice() == nil { return num.UintZero() } @@ -4876,6 +5111,9 @@ func (m *Market) GetRiskFactors() *types.RiskFactor { } func (m *Market) UpdateMarginMode(ctx context.Context, party string, marginMode types.MarginMode, marginFactor num.Decimal) error { + if m.fCap != nil && m.fCap.FullyCollateralised { + return common.ErrIsolatedMarginFullyCollateralised + } if err := m.switchMarginMode(ctx, party, marginMode, marginFactor); err != nil { return err } @@ -4954,7 +5192,7 @@ func (m *Market) switchMarginMode(ctx context.Context, party string, marginMode var auctionPrice *num.Uint if m.as.InAuction() { auctionPrice = marketObservable - markPrice := m.getCurrentMarkPrice() + markPrice := m.getCurrentMarkPriceForMargin() if markPrice != nil && marketObservable.LT(markPrice) { auctionPrice = markPrice } @@ -5024,6 +5262,374 @@ func (m *Market) emitPartyMarginModeUpdated(ctx context.Context, party string, m m.broker.Send(events.NewPartyMarginModeUpdatedEvent(ctx, e)) } +func (m *Market) checkOrderAmendForSpam(order *types.Order) error { + rf := num.DecimalOne() + + factor := m.mkt.LinearSlippageFactor + if m.risk.IsRiskFactorInitialised() { + if order.Side == types.SideBuy { + rf = m.risk.GetRiskFactors().Long + } else { + rf = m.risk.GetRiskFactors().Short + } + } + var price *num.Uint + if order.PeggedOrder == nil { + price, _ = num.UintFromDecimal(order.Price.ToDecimal().Mul(m.priceFactor)) + } else { + priceInMarket, _ := num.UintFromDecimal(m.getCurrentMarkPrice().ToDecimal().Div(m.priceFactor)) + if order.Side == types.SideBuy { + priceInMarket.AddSum(order.PeggedOrder.Offset) + } else { + priceInMarket = priceInMarket.Sub(priceInMarket, order.PeggedOrder.Offset) + } + price, _ = num.UintFromDecimal(priceInMarket.ToDecimal().Mul(m.priceFactor)) + } + margins := num.UintZero().Mul(price, num.NewUint(order.TrueRemaining())).ToDecimal().Div(m.positionFactor) + assetQuantum, err := m.collateral.GetAssetQuantum(m.settlementAsset) + if err != nil { + return err + } + if margins.Mul(rf.Add(factor)).Div(assetQuantum).LessThan(m.minMaintenanceMarginQuantumMultiplier.Mul(assetQuantum)) { + return fmt.Errorf("order value is less than minimum maintenance margin for spam") + } + return nil +} + +func (m *Market) CheckOrderSubmissionForSpam(orderSubmission *types.OrderSubmission, party string, quantumMultiplier num.Decimal) error { + rf := num.DecimalOne() + + factor := m.mkt.LinearSlippageFactor + if m.risk.IsRiskFactorInitialised() { + if orderSubmission.Side == types.SideBuy { + rf = m.risk.GetRiskFactors().Long + } else { + rf = m.risk.GetRiskFactors().Short + } + } + + var price *num.Uint + if orderSubmission.PeggedOrder == nil { + price, _ = num.UintFromDecimal(orderSubmission.Price.ToDecimal().Mul(m.priceFactor)) + } else { + priceInMarket, _ := num.UintFromDecimal(m.getCurrentMarkPrice().ToDecimal().Div(m.priceFactor)) + if orderSubmission.Side == types.SideBuy { + priceInMarket.AddSum(orderSubmission.PeggedOrder.Offset) + } else { + priceInMarket = priceInMarket.Sub(priceInMarket, orderSubmission.PeggedOrder.Offset) + } + price, _ = num.UintFromDecimal(priceInMarket.ToDecimal().Mul(m.priceFactor)) + } + + margins := num.UintZero().Mul(price, num.NewUint(orderSubmission.Size)).ToDecimal().Div(m.positionFactor) + + assetQuantum, err := m.collateral.GetAssetQuantum(m.settlementAsset) + if err != nil { + return err + } + if margins.Mul(rf.Add(factor)).Div(assetQuantum).LessThan(quantumMultiplier.Mul(assetQuantum)) { + return fmt.Errorf("order value is less than minimum maintenance margin for spam") + } + return nil +} + func (m *Market) GetFillPrice(volume uint64, side types.Side) (*num.Uint, error) { return m.matching.GetFillPrice(volume, side) } + +func (m *Market) getRebasingOrder( + price *num.Uint, // the best bid/ask of the market + side types.Side, // side the pool needs to trade as + slippage num.Decimal, + pool *amm.Pool, +) (*types.Order, error) { + var volume uint64 + fairPrice := pool.BestPrice(nil) + oneTick, _ := num.UintFromDecimal(num.DecimalOne().Mul(m.priceFactor)) + + var until *num.Uint + switch side { + case types.SideBuy: + until = fairPrice + slipped := price.ToDecimal().Mul(num.DecimalOne().Add(slippage)) + if stopAt, overflow := num.UintFromDecimal(slipped); !overflow { + until = num.Min(until, stopAt) + } + case types.SideSell: + until = fairPrice + slipped := price.ToDecimal().Mul(num.DecimalOne().Sub(slippage)).Ceil() + if stopAt, overflow := num.UintFromDecimal(slipped); !overflow { + until = num.Max(until, stopAt) + } + } + +Walk: + for { + // get the tradable volume necessary to move the AMM's position from fair-price -> price + required := pool.TradableVolumeInRange(types.OtherSide(side), fairPrice, price) + + // AMM is close enough to the target that is has no volume between, so we do not need to rebase + if required == 0 { + return nil, nil + } + + if volume == 0 { + volume = required + } + + // get the volume available to trade from both the orderbook and other AMM's + ammVolume := m.amm.GetVolumeAtPrice(price, side) + orderVolume := m.matching.GetVolumeAtPrice(price, types.OtherSide(side)) + + // there is enough volume to trade at this level, create the order that the AMM needs to submit + if required < orderVolume+ammVolume { + originalPrice, _ := num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) + return &types.Order{ + ID: m.idgen.NextID(), + MarketID: m.GetID(), + Party: pool.AMMParty, + Side: side, + Price: price, + OriginalPrice: originalPrice, + Size: volume, + Remaining: volume, + TimeInForce: types.OrderTimeInForceIOC, + Type: types.OrderTypeLimit, + CreatedAt: m.timeService.GetTimeNow().UnixNano(), + Status: types.OrderStatusActive, + Reference: "amm-rebase" + pool.AMMParty, + }, nil + } + + volume = required + switch side { + case types.SideBuy: + // this function will walk the price forwards through price levels until we hit the AMM's fair price or slippage price + // i.e 100 -> 101 -> 102 + price = num.UintZero().Add(price, oneTick) + if price.GTE(until) { + break Walk + } + case types.SideSell: + // this function will walk the price backwards through price levels until we hit the AMM's fair price or slippage price + // i.e 100 -> 99 -> 98 + price = num.UintZero().Sub(price, oneTick) + if price.LTE(until) { + break Walk + } + } + } + + return nil, common.ErrAMMCannotRebase +} + +// needsRebase returns whether an AMM at fair-price needs to submit a rebasing order given the current spread on the market. +func (m *Market) needsRebase(fairPrice *num.Uint) (bool, types.Side, *num.Uint) { + if m.as.InAuction() { + return false, types.SideUnspecified, nil + } + + ask, err := m.matching.GetBestAskPrice() + if err == nil && fairPrice.GT(ask) { + return true, types.SideBuy, ask + } + + bid, err := m.matching.GetBestBidPrice() + if err == nil && fairPrice.LT(bid) { + return true, types.SideSell, bid + } + return false, types.SideUnspecified, nil +} + +func VerifyAMMBounds(baseParam *num.Uint, lowerParam *num.Uint, upperParam *num.Uint, priceFactor num.Decimal) error { + base, _ := num.UintFromDecimal(baseParam.ToDecimal().Mul(priceFactor)) + if lowerParam != nil { + lower, _ := num.UintFromDecimal(lowerParam.ToDecimal().Mul(priceFactor)) + if lower.GTE(base) { + return fmt.Errorf(fmt.Sprintf("base (%s) as factored by market and asset decimals must be greater than lower bound (%s)", base.String(), lower.String())) + } + } + if upperParam != nil { + upper, _ := num.UintFromDecimal(upperParam.ToDecimal().Mul(priceFactor)) + if base.GTE(upper) { + return fmt.Errorf(fmt.Sprintf("upper bound (%s) as factored by market and asset decimals must be greater than base (%s)", upper.String(), base.String())) + } + } + return nil +} + +func (m *Market) SubmitAMM(ctx context.Context, submit *types.SubmitAMM, deterministicID string) error { + if !m.canTrade() { + return common.ErrTradingNotAllowed + } + + m.idgen = idgeneration.New(deterministicID) + defer func() { m.idgen = nil }() + + // create the AMM curves but do not confirm it with the engine + var order *types.Order + if err := VerifyAMMBounds(submit.Parameters.Base, submit.Parameters.LowerBound, submit.Parameters.UpperBound, m.priceFactor); err != nil { + return err + } + + pool, err := m.amm.Create(ctx, submit, m.idgen.NextID(), m.risk.GetRiskFactors(), m.risk.GetScalingFactors(), m.risk.GetSlippage()) + if err != nil { + return err + } + + // create a rebasing order if the AMM needs it i.e its base if not within best-bid/best-ask + if ok, side, quote := m.needsRebase(pool.BestPrice(nil)); ok { + order, err = m.getRebasingOrder(quote, side, submit.SlippageTolerance, pool) + if err != nil { + m.broker.Send( + events.NewAMMPoolEvent( + ctx, pool.Owner(), m.GetID(), pool.AMMParty, pool.ID, + pool.CommitmentAmount(), pool.Parameters, + types.AMMPoolStatusRejected, types.AMMStatusReasonCannotRebase, + pool.ProposedFee, nil, nil, + ), + ) + return err + } + } + + _, err = m.amm.UpdateSubAccountBalance(ctx, submit.Party, pool.AMMParty, submit.CommitmentAmount) + if err != nil { + m.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, m.GetID(), pool.AMMParty, pool.ID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMStatusReasonCannotFillCommitment, + pool.ProposedFee, nil, nil, + ), + ) + return err + } + + // if a rebase is not necessary we're done, just confirm with the amm-engine + if order == nil { + m.amm.Confirm(ctx, pool) + m.matching.UpdateAMM(pool.AMMParty) + return nil + } + + if conf, _, err := m.submitValidatedOrder(ctx, order); err != nil || len(conf.Trades) == 0 { + m.log.Error("failed to submit rebasing order", + logging.Order(order), + logging.Error(err), + ) + ledgerMovements, _, _ := m.collateral.SubAccountRelease(ctx, submit.Party, pool.AMMParty, m.GetSettlementAsset(), m.GetID(), nil) + m.broker.Send(events.NewLedgerMovements(ctx, ledgerMovements)) + m.broker.Send( + events.NewAMMPoolEvent( + ctx, submit.Party, m.GetID(), pool.AMMParty, pool.ID, + submit.CommitmentAmount, submit.Parameters, + types.AMMPoolStatusRejected, types.AMMStatusReasonCannotRebase, + pool.ProposedFee, nil, nil, + ), + ) + return err + } + + // rebase successful so confirm the pool with the engine + m.amm.Confirm(ctx, pool) + // now tell the matching engine something new has appeared incase it needs to update its auction IPV cache + m.matching.UpdateAMM(pool.AMMParty) + return nil +} + +func (m *Market) AmendAMM(ctx context.Context, amend *types.AmendAMM, deterministicID string) error { + if !m.canTrade() { + return common.ErrTradingNotAllowed + } + + m.idgen = idgeneration.New(deterministicID) + defer func() { m.idgen = nil }() + + if amend.Parameters != nil { + if err := VerifyAMMBounds(amend.Parameters.Base, amend.Parameters.LowerBound, amend.Parameters.UpperBound, m.priceFactor); err != nil { + return err + } + } + + // get an amended AMM and the existing AMM + pool, existing, err := m.amm.Amend(ctx, amend, m.risk.GetRiskFactors(), m.risk.GetScalingFactors(), m.risk.GetSlippage()) + if err != nil { + return err + } + + // if we failed to rebase the amended pool be sure to reinstante the old one + defer func() { + if err != nil { + m.amm.Confirm(ctx, existing) + } + }() + + var order *types.Order + if ok, side, quote := m.needsRebase(pool.BestPrice(nil)); ok { + order, err = m.getRebasingOrder(quote, side, amend.SlippageTolerance, pool) + if err != nil { + return err + } + } + + // update commitment ready for rebasing + var prevCommitment *num.Uint + if amend.CommitmentAmount != nil { + prevCommitment, err = m.amm.UpdateSubAccountBalance(ctx, pool.Owner(), pool.AMMParty, amend.CommitmentAmount) + if err != nil { + return err + } + } + + if order == nil { + m.amm.Confirm(ctx, pool) + m.matching.UpdateAMM(pool.AMMParty) + return nil + } + + conf, _, err := m.submitValidatedOrder(ctx, order) + if err != nil || len(conf.Trades) == 0 { + m.log.Error("failed to submit rebasing order", + logging.Order(order), + logging.Error(err), + ) + if amend.CommitmentAmount != nil { + _, err = m.amm.UpdateSubAccountBalance(ctx, pool.Owner(), pool.AMMParty, prevCommitment) + } + return err + } + + m.amm.Confirm(ctx, pool) + m.matching.UpdateAMM(pool.AMMParty) + return nil +} + +func (m *Market) CancelAMM(ctx context.Context, cancel *types.CancelAMM, deterministicID string) error { + if !m.canTrade() { + return common.ErrTradingNotAllowed + } + + ammParty, err := m.amm.GetAMMParty(cancel.Party) + if err != nil { + return err + } + + closeout, err := m.amm.CancelAMM(ctx, cancel) + if err != nil { + return err + } + + // tell matching incase it needs to remove the AMM's contribution to the IPV cache + m.matching.UpdateAMM(ammParty) + + 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..ee8e9d9e0ae 100644 --- a/core/execution/future/market_callbacks.go +++ b/core/execution/future/market_callbacks.go @@ -24,6 +24,14 @@ import ( "code.vegaprotocol.io/vega/libs/num" ) +func (m *Market) OnMarketAMMMaxCalculationLevels(ctx context.Context, c *num.Uint) { + m.amm.OnMaxCalculationLevelsUpdate(ctx, c) +} + +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) } @@ -56,6 +64,11 @@ func (m *Market) OnFeeFactorsInfrastructureFeeUpdate(ctx context.Context, d num. m.broker.Send(events.NewMarketUpdatedEvent(ctx, *m.mkt)) } +func (m *Market) OnMinimalMarginQuantumMultipleUpdate(multiplier num.Decimal) error { + m.minMaintenanceMarginQuantumMultiplier = multiplier + return nil +} + func (m *Market) OnMarketValueWindowLengthUpdate(d time.Duration) { m.marketValueWindowLength = d } @@ -144,3 +157,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..cbded574128 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" @@ -67,6 +68,7 @@ func NewMarketFromSnapshot( referralDiscountRewardService fee.ReferralDiscountRewardService, volumeDiscountService fee.VolumeDiscountService, banking common.Banking, + parties common.Parties, ) (*Market, error) { mkt := em.Market @@ -83,13 +85,29 @@ func NewMarketFromSnapshot( return nil, fmt.Errorf("unable to instantiate a new market: %w", err) } + asset := tradableInstrument.Instrument.Product.GetAsset() + exp := int(assetDecimals) - int(mkt.DecimalPlaces) + priceFactor := num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(exp))) + assetFactor := num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(assetDecimals))) + as := monitor.NewAuctionStateFromSnapshot(mkt, em.AuctionState) + positionEngine := positions.NewSnapshotEngine(log, positionConfig, mkt.ID, broker) + + var ammEngine *amm.Engine + if em.Amm == nil { + ammEngine = amm.New(log, broker, collateralEngine, mkt.GetID(), asset, positionEngine, priceFactor, positionFactor, marketActivityTracker, parties) + } else { + ammEngine, err = amm.NewFromProto(log, broker, collateralEngine, mkt.GetID(), asset, positionEngine, em.Amm, priceFactor, positionFactor, marketActivityTracker, parties) + if err != nil { + return nil, err + } + } // @TODO -> the raw auctionstate shouldn't be something exposed to the matching engine // as far as matching goes: it's either an auction or not book := matching.NewCachedOrderBook( log, matchingConfig, mkt.ID, as.InAuction(), peggedOrderNotify) - asset := tradableInstrument.Instrument.Product.GetAsset() + book.SetOffbookSource(ammEngine) // this needs to stay riskEngine := risk.NewEngine(log, @@ -119,7 +137,6 @@ func NewMarketFromSnapshot( broker, positionFactor, ) - positionEngine := positions.NewSnapshotEngine(log, positionConfig, mkt.ID, broker) var feeEngine *fee.Engine if em.FeesStats != nil { @@ -141,9 +158,6 @@ func NewMarketFromSnapshot( return nil, fmt.Errorf("unable to instantiate price monitoring engine: %w", err) } - exp := int(assetDecimals) - int(mkt.DecimalPlaces) - priceFactor := num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(exp))) - // TODO(jeremy): remove this once the upgrade with the .73 have run on mainnet // this is required to support the migration to SLA liquidity if !(mkt.LiquiditySLAParams != nil) { @@ -162,10 +176,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, ammEngine, ) + if err != nil { + return nil, err + } // backward compatibility check for nil stopOrders := stoporders.New(log) @@ -190,7 +209,6 @@ func NewMarketFromSnapshot( // @TODO check for migration from v0.75.8, strictly speaking, not doing so should have the same effect, though... mkt.LiquidationStrategy.DisposalSlippage = mkt.LiquiditySLAParams.PriceRange } - le := liquidation.New(log, mkt.LiquidationStrategy, mkt.GetID(), broker, book, as, timeService, positionEngine, pMonitor) partyMargin := make(map[string]num.Decimal, len(em.PartyMarginFactors)) for _, pmf := range em.PartyMarginFactors { @@ -232,6 +250,7 @@ func NewMarketFromSnapshot( lastMidSellPrice: em.LastMidAsk.Clone(), lastTradedPrice: em.LastTradedPrice, priceFactor: priceFactor, + assetFactor: assetFactor, lastMarketValueProxy: em.LastMarketValueProxy, marketActivityTracker: marketActivityTracker, positionFactor: positionFactor, @@ -242,18 +261,26 @@ func NewMarketFromSnapshot( expiringStopOrders: expiringStopOrders, perp: marketType == types.MarketTypePerp, partyMarginFactor: partyMargin, - liquidation: le, banking: banking, markPriceCalculator: markPriceCalculator, + amm: ammEngine, } markPriceCalculator.SetOraclePriceScalingFunc(market.scaleOracleData) + if fCap := mkt.TradableInstrument.Instrument.Product.Cap(); fCap != nil { + market.fCap = fCap + market.capMax, _ = num.UintFromDecimal(fCap.MaxPrice.ToDecimal().Mul(priceFactor)) + markPriceCalculator.SetMaxPriceCap(market.capMax.Clone()) + } if em.InternalCompositePriceCalculator != nil { market.internalCompositePriceCalculator = common.NewCompositePriceCalculatorFromSnapshot(ctx, nil, timeService, oracleEngine, em.InternalCompositePriceCalculator) market.internalCompositePriceCalculator.SetOraclePriceScalingFunc(market.scaleOracleData) } + le := liquidation.New(log, mkt.LiquidationStrategy, mkt.GetID(), broker, book, as, timeService, positionEngine, pMonitor, market.amm) + market.liquidation = le + for _, p := range em.Parties { market.parties[p] = struct{}{} } @@ -350,6 +377,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/future/market_snapshot_test.go b/core/execution/future/market_snapshot_test.go index da88c867db9..239a7008213 100644 --- a/core/execution/future/market_snapshot_test.go +++ b/core/execution/future/market_snapshot_test.go @@ -258,8 +258,9 @@ func newMarketFromSnapshot(t *testing.T, ctx context.Context, ctrl *gomock.Contr volumeDiscount.EXPECT().VolumeDiscountFactorForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() referralDiscountReward.EXPECT().GetReferrer(gomock.Any()).Return(types.PartyID(""), errors.New("not a referrer")).AnyTimes() banking := mocks.NewMockBanking(ctrl) + parties := mocks.NewMockParties(ctrl) return future.NewMarketFromSnapshot(ctx, log, em, riskConfig, positionConfig, settlementConfig, matchingConfig, feeConfig, liquidityConfig, collateralEngine, oracleEngine, timeService, broker, stubs.NewStateVar(), cfgAsset, marketActivityTracker, - peggedOrderCounterForTest, referralDiscountReward, volumeDiscount, banking) + peggedOrderCounterForTest, referralDiscountReward, volumeDiscount, banking, parties) } diff --git a/core/execution/future/market_test.go b/core/execution/future/market_test.go index cd6f9539a63..8e62e199c84 100644 --- a/core/execution/future/market_test.go +++ b/core/execution/future/market_test.go @@ -72,7 +72,7 @@ var defaultCollateralAssets = []types.Asset{ ID: "ETH", Details: &types.AssetDetails{ Symbol: "ETH", - Quantum: num.DecimalZero(), + Quantum: num.DecimalOne(), }, }, { @@ -81,7 +81,7 @@ var defaultCollateralAssets = []types.Asset{ Name: "VOTE", Symbol: "VOTE", Decimals: 5, - Quantum: num.DecimalZero(), + Quantum: num.DecimalOne(), Source: &types.AssetDetailsBuiltinAsset{ BuiltinAsset: &types.BuiltinAsset{}, }, @@ -245,11 +245,12 @@ func (tm *testMarket) Run(ctx context.Context, mktCfg types.Market) *testMarket referralDiscountReward.EXPECT().RewardsFactorMultiplierAppliedForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() volumeDiscount.EXPECT().VolumeDiscountFactorForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() banking := mocks.NewMockBanking(tm.ctrl) + parties := mocks.NewMockParties(tm.ctrl) mktEngine, err := future.NewMarket(ctx, tm.log, riskConfig, positionConfig, settlementConfig, matchingConfig, feeConfig, liquidityConfig, collateralEngine, oracleEngine, &mktCfg, tm.timeService, tm.broker, mas, statevarEngine, marketActivityTracker, cfgAsset, - peggedOrderCounterForTest, referralDiscountReward, volumeDiscount, banking, + peggedOrderCounterForTest, referralDiscountReward, volumeDiscount, banking, parties, ) require.NoError(tm.t, err) @@ -601,7 +602,7 @@ func getTestMarket2WithDP( Details: &types.AssetDetails{ Symbol: "ETH", Decimals: 0, // no decimals - Quantum: num.DecimalZero(), + Quantum: num.DecimalOne(), }, }) require.NoError(t, err) @@ -619,7 +620,7 @@ func getTestMarket2WithDP( Name: "VOTE", Symbol: "VOTE", Decimals: 5, - Quantum: num.DecimalZero(), + Quantum: num.DecimalOne(), Source: &types.AssetDetailsBuiltinAsset{ BuiltinAsset: &types.BuiltinAsset{}, }, @@ -657,11 +658,12 @@ func getTestMarket2WithDP( referralDiscountReward.EXPECT().RewardsFactorMultiplierAppliedForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() volumeDiscount.EXPECT().VolumeDiscountFactorForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() banking := mocks.NewMockBanking(ctrl) + parties := mocks.NewMockParties(ctrl) mktEngine, err := future.NewMarket(context.Background(), log, riskConfig, positionConfig, settlementConfig, matchingConfig, feeConfig, liquidityConfig, collateralEngine, oracleEngine, mktCfg, timeService, broker, mas, statevar, marketActivityTracker, cfgAsset, - peggedOrderCounterForTest, referralDiscountReward, volumeDiscount, banking) + peggedOrderCounterForTest, referralDiscountReward, volumeDiscount, banking, parties) if err != nil { t.Fatalf("couldn't create a market: %v", err) } @@ -3353,7 +3355,20 @@ func TestPriceMonitoringBoundsInGetMarketData(t *testing.T) { auctionEndTime := openEnd.Add(time.Duration(t1.AuctionExtension) * time.Second) require.Equal(t, auctionEndTime.UnixNano(), auctionEnd) // In auction require.Equal(t, types.MarketStateSuspended, tm.market.State()) - require.Equal(t, 1, len(md.PriceMonitoringBounds)) + // 2 in total + require.Equal(t, 2, len(md.PriceMonitoringBounds)) + active, triggerd := 0, 0 + for _, v := range md.PriceMonitoringBounds { + if v.Active { + active++ + continue + } + triggerd++ + } + // 1 active + require.Equal(t, 1, active) + // 1 triggered + require.Equal(t, 1, triggerd) tm.now = auctionEndTime closed := tm.market.OnTick(vegacontext.WithTraceID(context.Background(), vgcrypto.RandomHash()), auctionEndTime) @@ -6700,3 +6715,15 @@ func TestLiquidityFeeSettingsConstantFee(t *testing.T) { // doesn't matter what the LP's set in their nomination, the fee is going to be a constant 0.8 assert.Equal(t, "0.8", fee) } + +func TestVerifyAMMBounds(t *testing.T) { + require.Equal(t, "base (8) as factored by market and asset decimals must be greater than lower bound (8)", future.VerifyAMMBounds(num.NewUint(85), num.NewUint(82), num.NewUint(88), num.NewDecimalFromFloat(0.1)).Error()) + require.Equal(t, "upper bound (8) as factored by market and asset decimals must be greater than base (8)", future.VerifyAMMBounds(num.NewUint(85), num.NewUint(78), num.NewUint(88), num.NewDecimalFromFloat(0.1)).Error()) + require.Equal(t, "base (8) as factored by market and asset decimals must be greater than lower bound (8)", future.VerifyAMMBounds(num.NewUint(85), num.NewUint(80), num.NewUint(90), num.NewDecimalFromFloat(0.1)).Error()) + require.NoError(t, future.VerifyAMMBounds(num.NewUint(85), num.NewUint(78), num.NewUint(90), num.NewDecimalFromFloat(0.1))) + + require.NoError(t, future.VerifyAMMBounds(num.NewUint(85), num.NewUint(82), num.NewUint(88), num.NewDecimalFromFloat(1.1))) + require.NoError(t, future.VerifyAMMBounds(num.NewUint(85), num.NewUint(78), num.NewUint(88), num.NewDecimalFromFloat(1.1))) + require.NoError(t, future.VerifyAMMBounds(num.NewUint(85), num.NewUint(80), num.NewUint(90), num.NewDecimalFromFloat(1.1))) + require.NoError(t, future.VerifyAMMBounds(num.NewUint(85), num.NewUint(78), num.NewUint(90), num.NewDecimalFromFloat(1.1))) +} diff --git a/core/execution/liquidation/engine.go b/core/execution/liquidation/engine.go index 71884c8c4e0..1024af7d181 100644 --- a/core/execution/liquidation/engine.go +++ b/core/execution/liquidation/engine.go @@ -32,7 +32,7 @@ import ( "code.vegaprotocol.io/vega/logging" ) -//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/execution/liquidation Book,IDGen,Positions,PriceMonitor +//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/execution/liquidation Book,IDGen,Positions,PriceMonitor,AMM type PriceMonitor interface { GetValidPriceRange() (num.WrappedDecimal, num.WrappedDecimal) @@ -42,6 +42,10 @@ type Book interface { GetVolumeAtPrice(price *num.Uint, side types.Side) uint64 } +type AMM interface { + GetVolumeAtPrice(price *num.Uint, side types.Side) uint64 +} + type IDGen interface { NextID() string } @@ -65,6 +69,7 @@ type Engine struct { position Positions stopped bool pmon PriceMonitor + amm AMM } // protocol upgrade - default values for existing markets/proposals. @@ -100,7 +105,7 @@ func GetLegacyStrat() *types.LiquidationStrategy { return legacyStrat.DeepClone() } -func New(log *logging.Logger, cfg *types.LiquidationStrategy, mktID string, broker common.Broker, book Book, as common.AuctionState, tSvc common.TimeService, pe Positions, pmon PriceMonitor) *Engine { +func New(log *logging.Logger, cfg *types.LiquidationStrategy, mktID string, broker common.Broker, book Book, as common.AuctionState, tSvc common.TimeService, pe Positions, pmon PriceMonitor, amm AMM) *Engine { // NOTE: This can be removed after protocol upgrade if cfg == nil { cfg = legacyStrat.DeepClone() @@ -116,6 +121,7 @@ func New(log *logging.Logger, cfg *types.LiquidationStrategy, mktID string, brok position: pe, pos: &Pos{}, pmon: pmon, + amm: amm, } } @@ -166,6 +172,7 @@ func (e *Engine) OnTick(ctx context.Context, now time.Time, midPrice *num.Uint) size = uint64(num.DecimalFromFloat(float64(size)).Mul(e.cfg.DisposalFraction).Ceil().IntPart()) } available := e.book.GetVolumeAtPrice(bound, bookSide) + available += e.amm.GetVolumeAtPrice(price, side) if available == 0 { return nil, nil } diff --git a/core/execution/liquidation/engine_test.go b/core/execution/liquidation/engine_test.go index 9fff759c66b..9f26a9409f4 100644 --- a/core/execution/liquidation/engine_test.go +++ b/core/execution/liquidation/engine_test.go @@ -46,6 +46,7 @@ type tstEngine struct { tSvc *cmocks.MockTimeService pos *mocks.MockPositions pmon *mocks.MockPriceMonitor + amm *mocks.MockAMM } type marginStub struct { @@ -58,6 +59,7 @@ type SliceLenMatcher[T any] int func TestOrderbookPriceLimits(t *testing.T) { t.Run("orderbook has no volume", testOrderbookHasNoVolume) + t.Run("orderbook has no volume, but vAMM's provide volume", testOrderbookEmptyButAMMVolume) t.Run("orderbook has a volume of one (consumed fraction rounding)", testOrderbookFractionRounding) t.Run("orderbook has plenty of volume (should not increase order size)", testOrderbookExceedsVolume) t.Run("orderbook only has volume above price monitoring bounds", testOrderCappedByPriceMonitor) @@ -108,11 +110,14 @@ func TestNetworkReducesOverTime(t *testing.T) { midPrice := num.NewUint(100) t.Run("call to ontick within the time step does nothing", func(t *testing.T) { + next := now.Add(config.DisposalTimeStep) now = now.Add(2 * time.Second) eng.as.EXPECT().InAuction().Times(1).Return(false) order, err := eng.OnTick(ctx, now, midPrice) require.Nil(t, order) require.NoError(t, err) + ns := eng.GetNextCloseoutTS() + require.Equal(t, ns, next.UnixNano()) }) t.Run("after the time step passes, the first batch is disposed of", func(t *testing.T) { @@ -120,6 +125,7 @@ func TestNetworkReducesOverTime(t *testing.T) { eng.as.EXPECT().InAuction().Times(1).Return(false) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(0)) order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) @@ -148,6 +154,7 @@ func TestNetworkReducesOverTime(t *testing.T) { eng.as.EXPECT().InAuction().Times(1).Return(false) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(0)) order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) @@ -179,6 +186,7 @@ func TestNetworkReducesOverTime(t *testing.T) { eng.as.EXPECT().InAuction().Times(1).Return(false) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(0)) order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) @@ -199,6 +207,7 @@ func TestNetworkReducesOverTime(t *testing.T) { eng.as.EXPECT().InAuction().Times(1).Return(false) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(0)) order, err = eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) @@ -221,6 +230,7 @@ func TestNetworkReducesOverTime(t *testing.T) { eng.as.EXPECT().InAuction().Times(1).Return(false) // return a large volume so the full step is disposed eng.book.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(1000)) + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(0)) order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.NotNil(t, order) @@ -263,6 +273,8 @@ func testOrderbookHasNoVolume(t *testing.T) { // now when we close out, the book returns a volume of 0 is available eng.as.EXPECT().InAuction().Times(1).Return(false) eng.book.EXPECT().GetVolumeAtPrice(minP, types.SideBuy).Times(1).Return(uint64(0)) + // the side should represent the side of the order the network places. + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), types.SideSell).Times(1).Return(uint64(0)) order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Nil(t, order) @@ -313,11 +325,64 @@ func testOrderbookFractionRounding(t *testing.T) { minP, midPrice := num.UintZero(), num.NewUint(100) eng.as.EXPECT().InAuction().Times(1).Return(false) eng.book.EXPECT().GetVolumeAtPrice(minP, types.SideBuy).Times(1).Return(uint64(1)) + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(0)) order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Equal(t, uint64(1), order.Size) } +func testOrderbookEmptyButAMMVolume(t *testing.T) { + mID := "market" + ctx := vegacontext.WithTraceID(context.Background(), vgcrypto.RandomHash()) + config := types.LiquidationStrategy{ + DisposalTimeStep: 0, + DisposalFraction: num.DecimalOne(), + FullDisposalSize: 1000000, // plenty + MaxFractionConsumed: num.DecimalFromFloat(0.5), + DisposalSlippage: num.DecimalFromFloat(10), + } + eng := getTestEngine(t, mID, &config) + require.Zero(t, eng.GetNextCloseoutTS()) + defer eng.Finish() + + eng.pmon.EXPECT().GetValidPriceRange().AnyTimes().Return( + num.NewWrappedDecimal(num.UintZero(), num.DecimalZero()), + num.NewWrappedDecimal(num.MaxUint(), num.MaxDecimal()), + ) + + closed := []events.Margin{ + createMarginEvent("party", mID, 10), + } + var netVol int64 + for _, c := range closed { + netVol += c.Size() + } + now := time.Now() + eng.tSvc.EXPECT().GetTimeNow().Times(2).Return(now) + idCount := len(closed) * 3 + eng.idgen.EXPECT().NextID().Times(idCount).Return("nextID") + // 2 orders per closed position + eng.broker.EXPECT().SendBatch(SliceLenMatcher[events.Event](2 * len(closed))).Times(1) + // 1 trade per closed position + eng.broker.EXPECT().SendBatch(SliceLenMatcher[events.Event](1 * len(closed))).Times(1) + eng.pos.EXPECT().RegisterOrder(gomock.Any(), gomock.Any()).Times(len(closed) * 2) + eng.pos.EXPECT().Update(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(len(closed)) + pos, parties, trades := eng.ClearDistressedParties(ctx, eng.idgen, closed, num.UintZero(), num.UintZero()) + require.Equal(t, len(closed), len(trades)) + require.Equal(t, len(closed), len(pos)) + require.Equal(t, len(closed), len(parties)) + require.Equal(t, closed[0].Party(), parties[0]) + minP, midPrice := num.UintZero(), num.NewUint(100) + eng.as.EXPECT().InAuction().Times(1).Return(false) + // no volume on the book + eng.book.EXPECT().GetVolumeAtPrice(minP, types.SideBuy).Times(1).Return(uint64(0)) + // vAMM's have 100x the available volume, with a factor of 0.5, that's still 50x + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), types.SideSell).Times(1).Return(uint64(netVol * 10)) + order, err := eng.OnTick(ctx, now, midPrice) + require.NoError(t, err) + require.Equal(t, uint64(netVol), order.Size) +} + func testOrderbookExceedsVolume(t *testing.T) { mID := "market" ctx := vegacontext.WithTraceID(context.Background(), vgcrypto.RandomHash()) @@ -362,6 +427,7 @@ func testOrderbookExceedsVolume(t *testing.T) { eng.as.EXPECT().InAuction().Times(1).Return(false) // orderbook has 100x the available volume, with a factor of 0.5, that's still 50x eng.book.EXPECT().GetVolumeAtPrice(minP, types.SideBuy).Times(1).Return(uint64(netVol * 10)) + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(0)) order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Equal(t, uint64(netVol), order.Size) @@ -417,6 +483,7 @@ func testOrderCappedByPriceMonitor(t *testing.T) { // we will check for volume at the price monitoring minimum eng.book.EXPECT().GetVolumeAtPrice(minB, types.SideBuy).Times(1).Return(uint64(netVol * 10)) + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(0)) order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Equal(t, uint64(netVol), order.Size) @@ -483,6 +550,8 @@ func TestLegacySupport(t *testing.T) { minP, midPrice := num.UintZero(), num.NewUint(100) eng.as.EXPECT().InAuction().Times(1).Return(false) eng.book.EXPECT().GetVolumeAtPrice(minP, types.SideBuy).Times(1).Return(uint64(netVol)) + // the side should be the side of the order placed by the network, the side used to call the matching engine is the opposite side + eng.amm.EXPECT().GetVolumeAtPrice(gomock.Any(), gomock.Any()).Times(1).Return(uint64(0)) order, err := eng.OnTick(ctx, now, midPrice) require.NoError(t, err) require.Equal(t, uint64(netVol), order.Size) @@ -609,7 +678,8 @@ func getTestEngine(t *testing.T, marketID string, config *types.LiquidationStrat tSvc := cmocks.NewMockTimeService(ctrl) pe := mocks.NewMockPositions(ctrl) pmon := mocks.NewMockPriceMonitor(ctrl) - engine := liquidation.New(logging.NewDevLogger(), config, marketID, broker, book, as, tSvc, pe, pmon) + amm := mocks.NewMockAMM(ctrl) + engine := liquidation.New(logging.NewDevLogger(), config, marketID, broker, book, as, tSvc, pe, pmon, amm) return &tstEngine{ Engine: engine, ctrl: ctrl, @@ -620,6 +690,7 @@ func getTestEngine(t *testing.T, marketID string, config *types.LiquidationStrat tSvc: tSvc, pos: pe, pmon: pmon, + amm: amm, } } diff --git a/core/execution/liquidation/mocks/mocks.go b/core/execution/liquidation/mocks/mocks.go index 36564847590..507eef4b9c8 100644 --- a/core/execution/liquidation/mocks/mocks.go +++ b/core/execution/liquidation/mocks/mocks.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: code.vegaprotocol.io/vega/core/execution/liquidation (interfaces: Book,IDGen,Positions,PriceMonitor) +// Source: code.vegaprotocol.io/vega/core/execution/liquidation (interfaces: Book,IDGen,Positions,PriceMonitor,AMM) // Package mocks is a generated GoMock package. package mocks @@ -178,3 +178,40 @@ func (mr *MockPriceMonitorMockRecorder) GetValidPriceRange() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetValidPriceRange", reflect.TypeOf((*MockPriceMonitor)(nil).GetValidPriceRange)) } + +// 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 +} + +// GetVolumeAtPrice mocks base method. +func (m *MockAMM) GetVolumeAtPrice(arg0 *num.Uint, arg1 vega.Side) uint64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetVolumeAtPrice", arg0, arg1) + ret0, _ := ret[0].(uint64) + return ret0 +} + +// GetVolumeAtPrice indicates an expected call of GetVolumeAtPrice. +func (mr *MockAMMMockRecorder) GetVolumeAtPrice(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVolumeAtPrice", reflect.TypeOf((*MockAMM)(nil).GetVolumeAtPrice), arg0, arg1) +} diff --git a/core/execution/snapshot_test.go b/core/execution/snapshot_test.go index 055479fad96..6bb7f899871 100644 --- a/core/execution/snapshot_test.go +++ b/core/execution/snapshot_test.go @@ -629,7 +629,9 @@ func getEngine(t *testing.T, vegaPath paths.Paths, now time.Time) *snapshotTestD volumeDiscount.EXPECT().VolumeDiscountFactorForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() referralDiscountReward.EXPECT().GetReferrer(gomock.Any()).Return(types.PartyID(""), errors.New("not a referrer")).AnyTimes() banking := mocks.NewMockBanking(ctrl) - + parties := mocks.NewMockParties(ctrl) + delayTarget := mocks.NewMockDelayTransactionsTarget(ctrl) + delayTarget.EXPECT().MarketDelayRequiredUpdated(gomock.Any(), gomock.Any()).AnyTimes() eng := execution.NewEngine( log, cfg, @@ -643,6 +645,8 @@ func getEngine(t *testing.T, vegaPath paths.Paths, now time.Time) *snapshotTestD referralDiscountReward, volumeDiscount, banking, + parties, + delayTarget, ) statsData := stats.New(log, stats.NewDefaultConfig()) @@ -698,7 +702,9 @@ func getEngineWithParties(t *testing.T, now time.Time, balance *num.Uint, partie volumeDiscount.EXPECT().VolumeDiscountFactorForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() referralDiscountReward.EXPECT().GetReferrer(gomock.Any()).Return(types.PartyID(""), errors.New("not a referrer")).AnyTimes() banking := mocks.NewMockBanking(ctrl) - + partiesMock := mocks.NewMockParties(ctrl) + delayTarget := mocks.NewMockDelayTransactionsTarget(ctrl) + delayTarget.EXPECT().MarketDelayRequiredUpdated(gomock.Any(), gomock.Any()).AnyTimes() eng := execution.NewEngine( log, cfg, @@ -712,6 +718,8 @@ func getEngineWithParties(t *testing.T, now time.Time, balance *num.Uint, partie referralDiscountReward, volumeDiscount, banking, + partiesMock, + delayTarget, ) statsData := stats.New(log, stats.NewDefaultConfig()) diff --git a/core/execution/spot/auction.go b/core/execution/spot/auction.go index c53fd105be6..9733bc2a618 100644 --- a/core/execution/spot/auction.go +++ b/core/execution/spot/auction.go @@ -111,6 +111,12 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I return } + if m.as.Trigger() == types.AuctionTriggerLongBlock || m.as.ExtensionTrigger() == types.AuctionTriggerLongBlock { + if endTS := m.as.ExpiresAt(); endTS != nil && endTS.Before(now) { + m.as.SetReadyToLeave() + } + } + isPrice := m.as.IsPriceAuction() || m.as.IsPriceExtension() if isPrice || m.as.CanLeave() { m.pMonitor.CheckPrice(ctx, m.as, indicativeUncrossingPrice, true, true) diff --git a/core/execution/spot/market.go b/core/execution/spot/market.go index cf71a400d26..d44f2b922ab 100644 --- a/core/execution/spot/market.go +++ b/core/execution/spot/market.go @@ -70,7 +70,8 @@ type Market struct { closingAt time.Time timeService common.TimeService - mu sync.Mutex + mu sync.RWMutex + markPriceLock sync.RWMutex lastTradedPrice *num.Uint markPrice *num.Uint @@ -109,8 +110,9 @@ type Market struct { lastMidBuyPrice *num.Uint lastMidSellPrice *num.Uint - lastMarketValueProxy num.Decimal - marketValueWindowLength time.Duration + lastMarketValueProxy num.Decimal + marketValueWindowLength time.Duration + minHoldingQuantumMultiplier num.Decimal // Liquidity Fee feeSplitter *common.FeeSplitter @@ -217,7 +219,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,10 +262,13 @@ func NewMarket( banking: banking, } liquidity.SetGetStaticPricesFunc(market.getBestStaticPricesDecimal) - return market, nil } +func (m *Market) GetAssets() []string { + return []string{m.baseAsset, m.quoteAsset} +} + func (m *Market) IsOpeningAuction() bool { return m.as.IsOpeningAuction() } @@ -292,11 +298,12 @@ func (m *Market) Update(ctx context.Context, config *types.Market) error { if err != nil { return err } - m.pMonitor.UpdateSettings(riskModel, m.mkt.PriceMonitoringSettings) + m.pMonitor.UpdateSettings(riskModel, m.mkt.PriceMonitoringSettings, m.as) m.liquidity.UpdateMarketConfig(riskModel, m.pMonitor) m.updateLiquidityFee(ctx) if tickSizeChanged { + tickSizeInAsset, _ := num.UintFromDecimal(m.mkt.TickSize.ToDecimal().Mul(m.priceFactor)) peggedOrders := m.matching.GetActivePeggedOrderIDs() peggedOrders = append(peggedOrders, m.peggedOrders.GetParkedIDs()...) for _, po := range peggedOrders { @@ -307,7 +314,9 @@ func (m *Market) Update(ctx context.Context, config *types.Market) error { continue } } - if !num.UintZero().Mod(order.PeggedOrder.Offset, m.mkt.TickSize).IsZero() { + offsetInAsset, _ := num.UintFromDecimal(order.PeggedOrder.Offset.ToDecimal().Mul(m.priceFactor)) + if !num.UintZero().Mod(order.PeggedOrder.Offset, m.mkt.TickSize).IsZero() || + (order.PeggedOrder.Reference == types.PeggedReferenceMid && offsetInAsset.IsZero() && tickSizeInAsset.IsZero()) { m.cancelOrder(ctx, order.Party, order.ID) } } @@ -397,7 +406,7 @@ func (m *Market) GetMarketData() types.MarketData { } targetStake := m.getTargetStake().String() - bounds := m.pMonitor.GetCurrentBounds() + bounds := m.pMonitor.GetBounds() for _, b := range bounds { b.MaxValidPrice = m.priceToMarketPrecision(b.MaxValidPrice) // effictively floors this b.MinValidPrice = m.priceToMarketPrecision(b.MinValidPrice) @@ -478,6 +487,30 @@ func (m *Market) uncrossOrderAtAuctionEnd(ctx context.Context) { m.uncrossOnLeaveAuction(ctx) } +func (m *Market) EnterLongBlockAuction(ctx context.Context, duration int64) { + if !m.canTrade() { + return + } + + m.mkt.State = types.MarketStateSuspended + m.mkt.TradingMode = types.MarketTradingModelLongBlockAuction + if m.as.InAuction() { + effDuration := int(m.timeService.GetTimeNow().UnixNano()/1e9) + int(duration) - int(m.as.ExpiresAt().UnixNano()/1e9) + if effDuration <= 0 { + return + } + m.as.ExtendAuctionLongBlock(types.AuctionDuration{Duration: int64(effDuration)}) + evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()) + if evt != nil { + m.broker.Send(evt) + } + } else { + m.as.StartLongBlockAuction(m.timeService.GetTimeNow(), duration) + m.enterAuction(ctx) + m.broker.Send(events.NewMarketUpdatedEvent(ctx, *m.mkt)) + } +} + func (m *Market) UpdateMarketState(ctx context.Context, changes *types.MarketStateUpdateConfiguration) error { _, blockHash := vegacontext.TraceIDFromContext(ctx) // make deterministic ID for this market, concatenate @@ -673,7 +706,9 @@ func (m *Market) BlockEnd(ctx context.Context) { if !mp.IsZero() && !m.as.InAuction() && (m.nextMTM.IsZero() || !m.nextMTM.After(t)) { m.pMonitor.CheckPrice(ctx, m.as, mp, true, true) if !m.as.InAuction() && !m.as.AuctionStart() { + m.markPriceLock.Lock() m.markPrice = mp + m.markPriceLock.Unlock() m.lastTradedPrice = mp.Clone() m.hasTraded = false } @@ -819,26 +854,29 @@ func (m *Market) getNewPeggedPrice(order *types.Order) (*num.Uint, error) { return num.UintZero(), common.ErrUnableToReprice } - offset, _ := num.UintFromDecimal(order.PeggedOrder.Offset.ToDecimal().Mul(m.priceFactor)) + // we're converting both offset and tick size to asset decimals so we can adjust the price (in asset) directly + priceInMarket, _ := num.UintFromDecimal(price.ToDecimal().Div(m.priceFactor)) if order.Side == types.SideSell { - price = price.AddSum(offset) + priceInMarket.AddSum(order.PeggedOrder.Offset) // this can only happen when pegged to mid, in which case we want to round to the nearest *better* tick size // but this can never cross the mid by construction as the the minimum offset is 1 tick size and all prices must be // whole multiples of tick size. - if mod := num.UintZero().Mod(price, m.mkt.TickSize); !mod.IsZero() { - price.Sub(price, mod) + if mod := num.UintZero().Mod(priceInMarket, m.mkt.TickSize); !mod.IsZero() { + priceInMarket.Sub(priceInMarket, mod) } + price, _ := num.UintFromDecimal(priceInMarket.ToDecimal().Mul(m.priceFactor)) return price, nil } - if price.LTE(offset) { + if priceInMarket.LTE(order.PeggedOrder.Offset) { return num.UintZero(), common.ErrUnableToReprice } - price.Sub(price, offset) - if mod := num.UintZero().Mod(price, m.mkt.TickSize); !mod.IsZero() { - price = num.UintZero().Sub(price.AddSum(m.mkt.TickSize), mod) + priceInMarket.Sub(priceInMarket, order.PeggedOrder.Offset) + if mod := num.UintZero().Mod(priceInMarket, m.mkt.TickSize); !mod.IsZero() { + priceInMarket = num.UintZero().Sub(priceInMarket.AddSum(m.mkt.TickSize), mod) } + price, _ = num.UintFromDecimal(priceInMarket.ToDecimal().Mul(m.priceFactor)) return price, nil } @@ -957,7 +995,9 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) { previousMarkPrice := m.getCurrentMarkPrice() // set the mark price here so that margins checks for special orders use the correct value + m.markPriceLock.Lock() m.markPrice = m.getLastTradedPrice() + m.markPriceLock.Unlock() m.checkForReferenceMoves(ctx, true) if !m.as.InAuction() { @@ -966,11 +1006,14 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) { m.nextMTM = m.timeService.GetTimeNow().Add(m.mtmDelta) } else { // revert to old mark price if we're not leaving the auction after all + m.markPriceLock.Lock() m.markPrice = previousMarkPrice + m.markPriceLock.Unlock() } } // validateOrder checks that the order parameters are valid for the market. +// NB: price in market, tickSize in market decimals. func (m *Market) validateOrder(ctx context.Context, order *types.Order) (err error) { defer func() { if err != nil { @@ -1042,6 +1085,13 @@ func (m *Market) validateOrder(ctx context.Context, order *types.Order) (err err } return reason } + if order.PeggedOrder.Reference == types.PeggedReferenceMid { + offsetInAsset, _ := num.UintFromDecimal(order.PeggedOrder.Offset.ToDecimal().Mul(m.priceFactor)) + tickSizeInAsset, _ := num.UintFromDecimal(m.mkt.TickSize.ToDecimal().Mul(m.priceFactor)) + if offsetInAsset.IsZero() && tickSizeInAsset.IsZero() { + return fmt.Errorf("invalid offset - pegged mid will cross") + } + } return m.validateTickSize(order.PeggedOrder.Offset) } @@ -2036,6 +2086,10 @@ func (m *Market) amendOrder(ctx context.Context, orderAmendment *types.OrderAmen return nil, nil, err } + if err := m.checkOrderAmendForSpam(amendedOrder); err != nil { + return nil, nil, err + } + if orderAmendment.Price != nil && amendedOrder.OriginalPrice != nil { if err = m.validateTickSize(amendedOrder.OriginalPrice); err != nil { return nil, nil, err @@ -2813,6 +2867,8 @@ func (m *Market) GetTotalLPShapeCount() uint64 { // getCurrentMarkPrice returns the current mark price. func (m *Market) getCurrentMarkPrice() *num.Uint { + m.markPriceLock.RLock() + defer m.markPriceLock.RUnlock() if m.markPrice == nil { return num.UintZero() } @@ -3179,7 +3235,9 @@ func scaleQuoteQuantityToAssetDP(sizeUint uint64, priceInAssetDP *num.Uint, posi // closeSpotMarket terminates a market - this can be triggered only via governance. func (m *Market) closeSpotMarket(ctx context.Context) { if m.mkt.State != types.MarketStatePending { + m.markPriceLock.Lock() m.markPrice = m.lastTradedPrice + m.markPriceLock.Unlock() if err := m.closeMarket(ctx); err != nil { m.log.Error("could not close market", logging.Error(err)) } @@ -3237,7 +3295,79 @@ 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") +} + +func (m *Market) ValidateSettlementData(_ *num.Uint) bool { + return true +} + // IDGen is an id generator for orders. type IDGen interface { NextID() string } + +func (m *Market) checkOrderAmendForSpam(order *types.Order) error { + assetQuantum, err := m.collateral.GetAssetQuantum(m.quoteAsset) + if err != nil { + return err + } + + var price *num.Uint + if order.PeggedOrder == nil { + price, _ = num.UintFromDecimal(order.Price.ToDecimal().Mul(m.priceFactor)) + } else { + priceInMarket, _ := num.UintFromDecimal(m.getCurrentMarkPrice().ToDecimal().Div(m.priceFactor)) + if order.Side == types.SideBuy { + priceInMarket.AddSum(order.PeggedOrder.Offset) + } else { + priceInMarket = priceInMarket.Sub(priceInMarket, order.PeggedOrder.Offset) + } + price, _ = num.UintFromDecimal(priceInMarket.ToDecimal().Mul(m.priceFactor)) + } + + minQuantum := assetQuantum.Mul(m.minHoldingQuantumMultiplier) + value := num.UintZero().Mul(num.NewUint(order.Size), price).ToDecimal() + value = value.Div(m.positionFactor).Div(assetQuantum) + if value.LessThan(minQuantum.Mul(assetQuantum)) { + return fmt.Errorf("order value is less than minimum holding requirement for spam") + } + return nil +} + +func (m *Market) CheckOrderSubmissionForSpam(orderSubmission *types.OrderSubmission, party string, quantumMultiplier num.Decimal) error { + assetQuantum, err := m.collateral.GetAssetQuantum(m.quoteAsset) + if err != nil { + return err + } + + var price *num.Uint + if orderSubmission.PeggedOrder == nil { + price, _ = num.UintFromDecimal(orderSubmission.Price.ToDecimal().Mul(m.priceFactor)) + } else { + priceInMarket, _ := num.UintFromDecimal(m.getCurrentMarkPrice().ToDecimal().Div(m.priceFactor)) + if orderSubmission.Side == types.SideBuy { + priceInMarket.AddSum(orderSubmission.PeggedOrder.Offset) + } else { + priceInMarket = priceInMarket.Sub(priceInMarket, orderSubmission.PeggedOrder.Offset) + } + price, _ = num.UintFromDecimal(priceInMarket.ToDecimal().Mul(m.priceFactor)) + } + + minQuantum := assetQuantum.Mul(quantumMultiplier) + value := num.UintZero().Mul(num.NewUint(orderSubmission.Size), price).ToDecimal() + value = value.Div(m.positionFactor).Div(assetQuantum) + if value.LessThan(minQuantum.Mul(assetQuantum)) { + return fmt.Errorf("order value is less than minimum holding requirement for spam") + } + return nil +} diff --git a/core/execution/spot/market_callbacks.go b/core/execution/spot/market_callbacks.go index 049f993e38a..77cc9fa13de 100644 --- a/core/execution/spot/market_callbacks.go +++ b/core/execution/spot/market_callbacks.go @@ -24,6 +24,15 @@ import ( "code.vegaprotocol.io/vega/libs/num" ) +func (m *Market) OnMarketAMMMaxCalculationLevels(ctx context.Context, c *num.Uint) {} + +func (m *Market) OnAMMMinCommitmentQuantumUpdate(ctx context.Context, c *num.Uint) {} + +func (m *Market) OnMinimalHoldingQuantumMultipleUpdate(multiplier num.Decimal) error { + m.minHoldingQuantumMultiplier = multiplier + return nil +} + func (m *Market) OnMarketMinLpStakeQuantumMultipleUpdate(_ context.Context, d num.Decimal) { m.minLPStakeQuantumMultiple = d m.liquidity.OnMinLPStakeQuantumMultiple((d)) @@ -116,3 +125,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 f067c5483f5..3c27306163a 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/execution/spot/market_test.go b/core/execution/spot/market_test.go index 1640a79e27a..c8b84aa9289 100644 --- a/core/execution/spot/market_test.go +++ b/core/execution/spot/market_test.go @@ -75,14 +75,14 @@ var defaultCollateralAssets = []types.Asset{ ID: "ETH", Details: &types.AssetDetails{ Symbol: "ETH", - Quantum: num.DecimalZero(), + Quantum: num.DecimalOne(), }, }, { ID: "BTC", Details: &types.AssetDetails{ Symbol: "BTC", - Quantum: num.DecimalZero(), + Quantum: num.DecimalOne(), }, }, { @@ -91,7 +91,7 @@ var defaultCollateralAssets = []types.Asset{ Name: "VOTE", Symbol: "VOTE", Decimals: 5, - Quantum: num.DecimalZero(), + Quantum: num.DecimalOne(), Source: &types.AssetDetailsBuiltinAsset{ BuiltinAsset: &types.BuiltinAsset{}, }, diff --git a/core/governance/engine.go b/core/governance/engine.go index b76a649ff7f..87c8fc57446 100644 --- a/core/governance/engine.go +++ b/core/governance/engine.go @@ -52,6 +52,7 @@ var ( ErrParentMarketDoesNotExist = errors.New("market to succeed does not exist") ErrParentMarketAlreadySucceeded = errors.New("the parent market was already succeeded by a prior proposal") ErrParentMarketSucceededByCompeting = errors.New("the parent market has been succeeded by a competing propsal") + ErrSettlementDataOutOfRange = errors.New("the settlement data is invalid") ) //go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/governance Markets,StakingAccounts,Assets,TimeService,Witness,NetParams,Banking @@ -73,6 +74,7 @@ type Markets interface { StartOpeningAuction(ctx context.Context, marketID string) error UpdateMarket(ctx context.Context, marketConfig *types.Market) error IsSucceeded(mktID string) bool + ValidateSettlementData(mktID string, data *num.Uint) bool } // StakingAccounts ... @@ -1125,6 +1127,11 @@ func (e *Engine) validateMarketUpdateState(update *types.MarketStateUpdateConfig return types.ProposalErrorInvalidMarket, ErrMarketStateUpdateNotAllowed } + // in case the market is a capped future, make sure the settlement price is valid + if update.SettlementPrice != nil && !e.markets.ValidateSettlementData(marketID, update.SettlementPrice) { + return types.ProposalErrorInvalidStateUpdate, ErrSettlementDataOutOfRange + } + return types.ProposalErrorUnspecified, nil } @@ -1259,6 +1266,7 @@ func (e *Engine) updatedSpotMarketFromProposal(p *proposal) (*types.Market, type SLAParams: terms.Changes.SLAParams, TickSize: terms.Changes.TickSize, LiquidityFeeSettings: terms.Changes.LiquidityFeeSettings, + EnableTxReordering: terms.Changes.EnableTxReordering, }, } @@ -1310,6 +1318,7 @@ func (e *Engine) updatedMarketFromProposal(p *proposal) (*types.Market, types.Pr LiquidationStrategy: terms.Changes.LiquidationStrategy, MarkPriceConfiguration: terms.Changes.MarkPriceConfiguration, TickSize: terms.Changes.TickSize, + EnableTxReordering: terms.Changes.EnableTxReordering, }, } @@ -1340,6 +1349,7 @@ func (e *Engine) updatedMarketFromProposal(p *proposal) (*types.Market, types.Pr DataSourceSpecForSettlementData: product.Future.DataSourceSpecForSettlementData, DataSourceSpecForTradingTermination: product.Future.DataSourceSpecForTradingTermination, DataSourceSpecBinding: product.Future.DataSourceSpecBinding, + Cap: existingMarket.GetFuture().Cap(), }, } case *types.UpdateInstrumentConfigurationPerps: @@ -1368,7 +1378,6 @@ func (e *Engine) updatedMarketFromProposal(p *proposal) (*types.Market, types.Pr if newMarket.Changes.LiquidationStrategy == nil { newMarket.Changes.LiquidationStrategy = existingMarket.LiquidationStrategy } - if perr, err := validateUpdateMarketChange(terms, existingMarket, &enactmentTime{current: p.Terms.EnactmentTimestamp, shouldNotVerify: true}, e.timeService.GetTimeNow(), e.netp); err != nil { return nil, perr, err } diff --git a/core/governance/engine_new_market_test.go b/core/governance/engine_new_market_test.go index 60f41707749..03812333597 100644 --- a/core/governance/engine_new_market_test.go +++ b/core/governance/engine_new_market_test.go @@ -42,6 +42,8 @@ import ( func TestProposalForNewMarket(t *testing.T) { t.Run("Submitting a proposal for new market succeeds", testSubmittingProposalForNewMarketSucceeds) + t.Run("Submitting a proposal for new capped market succeeds", testSubmittingProposalForNewCappedMarketSucceeds) + t.Run("Submitting a proposal for invalid capped market fails", testSubmittingProposalForInvalidCappedMarketFails) t.Run("Submitting a proposal for new perps market succeeds", testSubmittingProposalForNewPerpsMarketSucceeds) t.Run("Submitting a proposal for new perps market succeeds 2", testSubmittingProposalForNewPerpsMarketWithCustomInitialTimeSucceeds) t.Run("Submitting a proposal for new perps market with initial time in past fails", testSubmittingProposalForNewPerpsMarketWithPastInitialTimeFails) @@ -79,6 +81,96 @@ func TestProposalForSuccessorMarket(t *testing.T) { t.Run("Remove proposals for an already succeeded market on tick", testRemoveSuccessorsForRejectedMarket) } +func testSubmittingProposalForInvalidCappedMarketFails(t *testing.T) { + eng := getTestEngine(t, time.Now()) + + // given + party := eng.newValidParty("a-valid-party", 123456789) + proposal := eng.newProposalForCapped(party.Id, eng.tsvc.GetTimeNow().Add(2*time.Hour), nil, nil, true, &types.FutureCap{ + MaxPrice: num.UintZero(), + Binary: true, + FullyCollateralised: true, + }) + + // setup + eng.ensureAllAssetEnabled(t) + eng.expectRejectedProposalEvent(t, party.Id, proposal.ID, types.ProposalErrorInvalidFutureProduct) + + // when + toSubmit, err := eng.submitProposal(t, proposal) + + // then + require.Error(t, err) + require.Nil(t, toSubmit) + + // another failed scenario is when the max price doesn't respect the tick size + proposal = eng.newProposalForCapped(party.Id, eng.tsvc.GetTimeNow().Add(2*time.Hour), nil, nil, true, &types.FutureCap{ + MaxPrice: num.NewUint(1234), + Binary: true, + FullyCollateralised: true, + }) + nmp := proposal.Terms.GetNewMarket() + nmp.Changes.TickSize = num.NewUint(10) + + // setup + eng.ensureAllAssetEnabled(t) + eng.expectRejectedProposalEvent(t, party.Id, proposal.ID, types.ProposalErrorInvalidFutureProduct) + + // when + toSubmit, err = eng.submitProposal(t, proposal) + + // then + require.Error(t, err) + require.Nil(t, toSubmit) +} + +func testSubmittingProposalForNewCappedMarketSucceeds(t *testing.T) { + eng := getTestEngine(t, time.Now()) + + // given + party := eng.newValidParty("a-valid-party", 123456789) + proposal := eng.newProposalForCapped(party.Id, eng.tsvc.GetTimeNow().Add(2*time.Hour), nil, nil, true, &types.FutureCap{ + MaxPrice: num.NewUint(1000), + Binary: true, + FullyCollateralised: true, + }) + + // setup + eng.ensureAllAssetEnabled(t) + eng.expectOpenProposalEvent(t, party.Id, proposal.ID) + + // when + toSubmit, err := eng.submitProposal(t, proposal) + + // then + require.NoError(t, err) + require.NotNil(t, toSubmit) + assert.True(t, toSubmit.IsNewMarket()) + require.NotNil(t, toSubmit.NewMarket().Market()) + + // same as above, but with a tick size that is non-zero + proposal = eng.newProposalForCapped(party.Id, eng.tsvc.GetTimeNow().Add(2*time.Hour), nil, nil, true, &types.FutureCap{ + MaxPrice: num.NewUint(1000), + Binary: true, + FullyCollateralised: true, + }) + nmp := proposal.Terms.GetNewMarket() + nmp.Changes.TickSize = num.NewUint(10) + + // setup + eng.ensureAllAssetEnabled(t) + eng.expectOpenProposalEvent(t, party.Id, proposal.ID) + + // when + toSubmit, err = eng.submitProposal(t, proposal) + + // then + require.NoError(t, err) + require.NotNil(t, toSubmit) + assert.True(t, toSubmit.IsNewMarket()) + require.NotNil(t, toSubmit.NewMarket().Market()) +} + func testSubmittingProposalForNewMarketSucceeds(t *testing.T) { eng := getTestEngine(t, time.Now()) diff --git a/core/governance/engine_test.go b/core/governance/engine_test.go index 5792675dd4b..04bf7958afa 100644 --- a/core/governance/engine_test.go +++ b/core/governance/engine_test.go @@ -1534,7 +1534,7 @@ func newNetParamTerms(key, value string) *types.ProposalTermsUpdateNetworkParame } } -func newMarketTerms(termFilter *dstypes.SpecFilter, termBinding *datasource.SpecBindingForFuture, termExt bool, successor *types.SuccessorConfig) *types.ProposalTermsNewMarket { +func newMarketTerms(termFilter *dstypes.SpecFilter, termBinding *datasource.SpecBindingForFuture, termExt bool, successor *types.SuccessorConfig, fCap *types.FutureCap) *types.ProposalTermsNewMarket { var dt *dsdefinition.Definition if termExt { if termFilter == nil { @@ -1598,6 +1598,7 @@ func newMarketTerms(termFilter *dstypes.SpecFilter, termBinding *datasource.Spec ), DataSourceSpecForTradingTermination: *dt, DataSourceSpecBinding: termBinding, + Cap: fCap, }, }, }, @@ -2030,12 +2031,34 @@ func (e *tstEngine) newProposalForNewPerpsMarket( } } +func (e *tstEngine) newProposalForCapped( + partyID string, + now time.Time, + _ *dstypes.SpecFilter, + _ *datasource.SpecBindingForFuture, + _ bool, + fCap *types.FutureCap, +) types.Proposal { + return e.getMarketProposal(partyID, now, nil, nil, true, fCap) +} + func (e *tstEngine) newProposalForNewMarket( partyID string, now time.Time, termFilter *dstypes.SpecFilter, termBinding *datasource.SpecBindingForFuture, termExt bool, +) types.Proposal { + return e.getMarketProposal(partyID, now, termFilter, termBinding, termExt, nil) +} + +func (e *tstEngine) getMarketProposal( + partyID string, + now time.Time, + termFilter *dstypes.SpecFilter, + termBinding *datasource.SpecBindingForFuture, + termExt bool, + fCap *types.FutureCap, ) types.Proposal { id := e.newProposalID() return types.Proposal{ @@ -2047,7 +2070,7 @@ func (e *tstEngine) newProposalForNewMarket( ClosingTimestamp: now.Add(48 * time.Hour).Unix(), EnactmentTimestamp: now.Add(2 * 48 * time.Hour).Unix(), ValidationTimestamp: now.Add(1 * time.Hour).Unix(), - Change: newMarketTerms(termFilter, termBinding, termExt, nil), + Change: newMarketTerms(termFilter, termBinding, termExt, nil, fCap), }, Rationale: &types.ProposalRationale{ Description: "some description", @@ -2066,7 +2089,7 @@ func (e *tstEngine) newProposalForSuccessorMarket(partyID string, now time.Time, ClosingTimestamp: now.Add(48 * time.Hour).Unix(), EnactmentTimestamp: now.Add(2 * 48 * time.Hour).Unix(), ValidationTimestamp: now.Add(1 * time.Hour).Unix(), - Change: newMarketTerms(termFilter, termBinding, termExt, successor), + Change: newMarketTerms(termFilter, termBinding, termExt, successor, nil), }, Rationale: &types.ProposalRationale{ Description: "some description", diff --git a/core/governance/engine_update_market_state_test.go b/core/governance/engine_update_market_state_test.go index 25a2be5bdbd..84da7fd59c9 100644 --- a/core/governance/engine_update_market_state_test.go +++ b/core/governance/engine_update_market_state_test.go @@ -21,6 +21,7 @@ import ( "code.vegaprotocol.io/vega/core/governance" "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" "github.com/stretchr/testify/require" ) @@ -103,3 +104,54 @@ func TestSubmittingProposalForUpdateMarketStateForUnknownMarketFails(t *testing. require.Nil(t, toSubmit) } } + +func TestSubmittingProposalForUpdateMarketStateWithInvalidSettlementDataFails(t *testing.T) { + eng := getTestEngine(t, time.Now()) + party := eng.newValidParty("party1", 123456789) + price := num.NewUint(123456789) + eng.ensureTokenBalanceForParty(t, party.Id, 123456789) + proposal := eng.newProposalForUpdateMarketState(party.Id, eng.tsvc.GetTimeNow().Add(1*time.Hour), types.MarketStateUpdateTypeTerminate, price) + eng.ensureEquityLikeShareForMarketAndParty(t, proposal.UpdateMarketState().Changes.MarketID, party.Id, 0.1) + mID := proposal.UpdateMarketState().Changes.MarketID + eng.markets.EXPECT().MarketExists(mID).Times(2).Return(true) + eng.markets.EXPECT().GetMarketState(mID).Times(1).Return(types.MarketStateActive, nil) + eng.markets.EXPECT().ValidateSettlementData(mID, price).Times(1).Return(false) + eng.expectRejectedProposalEvent(t, party.Id, proposal.ID, types.ProposalErrorInvalidStateUpdate) + toSubmit, err := eng.submitProposal(t, proposal) + require.Error(t, err) + require.Nil(t, toSubmit) +} + +func TestSubmittingProposalForUpdateMarketStateWithValidSettlementDataSucceeds(t *testing.T) { + eng := getTestEngine(t, time.Now()) + party := eng.newValidParty("party1", 123456789) + price := num.NewUint(123456789) + eng.ensureTokenBalanceForParty(t, party.Id, 123456789) + proposal := eng.newProposalForUpdateMarketState(party.Id, eng.tsvc.GetTimeNow().Add(1*time.Hour), types.MarketStateUpdateTypeTerminate, price) + eng.ensureEquityLikeShareForMarketAndParty(t, proposal.UpdateMarketState().Changes.MarketID, party.Id, 0.1) + mID := proposal.UpdateMarketState().Changes.MarketID + eng.markets.EXPECT().MarketExists(mID).Times(2).Return(true) + eng.markets.EXPECT().GetMarketState(mID).Times(1).Return(types.MarketStateActive, nil) + eng.markets.EXPECT().ValidateSettlementData(mID, price).Times(1).Return(true) + eng.expectOpenProposalEvent(t, party.Id, proposal.ID) + toSubmit, err := eng.submitProposal(t, proposal) + require.NoError(t, err) + require.NotNil(t, toSubmit) + require.True(t, toSubmit.Proposal().IsMarketStateUpdate()) +} + +func TestSubmittingProposalForUpdateMarketStateWithoutSettlementDataSucceeds(t *testing.T) { + eng := getTestEngine(t, time.Now()) + party := eng.newValidParty("party1", 123456789) + eng.ensureTokenBalanceForParty(t, party.Id, 123456789) + proposal := eng.newProposalForUpdateMarketState(party.Id, eng.tsvc.GetTimeNow().Add(1*time.Hour), types.MarketStateUpdateTypeTerminate, nil) + eng.ensureEquityLikeShareForMarketAndParty(t, proposal.UpdateMarketState().Changes.MarketID, party.Id, 0.1) + mID := proposal.UpdateMarketState().Changes.MarketID + eng.markets.EXPECT().MarketExists(mID).Times(2).Return(true) + eng.markets.EXPECT().GetMarketState(mID).Times(1).Return(types.MarketStateActive, nil) + eng.expectOpenProposalEvent(t, party.Id, proposal.ID) + toSubmit, err := eng.submitProposal(t, proposal) + require.NoError(t, err) + require.NotNil(t, toSubmit) + require.True(t, toSubmit.Proposal().IsMarketStateUpdate()) +} diff --git a/core/governance/market.go b/core/governance/market.go index 8f9378a3b28..cbead25e66a 100644 --- a/core/governance/market.go +++ b/core/governance/market.go @@ -70,6 +70,7 @@ var ( ErrInvalidInsurancePoolFraction = errors.New("insurnace pool fraction invalid") ErrUpdateMarketDifferentProduct = errors.New("cannot update a market to a different product type") ErrInvalidEVMChainIDInEthereumOracleSpec = errors.New("invalid source chain id in ethereum oracle spec") + ErrMaxPriceInvalid = errors.New("max price for capped future must be greater than zero") ) func assignProduct( @@ -101,6 +102,7 @@ func assignProduct( DataSourceSpecForSettlementData: datasource.SpecFromDefinition(product.Future.DataSourceSpecForSettlementData), DataSourceSpecForTradingTermination: datasource.SpecFromDefinition(product.Future.DataSourceSpecForTradingTermination), DataSourceSpecBinding: product.Future.DataSourceSpecBinding, + Cap: product.Future.Cap, }, } case *types.InstrumentConfigurationPerps: @@ -248,6 +250,10 @@ func buildMarketFromProposal( } makerFeeDec, _ := num.DecimalFromString(makerFee) infraFeeDec, _ := num.DecimalFromString(infraFee) + // assign here, we want to update this after assigning market variable + marginCalc := &types.MarginCalculator{ + ScalingFactors: types.ScalingFactorsFromProto(&scalingFactors), + } market := &types.Market{ ID: marketID, DecimalPlaces: definition.Changes.DecimalPlaces, @@ -263,10 +269,8 @@ func buildMarketFromProposal( Duration: int64(openingAuctionDuration.Seconds()), }, TradableInstrument: &types.TradableInstrument{ - Instrument: instrument, - MarginCalculator: &types.MarginCalculator{ - ScalingFactors: types.ScalingFactorsFromProto(&scalingFactors), - }, + Instrument: instrument, + MarginCalculator: marginCalc, }, PriceMonitoringSettings: &types.PriceMonitoringSettings{ Parameters: definition.Changes.PriceMonitoringParameters, @@ -278,6 +282,10 @@ func buildMarketFromProposal( LiquidationStrategy: lstrat, MarkPriceConfiguration: definition.Changes.MarkPriceConfiguration, TickSize: definition.Changes.TickSize, + EnableTxReordering: definition.Changes.EnableTxReordering, + } + if fCap := market.TradableInstrument.Instrument.Product.Cap(); fCap != nil { + marginCalc.FullyCollateralised = fCap.FullyCollateralised } // successor proposal if suc := definition.Successor(); suc != nil { @@ -357,6 +365,7 @@ func buildSpotMarketFromProposal( LiquiditySLAParams: definition.Changes.SLAParams, MarkPriceConfiguration: defaultMarkPriceConfig, TickSize: definition.Changes.TickSize, + EnableTxReordering: definition.Changes.EnableTxReordering, } if err := assignSpotRiskModel(definition.Changes, market.TradableInstrument); err != nil { return nil, types.ProposalErrorUnspecified, err @@ -420,7 +429,7 @@ func validateSpot(spot *types.SpotProduct, decimals uint64, positionDecimals int return validateAssetBasic(spot.BaseAsset, assets, positionDecimals, deepCheck) } -func validateFuture(future *types.FutureProduct, decimals uint64, positionDecimals int64, assets Assets, et *enactmentTime, deepCheck bool, evmChainIDs []uint64) (types.ProposalError, error) { +func validateFuture(future *types.FutureProduct, decimals uint64, positionDecimals int64, assets Assets, et *enactmentTime, deepCheck bool, evmChainIDs []uint64, tickSize *num.Uint) (types.ProposalError, error) { future.DataSourceSpecForSettlementData = setDatasourceDefinitionDefaults(future.DataSourceSpecForSettlementData, et) future.DataSourceSpecForTradingTermination = setDatasourceDefinitionDefaults(future.DataSourceSpecForTradingTermination, et) @@ -523,10 +532,33 @@ func validateFuture(future *types.FutureProduct, decimals uint64, positionDecima return types.ProposalErrorInvalidFutureProduct, fmt.Errorf("invalid oracle spec binding for trading termination: %w", err) } } + if err := validateFutureCap(future.Cap, tickSize); err != nil { + return types.ProposalErrorInvalidFutureProduct, fmt.Errorf("invalid capped future configuration: %w", err) + } return validateAsset(future.SettlementAsset, decimals, positionDecimals, assets, deepCheck) } +func validateFutureCap(fCap *types.FutureCap, tickSize *num.Uint) error { + if fCap == nil { + return nil + } + if fCap.MaxPrice.IsZero() { + return ErrMaxPriceInvalid + } + // tick size of nil, zero, or one are fine for this check + mod := num.UintOne() + if tickSize == nil || tickSize.LTE(mod) { + return nil + } + // if maxPrice % tickSize != 0, the max price is invalid + if !mod.Mod(fCap.MaxPrice, tickSize).IsZero() { + return ErrMaxPriceInvalid + } + + return nil +} + func validatePerps(perps *types.PerpsProduct, decimals uint64, positionDecimals int64, assets Assets, et *enactmentTime, currentTime time.Time, deepCheck bool, evmChainIDs []uint64) (types.ProposalError, error) { perps.DataSourceSpecForSettlementData = setDatasourceDefinitionDefaults(perps.DataSourceSpecForSettlementData, et) perps.DataSourceSpecForSettlementSchedule = setDatasourceDefinitionDefaults(perps.DataSourceSpecForSettlementSchedule, et) @@ -633,12 +665,12 @@ func validatePerps(perps *types.PerpsProduct, decimals uint64, positionDecimals return validateAsset(perps.SettlementAsset, decimals, positionDecimals, assets, deepCheck) } -func validateNewInstrument(instrument *types.InstrumentConfiguration, decimals uint64, positionDecimals int64, assets Assets, et *enactmentTime, deepCheck bool, currentTime *time.Time, evmChainIDs []uint64) (types.ProposalError, error) { +func validateNewInstrument(instrument *types.InstrumentConfiguration, decimals uint64, positionDecimals int64, assets Assets, et *enactmentTime, deepCheck bool, currentTime *time.Time, evmChainIDs []uint64, tickSize *num.Uint) (types.ProposalError, error) { switch product := instrument.Product.(type) { case nil: return types.ProposalErrorNoProduct, ErrMissingProduct case *types.InstrumentConfigurationFuture: - return validateFuture(product.Future, decimals, positionDecimals, assets, et, deepCheck, evmChainIDs) + return validateFuture(product.Future, decimals, positionDecimals, assets, et, deepCheck, evmChainIDs, tickSize) case *types.InstrumentConfigurationPerps: return validatePerps(product.Perps, decimals, positionDecimals, assets, et, *currentTime, deepCheck, evmChainIDs) case *types.InstrumentConfigurationSpot: @@ -796,7 +828,7 @@ func validateNewSpotMarketChange( openingAuctionDuration time.Duration, etu *enactmentTime, ) (types.ProposalError, error) { - if perr, err := validateNewInstrument(terms.Changes.Instrument, terms.Changes.PriceDecimalPlaces, terms.Changes.SizeDecimalPlaces, assets, etu, deepCheck, nil, getEVMChainIDs(netp)); err != nil { + if perr, err := validateNewInstrument(terms.Changes.Instrument, terms.Changes.PriceDecimalPlaces, terms.Changes.SizeDecimalPlaces, assets, etu, deepCheck, nil, getEVMChainIDs(netp), terms.Changes.TickSize); err != nil { return perr, err } if perr, err := validateAuctionDuration(openingAuctionDuration, netp); err != nil { @@ -828,7 +860,7 @@ func validateNewMarketChange( restore bool, ) (types.ProposalError, error) { // in all cases, the instrument must be specified and validated, successor markets included. - if perr, err := validateNewInstrument(terms.Changes.Instrument, terms.Changes.DecimalPlaces, terms.Changes.PositionDecimalPlaces, assets, etu, deepCheck, ptr.From(currentTime), getEVMChainIDs(netp)); err != nil { + if perr, err := validateNewInstrument(terms.Changes.Instrument, terms.Changes.DecimalPlaces, terms.Changes.PositionDecimalPlaces, assets, etu, deepCheck, ptr.From(currentTime), getEVMChainIDs(netp), terms.Changes.TickSize); err != nil { return perr, err } // verify opening auction duration, works the same for successor markets diff --git a/core/governance/market_cp_restore_test.go b/core/governance/market_cp_restore_test.go index 29544e9f29c..15ed96971ce 100644 --- a/core/governance/market_cp_restore_test.go +++ b/core/governance/market_cp_restore_test.go @@ -210,8 +210,10 @@ func createExecutionEngine(t *testing.T, tm time.Time) (*execution.Engine, *gove referralDiscountReward.EXPECT().RewardsFactorMultiplierAppliedForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() volumeDiscount.EXPECT().VolumeDiscountFactorForParty(gomock.Any()).Return(num.DecimalZero()).AnyTimes() execBanking := emocks.NewMockBanking(ctrl) - - exec := execution.NewEngine(log, executionConfig, timeService, collateralService, oracleService, broker, statevar, marketTracker, asset, referralDiscountReward, volumeDiscount, execBanking) + parties := emocks.NewMockParties(ctrl) + delayTarget := emocks.NewMockDelayTransactionsTarget(ctrl) + delayTarget.EXPECT().MarketDelayRequiredUpdated(gomock.Any(), gomock.Any()).AnyTimes() + exec := execution.NewEngine(log, executionConfig, timeService, collateralService, oracleService, broker, statevar, marketTracker, asset, referralDiscountReward, volumeDiscount, execBanking, parties, delayTarget) accounts := mocks.NewMockStakingAccounts(ctrl) witness := mocks.NewMockWitness(ctrl) diff --git a/core/governance/mocks/mocks.go b/core/governance/mocks/mocks.go index c8c5a33bd16..4a9b15afdbd 100644 --- a/core/governance/mocks/mocks.go +++ b/core/governance/mocks/mocks.go @@ -157,6 +157,20 @@ func (mr *MockMarketsMockRecorder) UpdateMarket(arg0, arg1 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateMarket", reflect.TypeOf((*MockMarkets)(nil).UpdateMarket), arg0, arg1) } +// ValidateSettlementData mocks base method. +func (m *MockMarkets) ValidateSettlementData(arg0 string, arg1 *num.Uint) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ValidateSettlementData", arg0, arg1) + ret0, _ := ret[0].(bool) + return ret0 +} + +// ValidateSettlementData indicates an expected call of ValidateSettlementData. +func (mr *MockMarketsMockRecorder) ValidateSettlementData(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ValidateSettlementData", reflect.TypeOf((*MockMarkets)(nil).ValidateSettlementData), arg0, arg1) +} + // MockStakingAccounts is a mock of StakingAccounts interface. type MockStakingAccounts struct { ctrl *gomock.Controller diff --git a/core/governance/node_validation.go b/core/governance/node_validation.go index 932c611bfc8..ee34e1c3cd5 100644 --- a/core/governance/node_validation.go +++ b/core/governance/node_validation.go @@ -435,9 +435,9 @@ func (n *NodeValidation) restoreBatch(ctx context.Context, pProto *snapshotpb.Ba nbp := &nodeBatchProposal{ batchProposal: &batchProposal{ BatchProposal: p, - yes: map[string]*types.Vote{}, - no: map[string]*types.Vote{}, - invalidVotes: map[string]*types.Vote{}, + yes: votesAsMapFromProto(pProto.BatchProposal.Yes), + no: votesAsMapFromProto(pProto.BatchProposal.No), + invalidVotes: votesAsMapFromProto(pProto.BatchProposal.Invalid), }, nodeProposals: nodeProposals, state: atomic.Uint32{}, diff --git a/core/integration/docs/AMM.md b/core/integration/docs/AMM.md new file mode 100644 index 00000000000..04d0612e35a --- /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 leverage | upper leverage | 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 leverage | upper leverage | 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 leverage | upper leverage | + | 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 leverage | upper leverage | + | 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 leverage | upper leverage | + | 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 leverage | + | 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 leverage | upper leverage | + | 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 leverage | upper leverage | 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 leverage | upper leverage | + | 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/0012-POSR-032.feature b/core/integration/features/amm/0012-POSR-032.feature new file mode 100644 index 00000000000..a4282c3443e --- /dev/null +++ b/core/integration/features/amm/0012-POSR-032.feature @@ -0,0 +1,132 @@ +Feature: A network disposal order which crosses with volume implied by an vAMM should trade with the vAMM volume. (0012-POSR-032) + + 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 liquidation strategies: + | name | disposal step | disposal fraction | full disposal size | max fraction consumed | disposal slippage range | + | disposal-strat-1 | 5 | 0.2 | 10 | 0.5 | 0.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 | liquidation strategy | + | ETH/MAR22 | USD | USD | lqm-params | log-normal-risk-model | margin-calculator-1 | 2 | fees-config-1 | default-none | ethMar22Oracle | 1e0 | 0 | SLA-22 | disposal-strat-1 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0090-VAMM-006 through 0090-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 | + | partyX | USD | 100 | + | vamm1 | USD | 100000 | + + 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 | 4 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 1 | 5 | 0 | TYPE_LIMIT | TIF_GTC | | + | partyX | ETH/MAR22 | sell | 1 | 5 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 16 | 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 | 5 | 1 | partyX | + And the parties cancel the following orders: + | party | reference | + | lp1 | lp1-b | + | lp1 | lp1-s | + + When 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 | 1 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + Then the network moves ahead "1" blocks + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 1 | party2 | + | partyX | 100 | 1 | network | + 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 | 79 | 1000 | 2 | 100 | 100 | 100 | + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + 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_LOW | + + @VAMM + Scenario: the distressed party uncrosses with the vAMM orders + # move to ahead to the disposal time step + When the network moves ahead "5" blocks + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | network | 100 | 1 | vamm1-id | true | diff --git a/core/integration/features/amm/0042-LIQF-107.feature b/core/integration/features/amm/0042-LIQF-107.feature new file mode 100644 index 00000000000..71f19599dcd --- /dev/null +++ b/core/integration/features/amm/0042-LIQF-107.feature @@ -0,0 +1,117 @@ +Feature: Test vAMM implied commitment is working 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 | + | 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.05 | 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 | + + 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 | + | vamm2 | USD | 1000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 100000 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 100000 | 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 | 20 | 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" blocks + And the current epoch is "0" + + @VAMM + Scenario: 0042-LIQF-107: a vAMM which was active on the market throughout the epoch but with an active range which never overlapped with the SLA range is counted with an implied commitment of `0`. + + # make a one sided AMM away from everything + When the parties submit the following AMM: + | party | market id | amount | slippage | base | upper bound | proposed fee | error | + | vamm1 | ETH/MAR22 | 100000 | 0.5 | 120 | 121 | 0.03 | | + Then the AMM pool status should be: + | party | market id | amount | status | base | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 120 | 121 | + Then the network moves ahead "1" blocks + + Then the network moves ahead "1" epochs + + # place some orders around 100 + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 99 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 10 | 101 | 0 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "1" epochs + + And the following transfers should happen: + | type | from | to | from account | to account | market id | amount | asset | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 10 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 10 | USD | + + # the ELS of the two LPs should be 0.5 implying that the AMM should have 0 share + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | virtual stake | average entry valuation | + | lp1 | 0.5 | 100000.0000000000000000 | 100000 | + | lp2 | 0.5 | 100000.0000000000000000 | 200000 | \ No newline at end of file diff --git a/core/integration/features/amm/0042-LIQF-108.feature b/core/integration/features/amm/0042-LIQF-108.feature new file mode 100644 index 00000000000..85eef8b7384 --- /dev/null +++ b/core/integration/features/amm/0042-LIQF-108.feature @@ -0,0 +1,230 @@ +Feature: Test vAMM implied commitment is working 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 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + | market.liquidity.providersFeeCalculationTimeStep | 9s | + #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.05 | 1 | 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 | + + 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 | + | vamm2 | 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 | + | lp_2 | lp2 | 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 | 20 | 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: 0042-LIQF-108: A vAMM which was active on the market with an average of `10000` liquidity units (`price * volume`) provided across the epoch, and where the `market.liquidity.stakeToCcyVolume` value is `100`, will have an implied commitment of `100`. + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.05 | 100 | 98 | 102 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 98 | 102 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm-party | + + # Then the network moves ahead "1" blocks + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 10 | party2 | + + Then the network moves ahead "1" epochs + And the current epoch is "2" + + And the following transfers should happen: + | type | from | to | from account | to account | market id | amount | asset | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 3 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 8 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 8 | USD | + | TRANSFER_TYPE_SLA_PERFORMANCE_BONUS_DISTRIBUTE | market | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 16 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_UNPAID_COLLECT | lp1 | market | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ETH/MAR22 | 8 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_UNPAID_COLLECT | lp2 | market | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ACCOUNT_TYPE_LIQUIDITY_FEES_BONUS_DISTRIBUTION | ETH/MAR22 | 8 | USD | + + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | virtual stake | average entry valuation | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0 | 4669.0000000000000000 | 24669 | + + @VAMM + Scenario: 0042-LIQF-110: A vAMM which was active on the market with an average of `10000` liquidity units (`price * volume`) provided for half the epoch, because it was submitted half way through an epoch, and where the `market.liquidity.stakeToCcyVolume` value is `100`, will have an implied commitment of `50`. + + # move ahead half an epoch then submit the AMM + Then the network moves ahead "5" blocks + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.05 | 100 | 98 | 102 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 98 | 102 | + + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + # epoch ends and AMM should get fewer fees than the above test because its ELS is less + Then the network moves ahead "7" blocks + And the following transfers should happen: + | type | from | to | from account | to account | market id | amount | asset | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 0 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 9 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 9 | USD | + + # virtual stake is HALF what it was in the above test since the AMM was only active for half the epoch + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | virtual stake | average entry valuation | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0 | 2334.0000000000000000 | 22334 | + + + @VAMM + Scenario: LP fee for AMM based solely on liquidity score + + And the following network parameters are set: + | name | value | + | market.liquidity.equityLikeShareFeeFraction | 0 | + + + # submit an AMM + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.05 | 100 | 98 | 102 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 98 | 102 | + + Then the network moves ahead "1" blocks + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "1" epochs + And the following transfers should happen: + | type | from | to | from account | to account | market id | amount | asset | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 6 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 6 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 6 | USD | + + + @VAMM + Scenario: LP fee for AMM based solely on liquidity score when AMM cancels half way through an epoch + + And the following network parameters are set: + | name | value | + | market.liquidity.equityLikeShareFeeFraction | 0 | + + # submit an AMM + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.05 | 100 | 98 | 102 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 98 | 102 | + + Then the network moves ahead "5" blocks + When the parties cancel the following AMM: + | party | market id | method | + | vamm1 | ETH/MAR22 | METHOD_IMMEDIATE | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + # epoch ends and AMM should get fewer fees than the above test because its ELS is less + Then the network moves ahead "7" blocks + And the following transfers should happen: + | type | from | to | from account | to account | market id | amount | asset | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 5 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 7 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 7 | USD | + + # and at the next epoch it should be 0 fees because its fully cancelled + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "1" epochs + And the following transfers should happen: + | type | from | to | from account | to account | market id | amount | asset | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 10 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 10 | USD | \ No newline at end of file diff --git a/core/integration/features/amm/0042-LIQF-108_before_openingAuction.feature b/core/integration/features/amm/0042-LIQF-108_before_openingAuction.feature new file mode 100644 index 00000000000..6748d3a4289 --- /dev/null +++ b/core/integration/features/amm/0042-LIQF-108_before_openingAuction.feature @@ -0,0 +1,112 @@ +Feature: Test vAMM implied commitment is working 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 | 2 | + | 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.05 | 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 | + + 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 | + | vamm2 | USD | 1000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp_1 | lp1 | ETH/MAR22 | 100000 | 0.02 | submission | + | lp_2 | lp2 | ETH/MAR22 | 100000 | 0.02 | submission | + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.05 | 100 | 98 | 102 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 98 | 102 | + + 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 | 20 | 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" blocks + And the current epoch is "0" + + @VAMM + Scenario: 0042-LIQF-108_before_openingAuction : A vAMM which was active on the market during opening auction, vAMM should be getting LP fee in the same way as normal LPs + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the following trades should be executed: + | buyer | price | size | seller | + | party1 | 100 | 10 | party2 | + Then the network moves ahead "1" epochs + And the current epoch is "1" + + And the following transfers should happen: + | type | from | to | from account | to account | market id | amount | asset | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp1 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 8 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | lp2 | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 8 | USD | + | TRANSFER_TYPE_LIQUIDITY_FEE_ALLOCATE | market | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | ACCOUNT_TYPE_FEES_LIQUIDITY | ACCOUNT_TYPE_LP_LIQUIDITY_FEES | ETH/MAR22 | 3 | USD | + + + \ No newline at end of file diff --git a/core/integration/features/amm/0042-LIQF-109.feature b/core/integration/features/amm/0042-LIQF-109.feature new file mode 100644 index 00000000000..d47125fe0a2 --- /dev/null +++ b/core/integration/features/amm/0042-LIQF-109.feature @@ -0,0 +1,211 @@ +Feature: Test vAMM implied commitment is working 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 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 0.6 | + | validators.epoch.length | 10s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.maximumLiquidityFeeFactorLevel | 0.25 | + | market.liquidity.providersFeeCalculationTimeStep | 9s | + #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.05 | 1 | 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 | + + 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 | + | vamm2 | 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 | + | lp_2 | lp2 | 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 | 20 | 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: 0042-LIQF-109: A vAMM which was active on the market with an average of `10000` liquidity units (`price * volume`) provided for half the epoch, and then `0` for the second half of the epoch (as the price was out of the vAMM's configured range), and where the `market.liquidity.stakeToCcyVolume` value is `100`, will have an implied commitment of `50`. + #first check the virtual stake if vamm1 provide AMM within SLA range for the whole epoch + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.05 | 100 | 98 | 102 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 98 | 102 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm-party | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "1" epochs + + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | virtual stake | average entry valuation | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0 | 4669.0000000000000000 | 24669 | + + Scenario: 0042-LIQF-109 + #now check the virtual stake if vamm1 only provide AMM within SLA range for the first half of the epoch, and second half is lower AMM only + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.05 | 100 | 98 | 102 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 98 | 102 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm-party | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "5" blocks + + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 0.1 | 100 | 90 | | 0.25 | 0.25 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 90 | | 0.25 | 0.25 | + + Then the network moves ahead "7" blocks + + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | virtual stake | average entry valuation | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0 | 2334.0000000000000000 | 22334 | + + @VAMM + Scenario: 0042-LIQF-109 + #now check the virtual stake if vamm1 only provide AMM within SLA range for the first half of the epoch, and second half is outside SLA range + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.05 | 100 | 98 | 102 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 98 | 102 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm-party | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "5" blocks + + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 0.1 | 100 | 80 | 115 | 0.25 | 0.25 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 80 | 115 | 0.25 | 0.25 | + + Then the network moves ahead "7" blocks + + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | virtual stake | average entry valuation | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0 | 2625.0000000000000000 | 22625 | + + @VAMM + Scenario: 0042-LIQF-111:A vAMM which was active on the market with an average of `10000` liquidity units (`price * volume`) provided for half the epoch, and then `5000` for the second half of the epoch (as the price was out of the vAMM's configured range), and where the `market.liquidity.stakeToCcyVolume` value is `100`, will have an implied commitment of `75`. + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.05 | 100 | 98 | 102 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 98 | 102 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm-party | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | buy | 10 | 100 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | party2 | ETH/MAR22 | sell | 10 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + Then the network moves ahead "5" blocks + + When the parties amend the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 5000 | 0.05 | 100 | 98 | 102 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 5000 | STATUS_ACTIVE | 100 | 98 | 102 | + + Then the network moves ahead "7" blocks + + #virtual stake is 75% * 4669 = 3501 + And the liquidity provider fee shares for the market "ETH/MAR22" should be: + | party | equity like share | virtual stake | average entry valuation | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0 | 3502.0000000000000000 | 23502 | + + diff --git a/core/integration/features/amm/0090-VAMM-001.feature b/core/integration/features/amm/0090-VAMM-001.feature new file mode 100644 index 00000000000..0babe4bcc4b --- /dev/null +++ b/core/integration/features/amm/0090-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: 0090-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 | 100000 | + + 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 leverage | upper leverage | 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 leverage | upper leverage | + | 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-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 | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | diff --git a/core/integration/features/amm/0090-VAMM-002.feature b/core/integration/features/amm/0090-VAMM-002.feature new file mode 100644 index 00000000000..5cc83143e4d --- /dev/null +++ b/core/integration/features/amm/0090-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: 0090-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 | 100000 | + + 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 leverage | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower leverage | + | vamm1 | ETH/MAR22 | 100000 | 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 | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + diff --git a/core/integration/features/amm/0090-VAMM-003.feature b/core/integration/features/amm/0090-VAMM-003.feature new file mode 100644 index 00000000000..ab1da29821f --- /dev/null +++ b/core/integration/features/amm/0090-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: 0090-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 | 100000 | + + 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 leverage | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 150 | 0.25 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | upper bound | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | 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 | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + diff --git a/core/integration/features/amm/0090-VAMM-004.feature b/core/integration/features/amm/0090-VAMM-004.feature new file mode 100644 index 00000000000..3aeab6f0b67 --- /dev/null +++ b/core/integration/features/amm/0090-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: 0090-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 | 100000 | + + 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 0090-VAMM-001 through 0090-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 leverage | upper leverage | error | proposed fee | + | vamm1 | ETH/MAR22 | 200000 | 0.1 | 100 | 90 | 110 | 4 | 4 | not enough collateral in general account | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower leverage | upper bound | upper leverage | reason | + | vamm1 | ETH/MAR22 | 200000 | STATUS_REJECTED | 100 | 90 | 4 | 110 | 4 | STATUS_REASON_CANNOT_FILL_COMMITMENT | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | lower leverage | error | proposed fee | + | vamm1 | ETH/MAR22 | 200000 | 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 leverage | reason | + | vamm1 | ETH/MAR22 | 200000 | 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 leverage | error | proposed fee | + | vamm1 | ETH/MAR22 | 200000 | 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 leverage | reason | + | vamm1 | ETH/MAR22 | 200000 | 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 leverage | error | proposed fee | + | vamm1 | ETH/MAR22 | 200000 | 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 leverage | reason | + | vamm1 | ETH/MAR22 | 200000 | 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 leverage | error | proposed fee | + | vamm1 | ETH/MAR22 | 200000 | 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 leverage | reason | + | vamm1 | ETH/MAR22 | 200000 | 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 leverage | upper leverage | error | proposed fee | + | vamm1 | ETH/MAR22 | 200000 | 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 leverage | upper bound | upper leverage | reason | + | vamm1 | ETH/MAR22 | 200000 | STATUS_REJECTED | 101 | 95 | 0.01 | 105 | 0.01 | STATUS_REASON_CANNOT_FILL_COMMITMENT | diff --git a/core/integration/features/amm/0090-VAMM-005.feature b/core/integration/features/amm/0090-VAMM-005.feature new file mode 100644 index 00000000000..699ee17c94d --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-005.feature @@ -0,0 +1,164 @@ +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: 0090-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 | 100000 | + | vamm2 | USD | 100000 | + | vamm3 | USD | 100000 | + | vamm4 | USD | 100000 | + | vamm5 | USD | 100000 | + | vamm6 | USD | 100000 | + | vamm7 | USD | 100000 | + + 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 leverage | upper leverage | 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 | lower leverage | upper bound | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | 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 leverage | error | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 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 leverage | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 90 | 85 | 0.25 | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | upper bound | upper leverage | error | proposed fee | + | vamm3 | ETH/MAR22 | 100000 | 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 leverage | + | vamm3 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 110 | 150 | 0.25 | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | lower leverage | proposed fee | + | vamm4 | ETH/MAR22 | 100000 | 0.1 | 100 | 99 | 0.1 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower leverage | + | vamm4 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 99 | 0.1 | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | upper bound | upper leverage | proposed fee | + | vamm5 | ETH/MAR22 | 100000 | 0.1 | 99 | 101 | 0.02 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | upper bound | upper leverage | + | vamm5 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 99 | 101 | 0.02 | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower leverage | upper leverage | proposed fee | error | + | vamm6 | ETH/MAR22 | 100000 | 0.001 | 101 | 95 | 105 | 0.01 | 0.01 | 0.01 | blah | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower leverage | upper bound | upper leverage | + | vamm6 | ETH/MAR22 | 100000 | 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 leverage | proposed fee | + | vamm7 | ETH/MAR22 | 100000 | 0.01 | 101 | 99 | 0.1 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | lower leverage | + | vamm7 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 101 | 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 | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + | vamm2 | ACCOUNT_TYPE_GENERAL | vamm2-acc | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + | vamm3 | ACCOUNT_TYPE_GENERAL | vamm3-acc | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + | vamm4 | ACCOUNT_TYPE_GENERAL | vamm4-acc | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + | vamm5 | ACCOUNT_TYPE_GENERAL | vamm5-acc | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + | vamm6 | ACCOUNT_TYPE_GENERAL | vamm6-acc | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + diff --git a/core/integration/features/amm/0090-VAMM-006-014.feature b/core/integration/features/amm/0090-VAMM-006-014.feature new file mode 100644 index 00000000000..e7b5b7987f3 --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-006-014.feature @@ -0,0 +1,494 @@ +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 0090-VAMM-006 through 0090-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 leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + 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_LOW | + + @VAMM + Scenario: 0090-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 | 245 | 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 | 245 | vamm1-id | true | + And the network moves ahead "1" blocks + # Check best offer/bid as this scenario matches 0090-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 | 245 | 0 | 0 | | + | vamm1-id | -245 | 0 | 0 | true | + + @VAMM + Scenario: 0090-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 | 95 | 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 | + | 95 | 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: 0090-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. + 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 | 100 | 100 | 101 | 99 | + 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 | 291 | 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 | 157 | 157 | 160 | 155 | + + # 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 | 157 | 157 | 160 | 155 | + + 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 | 291 | 0 | 0 | | + | vamm1-id | -291 | 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 | 157 | 157 | 160 | 155 | + + # 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 | 143 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 74548 | 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 | 291 | 11058 | 0 | | + | party5 | 1 | 0 | 0 | | + | lp1 | -1 | 0 | 0 | | + | vamm1-id | -291 | -11058 | 0 | true | + + + @VAMM + Scenario: 0090-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 | 550 | 80 | 1 | TYPE_LIMIT | TIF_GTC | + + # AMM is at its bound so will have no orders below 85 so best bid will be 40 which is an LP order from the test setup + # best offer will be 86 which is quoted from the pool + 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 | 22033 | 1000 | 551 | 100 | 63 | 63 | 86 | 40 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 92 | 550 | 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 | -8 | 0 | | + | party2 | -1 | 8 | 0 | | + | party4 | -550 | 0 | 0 | | + | vamm1-id | 550 | 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 | 203 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 98098 | 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 | + + # trade does not happen with the AMM + 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 + 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 | -560 | 9350 | 0 | | + | vamm1-id | 550 | -9350 | 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 | 16824 | 1000 | 561 | 100 | 63 | 63 | 86 | 40 | + # 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: 0090-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 | 74 | 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 | 2999 | 1000 | 75 | 100 | 110 | 110 | 111 | 109 | + # see the trades that make the vAMM go short + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 104 | 74 | 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 | 74 | 0 | 0 | | + | vamm1-id | -74 | 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 | 74 | 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 | 3119 | 1000 | 75 | 100 | 100 | 100 | 101 | 99 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 104 | 74 | 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 | -74 | 0 | 0 | | + | party4 | 74 | 0 | 0 | | + | vamm1-id | 0 | 0 | 0 | true | + + @VAMM + Scenario: 0090-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 | 371 | 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 | 14875 | 1000 | 372 | 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 | 94 | 371 | 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 | -6 | 0 | | + | party2 | -1 | 6 | 0 | | + | party3 | -371 | 0 | 0 | | + | vamm1-id | 371 | 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 | 371 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | ref price | mid price | static mid price | best offer price | best bid price | + | 94 | TRADING_MODE_CONTINUOUS | 100 | 100 | 100 | 101 | 99 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 94 | 371 | 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 | -6 | 0 | | + | party2 | -1 | 6 | 0 | | + | party3 | -371 | 0 | 0 | | + | party4 | 371 | 0 | 0 | | + | vamm1-id | 0 | 0 | 0 | true | + + @VAMM + Scenario: 0090-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 | 371 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | ref price | mid price | static mid price | best offer price | best bid price | + | 100 | TRADING_MODE_CONTINUOUS | 100 | 90 | 90 | 91 | 89 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 94 | 371 | 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 | -6 | 0 | | + | party2 | -1 | 6 | 0 | | + | party3 | -371 | 0 | 0 | | + | vamm1-id | 371 | 0 | 0 | true | + + # In a single trade, move the mid price to 110 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party4 | ETH/MAR22 | buy | 440 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | ref price | mid price | static mid price | best offer price | best bid price | + | 94 | TRADING_MODE_CONTINUOUS | 100 | 110 | 110 | 111 | 109 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 95 | 440 | 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 | -5 | 0 | | + | party2 | -1 | 5 | 0 | | + | party3 | -371 | -371 | 0 | | + | party4 | 440 | 0 | 0 | | + | vamm1-id | -69 | 0 | 371 | 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 | 69 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | ref price | mid price | static mid price | best offer price | best bid price | + | 95 | TRADING_MODE_CONTINUOUS | 100 | 100 | 100 | 101 | 99 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 104 | 69 | 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 | 4 | 0 | | + | party2 | -1 | -4 | 0 | | + | party3 | -371 | -3710 | 0 | | + | party4 | 440 | 3960 | 0 | | + | party5 | -69 | 0 | 0 | | + | vamm1-id | 0 | 0 | -250 | true | + + @VAMM + Scenario: 0090-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 | 350 | 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 | 14035 | 1000 | 351 | 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 | 95 | 350 | 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 | -5 | 0 | | + | party2 | -1 | 5 | 0 | | + | party3 | -350 | 0 | 0 | | + | vamm1-id | 350 | 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 | 130 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | ref price | mid price | static mid price | best offer price | best bid price | + | 95 | TRADING_MODE_CONTINUOUS | 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 | 97 | 130 | 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 | 591 | 0 | | + | party2 | -1 | 3 | 0 | | + | party3 | -350 | -700 | 0 | | + | party4 | 121 | 363 | 0 | | + | party5 | 130 | 0 | 0 | | + | vamm1-id | 0 | 0 | -257 | true | + + @VAMM + Scenario: 0090-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 | 350 | 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 | 14035 | 1000 | 351 | 100 | 90 | 90 | 91 | 89 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 95 | 350 | 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 | -5 | 0 | | + | party2 | -1 | 5 | 0 | | + | party3 | -350 | 0 | 0 | | + | vamm1-id | 350 | 0 | 0 | true | + + # In a single trade, move the mid price 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 | ref price | mid price | static mid price | best offer price | best bid price | + | 95 | TRADING_MODE_CONTINUOUS | 100 | 110 | 110 | 111 | 109 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party4 | 95 | 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 | -5 | 0 | | + | party2 | -1 | 5 | 0 | | + | party3 | -350 | 0 | 0 | | + | party4 | 420 | 0 | 0 | | + | vamm1-id | -70 | 0 | 0 | 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 | ref price | mid price | static mid price | best offer price | best bid price | + | 95 | TRADING_MODE_CONTINUOUS | 100 | 120 | 120 | 121 | 120 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party5 | 114 | 64 | 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 | -350 | -6650 | 0 | | + | party4 | 420 | 7980 | 0 | | + | party5 | 64 | 0 | 0 | | + | vamm1-id | -134 | -1330 | 0 | true | diff --git a/core/integration/features/amm/0090-VAMM-015.feature b/core/integration/features/amm/0090-VAMM-015.feature new file mode 100644 index 00000000000..eaf9d28f444 --- /dev/null +++ b/core/integration/features/amm/0090-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 0090-VAMM-006 through 0090-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: 0090-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 leverage | upper leverage | 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 leverage | upper leverage | + | 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_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/0090-VAMM-016.feature b/core/integration/features/amm/0090-VAMM-016.feature new file mode 100644 index 00000000000..858f15ddeb1 --- /dev/null +++ b/core/integration/features/amm/0090-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 0090-VAMM-006 through 0090-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: 0090-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 9788 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 | 9887 | 0.03 | submission | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | lower leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.8 | 100 | 95 | 105 | 1.041 | 1.041 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 95 | 105 | 1.041 | 1.041 | + + 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_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.3320682474642305 | 9887.0000000000000000 | 29774 | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0.3320682474642305 | 9887.0000000000000000 | 19887 | + + @VAMM + Scenario: 0090-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 | 9887 | 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 leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 10000 | 0.05 | 100 | 95 | 105 | 1.041 | 1.041 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 10000 | STATUS_ACTIVE | 100 | 95 | 105 | 1.041 | 1.041 | + + 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_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.3320682474642305 | 9887.0000000000000000 | 29774 | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0.3320682474642305 | 9887.0000000000000000 | 19887 | + + 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 | virtual stake | average entry valuation | + | lp2 | 0.3320682474642305 | 9887.0000000000000000 | 29774 | + | 137112507e25d3845a56c47db15d8ced0f28daa8498a0fd52648969c4b296aba | 0.3320682474642305 | 9887.0000000000000000 | 19887 | \ No newline at end of file diff --git a/core/integration/features/amm/0090-VAMM-019.feature b/core/integration/features/amm/0090-VAMM-019.feature new file mode 100644 index 00000000000..6d4d5aa4afd --- /dev/null +++ b/core/integration/features/amm/0090-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 0090-VAMM-006 through 0090-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 leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + 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_LOW | + + + @VAMM + Scenario: 0090-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 0090-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 | 291 | 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 | 157 | 157 | 160 | 155 | + + # 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 | 157 | 157 | 160 | 155 | + + 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 | 291 | 0 | 0 | | + | vamm1-id | -291 | 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 | 157 | 157 | 160 | 155 | + + # 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 | 143 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 74548 | 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 | 25595 | 74548 | 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 4 | 4 | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 925595 | | | + 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 | 25595 | USD | true | TRANSFER_TYPE_AMM_RELEASE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_INSURANCE | ETH/MAR22 | 74548 | USD | true | TRANSFER_TYPE_AMM_RELEASE | + diff --git a/core/integration/features/amm/0090-VAMM-020.feature b/core/integration/features/amm/0090-VAMM-020.feature new file mode 100644 index 00000000000..38b856d2cae --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-020.feature @@ -0,0 +1,363 @@ +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 0090-VAMM-006 through 0090-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 leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + 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_LOW | + + + @VAMM + Scenario: 0090-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. + 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 | 95 | 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 | + | 95 | 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 | 133 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 64462 | 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 | 35671 | 64462 | 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 | + | 95 | 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 4 | 4 | + # 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 | + | 95 | TRADING_MODE_CONTINUOUS | 64 | 64 | 89 | 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 | 5 | 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 | 90 | 39 | vamm1-id | true | + | party5 | 91 | 10 | party4 | | + | party5 | 90 | 39 | vamm1-id | true | + | party5 | 94 | 211 | 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 | 230 | 0 | | + | party5 | 280 | 276 | 0 | | + | vamm1-id | 100 | -100 | -406 | 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 | + | 94 | 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 | 80 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 506 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 45731 | 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 | 81497 | 18225 | 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 | + | 94 | 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 | -1290 | 0 | | + | party5 | 380 | 1396 | 0 | | + | vamm1-id | 0 | 0 | -106 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 4 | 4 | + 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 | 400 | USD | true | TRANSFER_TYPE_MTM_WIN | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 18625 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 100162 | USD | true | TRANSFER_TYPE_AMM_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 1000162 | | | + | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | + + @VAMM + Scenario: 0090-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. + 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 | 95 | 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 | + | 95 | 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 | 133 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 64462 | 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 | 35671 | 64462 | 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 | + | 95 | 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 4 | 4 | + # 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 | + | 95 | TRADING_MODE_CONTINUOUS | 64 | 64 | 89 | 40 | + And clear trade events + # 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 | 5 | 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 | 90 | 39 | vamm1-id | true | + | party5 | 91 | 10 | party4 | | + | party5 | 90 | 39 | vamm1-id | true | + | party5 | 94 | 211 | 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 | 230 | 0 | | + | party5 | 280 | 276 | 0 | | + | vamm1-id | 100 | -100 | -406 | 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 | + | 94 | 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 | 80 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 506 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 45731 | 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 | 81497 | 18225 | 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 | + | 94 | 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 | -1290 | 0 | | + | party5 | 380 | 1396 | 0 | | + | vamm1-id | 0 | 0 | -106 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 4 | 4 | + 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 | 400 | USD | true | TRANSFER_TYPE_MTM_WIN | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 18625 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 100162 | USD | true | TRANSFER_TYPE_AMM_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 1000162 | | | + | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | diff --git a/core/integration/features/amm/0090-VAMM-021.feature b/core/integration/features/amm/0090-VAMM-021.feature new file mode 100644 index 00000000000..03e09261383 --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-021.feature @@ -0,0 +1,409 @@ +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 0090-VAMM-006 through 0090-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 leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + 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_LOW | + + + @VAMM + Scenario: 0090-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 0090-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 | 291 | 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 | 157 | 157 | 160 | 155 | + + # 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 | 157 | 157 | 160 | 155 | + + 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 | 291 | 0 | 0 | | + | vamm1-id | -291 | 0 | 0 | true | + # Notional value therefore is 291 * 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 | 157 | 157 | 160 | 155 | + + # 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 | 143 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 74548 | 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 | 25595 | 74548 | true | + + # Reduce only cancellation: vAMM only trades to reduce its position. + 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 4 | 4 | + # 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 should 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 | 157 | 157 | 160 | 154 | + + # 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 | 172 | 121 | 6 | 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 | 149 | 4 | party5 | true | + | vamm1-id | 134 | 137 | party5 | true | + | vamm1-id | 121 | 1 | 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 | 321 | -911 | 0 | | + | party5 | -172 | 2513 | 0 | | + | vamm1-id | -149 | 149 | -1751 | 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 | 74 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 1602 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 35088 | 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 | 60761 | 37858 | true | + # vAMM isn't quoting on its offer side due to being in reduce only, so best offer comes from an order + 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 | + | 121 | TRADING_MODE_CONTINUOUS | 140 | 140 | 160 | 121 | + + # Cool, now close the position a little bit 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 | 118 | 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 | 321 | -1874 | 0 | | + | party5 | -212 | 3029 | 0 | | + | vamm1-id | -109 | 436 | -1591 | 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 | 19 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 11296 | 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 | 72076 | 27009 | 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 | + | 118 | TRADING_MODE_CONTINUOUS | 137 | 137 | 160 | 115 | + + # 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 | 109 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 107 | 109 | 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 | 321 | -5405 | 0 | | + | party5 | -321 | 5361 | 0 | | + | vamm1-id | 0 | 0 | 44 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 4 | 4 | + 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 | 47 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 28208 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 100331 | USD | true | TRANSFER_TYPE_AMM_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 1000331 | | | + | 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 | + | 107 | TRADING_MODE_CONTINUOUS | 100 | 100 | 160 | 40 | + + @VAMM + Scenario: 0090-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 0090-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 | 291 | 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 | 157 | 157 | 160 | 155 | + + # 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 | 157 | 157 | 160 | 155 | + + 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 | 291 | 0 | 0 | | + | vamm1-id | -291 | 0 | 0 | true | + # Notional value therefore is 291 * 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 | 157 | 157 | 160 | 155 | + + # 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 | 143 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 74548 | 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 | 25595 | 74548 | true | + + # Reduce only cancellation: vAMM only trades to reduce its position. + 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 4 | 4 | + # 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 should 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 | 157 | 157 | 160 | 154 | + + And clear trade events + # 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 | 172 | 121 | 6 | 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 | 149 | 4 | party5 | true | + | vamm1-id | 134 | 137 | party5 | true | + | vamm1-id | 121 | 1 | 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 | 321 | -911 | 0 | | + | party5 | -172 | 2513 | 0 | | + | vamm1-id | -149 | 149 | -1751 | 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 | 74 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 1602 | USD | true | TRANSFER_TYPE_MTM_LOSS | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 35088 | 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 | 60761 | 37858 | true | + # vAMM isn't quoting on its offer side due to being in reduce only, so best offer comes from an order + 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 | + | 121 | TRADING_MODE_CONTINUOUS | 140 | 140 | 160 | 121 | + + # Cool, now close the position a little bit 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 | 118 | 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 | 321 | -1874 | 0 | | + | party5 | -212 | 3029 | 0 | | + | vamm1-id | -109 | 436 | -1591 | 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 | 19 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 11296 | 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 | 72076 | 27009 | 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 | + | 118 | TRADING_MODE_CONTINUOUS | 137 | 137 | 160 | 115 | + + # 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 | 129 | 100 | 1 | TYPE_LIMIT | TIF_GTC | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 107 | 109 | 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 | 321 | -5405 | 0 | | + | party5 | -321 | 5361 | 0 | | + | vamm1-id | 0 | 0 | 44 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_CANCELLED | 100 | 85 | 150 | 4 | 4 | + 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 | 47 | USD | true | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + | vamm1-id | ACCOUNT_TYPE_MARGIN | vamm1-id | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 28208 | USD | true | TRANSFER_TYPE_MARGIN_HIGH | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | ETH/MAR22 | 100331 | USD | true | TRANSFER_TYPE_AMM_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 1000331 | | | + | 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 | + | 107 | TRADING_MODE_CONTINUOUS | 70 | 70 | 100 | 40 | \ No newline at end of file diff --git a/core/integration/features/amm/0090-VAMM-022.feature b/core/integration/features/amm/0090-VAMM-022.feature new file mode 100644 index 00000000000..546884ae69e --- /dev/null +++ b/core/integration/features/amm/0090-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: 0090-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 | 100000 | + + 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 leverage | upper leverage | 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 leverage | upper leverage | + | 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-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 | | 100000 | USD | true | TRANSFER_TYPE_AMM_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 | 100000 | | 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | 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 | 100000 | | 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | 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 | | 100000 | USD | true | TRANSFER_TYPE_AMM_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 100000 | | | + | vamm1-acc | USD | ETH/MAR22 | 0 | | true | diff --git a/core/integration/features/amm/0090-VAMM-023.feature b/core/integration/features/amm/0090-VAMM-023.feature new file mode 100644 index 00000000000..8d6bf4773fc --- /dev/null +++ b/core/integration/features/amm/0090-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: 0090-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 | 100000 | + + 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 leverage | upper leverage | 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 leverage | upper leverage | + | 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-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 | | 100000 | USD | true | TRANSFER_TYPE_AMM_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 | 100000 | | 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | 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 | 100000 | | 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 | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 0.1 | 105 | 90 | 155 | 0.25 | 0.25 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | 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 | 100000 | | 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 | 105 | 105 | diff --git a/core/integration/features/amm/0090-VAMM-024-026.feature b/core/integration/features/amm/0090-VAMM-024-026.feature new file mode 100644 index 00000000000..db92004c1f7 --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-024-026.feature @@ -0,0 +1,193 @@ +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 0090-VAMM-006 through 0090-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 | 30000 | + + 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 leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 30000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + 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 | | 30000 | USD | true | TRANSFER_TYPE_AMM_LOW | + + @VAMM + Scenario: 0090-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 | 100 | 4 | 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 | + | 100 | TRADING_MODE_CONTINUOUS | 102 | 102 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 4 | 0 | 0 | | + | vamm1-id | -4 | 0 | 0 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + @VAMM + Scenario: 0090-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. + # other parties place large order between AMM base of 100 and 140 + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party4 | ETH/MAR22 | sell | 50 | 120 | 0 | TYPE_LIMIT | TIF_GTC | | + + # Now amend the vAMM and see its rebasing trade happen + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 0.5 | 140 | 90 | 155 | 4 | 4 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_ACTIVE | 140 | 90 | 155 | 4 | 4 | + + + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 120 | 49 | party4 | 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 | + | 120 | TRADING_MODE_CONTINUOUS | 119 | 119 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | -49 | 0 | 0 | | + | vamm1-id | 49 | 0 | 0 | true | + + @VAMM + Scenario: 0090-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 | 100 | 4 | 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 | + | 100 | TRADING_MODE_CONTINUOUS | 102 | 102 | + And the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | is amm | + | party4 | 4 | 0 | 0 | | + | vamm1-id | -4 | 0 | 0 | true | + And the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + # Now amend the vAMM such that there won't be enough liquidity to rebase + When the parties amend the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | error | + | vamm1 | ETH/MAR22 | 10005 | 0.01 | 165 | 160 | 170 | not enough liquidity for AMM to rebase | + # 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + # check that the account balances have not been updated either + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1-id | USD | ETH/MAR22 | 29162 | 840 | true | + + # 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_REDUCE_ONLY | 100 | 85 | 150 | 4 | 4 | diff --git a/core/integration/features/amm/0090-VAMM-028.feature b/core/integration/features/amm/0090-VAMM-028.feature new file mode 100644 index 00000000000..c92ce6aa976 --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-028.feature @@ -0,0 +1,424 @@ +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 | + + # Create 2 identical markets, one will be used to test moving the mid price in steps of one, the other will do the same in a single trade. + 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 | + | ETH/MAR23 | 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 0090-VAMM-006 through 0090-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 | + | lp4 | USD | 1000000 | + | party1 | USD | 1000000 | + | party2 | USD | 1000000 | + | party3 | USD | 1000000 | + | party4 | USD | 1000000 | + | party5 | USD | 1000000 | + | party6 | USD | 1000000 | + | vamm1 | USD | 1000000 | + | vamm2 | 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 | + | lp_3 | lp3 | ETH/MAR23 | 600 | 0.02 | submission | + | lp_4 | lp4 | ETH/MAR23 | 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 | + | lp3 | ETH/MAR23 | buy | 20 | 40 | 0 | TYPE_LIMIT | TIF_GTC | lp3-b | + | party1 | ETH/MAR22 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party3 | ETH/MAR23 | buy | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party4 | ETH/MAR23 | sell | 1 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | lp1 | ETH/MAR22 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp1-s | + | lp3 | ETH/MAR23 | sell | 10 | 160 | 0 | TYPE_LIMIT | TIF_GTC | lp3-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 | + | party3 | 100 | 1 | party4 | + 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 | + And the market data for the market "ETH/MAR23" 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 leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + | vamm2 | ETH/MAR23 | 100000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + | vamm2 | ETH/MAR23 | 100000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + | vamm2 | ETH/MAR23 | vamm2-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_LOW | + | vamm2 | ACCOUNT_TYPE_GENERAL | vamm2-id | ACCOUNT_TYPE_GENERAL | | 100000 | USD | true | TRANSFER_TYPE_AMM_LOW | + + @VAMM + Scenario: 0090-VAMM-028: The volume quoted to move from price 100 to price 110 in one step is the same as the sum of the volumes to move in 10 steps of 1. + # Move mid price to 110 in one go. A volume of 74 is the minimum required, with 73 we only get to 109 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | buy | 74 | 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 | 2999 | 1000 | 75 | 100 | 110 | 110 | 111 | 109 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party5 | 104 | 74 | vamm1-id | 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 | | + | party5 | 74 | 0 | 0 | | + | vamm1-id | -74 | 0 | 0 | true | + + # Now do the same thing as above, only for ETH/MAR23 + # Move mid price to 101 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 1 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 79 | 1000 | 2 | 100 | 101 | 101 | 102 | 100 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 100 | 1 | vamm2-id | true | + + # Move mid price to 102 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 8 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 399 | 1000 | 10 | 100 | 102 | 102 | 103 | 101 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 101 | 8 | vamm2-id | true | + + # Move mid price to 103 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 9 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 759 | 1000 | 19 | 100 | 103 | 103 | 104 | 102 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 102 | 9 | vamm2-id | true | + + # Move mid price to 104 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 8 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 1079 | 1000 | 27 | 100 | 104 | 104 | 105 | 103 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 103 | 8 | vamm2-id | true | + + # Move mid price to 105 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 8 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 1399 | 1000 | 35 | 100 | 105 | 105 | 106 | 104 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 104 | 8 | vamm2-id | true | + + # Move mid price to 106 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 8 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 1719 | 1000 | 43 | 100 | 106 | 106 | 107 | 105 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 105 | 8 | vamm2-id | true | + + # Move mid price to 107 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 8 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 2039 | 1000 | 51 | 100 | 107 | 107 | 108 | 106 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 106 | 8 | vamm2-id | true | + + # Move mid price to 108 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 8 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 2359 | 1000 | 59 | 100 | 108 | 108 | 109 | 107 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 107 | 8 | vamm2-id | true | + + # Move mid price to 109 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 8 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 2679 | 1000 | 67 | 100 | 109 | 109 | 110 | 108 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 108 | 8 | vamm2-id | true | + + # Finally, move to 110, the volume should be the same, so open interest should be 75 -> + 8 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | buy | 8 | 111 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 2999 | 1000 | 75 | 100 | 110 | 110 | 111 | 109 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | party6 | 109 | 8 | vamm2-id | true | + + # Confirm the volume matches what we expect, but note the PnL can differ as we have multiple trades at different price-points. + 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 | + | party3 | 1 | 9 | 0 | | + | party4 | -1 | -9 | 0 | | + | party6 | 74 | 304 | 0 | | + | vamm2-id | -74 | -304 | 0 | true | + | vamm1-id | -74 | 0 | 0 | true | + + @VAMM + Scenario: 0090-VAMM-029: The volume quoted to move from price 100 to price 90 in one step is the same as the sum of the volumes to move in 10 steps of 1. + # Move mid price to 90 in one go. A volume of 347 is the minimum required, 346 only gets us to 91 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 347 | 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 | 13915 | 1000 | 348 | 100 | 90 | 90 | 91 | 89 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 95 | 347 | party5 | 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 | -5 | 0 | | + | party2 | -1 | 5 | 0 | | + | party5 | -347 | 0 | 0 | | + | vamm1-id | 347 | 0 | 0 | true | + + # Now do the same thing as above, only for ETH/MAR23 + # Move mid price to 99 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 1 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 79 | 1000 | 2 | 100 | 99 | 99 | 100 | 98 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 99 | 1 | party6 | true | + + # Move mid price to 98 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 36 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 1519 | 1000 | 38 | 100 | 98 | 98 | 99 | 97 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 98 | 36 | party6 | true | + + # Move mid price to 97 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 36 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 2959 | 1000 | 74 | 100 | 97 | 97 | 98 | 96 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 97 | 36 | party6 | true | + + # Move mid price to 96 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 38 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 4478 | 1000 | 112 | 100 | 96 | 96 | 97 | 95 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 96 | 38 | party6 | true | + + # Move mid price to 95 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 37 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 5958 | 1000 | 149 | 100 | 95 | 95 | 96 | 94 | + And debug trades + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 95 | 37 | party6 | true | + + # Move mid price to 94 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 39 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 7517 | 1000 | 188 | 100 | 94 | 94 | 95 | 93 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 94 | 39 | party6 | true | + + # Move mid price to 93 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 39 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 9077 | 1000 | 227 | 100 | 93 | 93 | 94 | 92 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 93 | 39 | party6 | true | + + # Move mid price to 92 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 39 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 10636 | 1000 | 266 | 100 | 92 | 92 | 93 | 91 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 92 | 39 | party6 | true | + + # Move mid price to 91 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 41 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 12276 | 1000 | 307 | 100 | 91 | 91 | 92 | 90 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 91 | 41 | party6 | true | + + # Move mid price to 90 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 41 | 89 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 13915 | 1000 | 348 | 100 | 90 | 90 | 91 | 89 | + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 90 | 41 | party6 | true | + + # Make sure the volumes match, PnL is expected to be different + 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 | + | party3 | 1 | -10 | 0 | | + | party4 | -1 | 10 | 0 | | + | party6 | -347 | 1354 | 0 | | + | vamm2-id | 347 | -1354 | 0 | true | + | vamm1-id | 347 | 0 | 0 | true | + + @VAMM + Scenario: 0090-VAMM-030: The volume quoted to move from price 110 to 90 is the same as the volume to move from 100 to 110 + 100 to 90. + # start out by moving mid prices to 90 and 110 respectively, these are the volumes required to move the price accordingly + # We don't need to do this as part of this test, but it serves to show where we get the volumes from + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party5 | ETH/MAR22 | sell | 347 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + | party6 | ETH/MAR23 | buy | 74 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 2999 | 1000 | 75 | 100 | 110 | 110 | 111 | 109 | + 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 | + | 100 | TRADING_MODE_CONTINUOUS | 13915 | 1000 | 348 | 100 | 90 | 90 | 91 | 89 | + + # Now to move from 110 down to 90, the volume ought to be 421 (=347+74) + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party6 | ETH/MAR23 | sell | 421 | 90 | 1 | TYPE_LIMIT | TIF_GTC | + Then the market data for the market "ETH/MAR23" 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 | 13915 | 1000 | 348 | 100 | 90 | 90 | 91 | 89 | diff --git a/core/integration/features/amm/0090-VAMM-031.feature b/core/integration/features/amm/0090-VAMM-031.feature new file mode 100644 index 00000000000..b9ffd7db0c6 --- /dev/null +++ b/core/integration/features/amm/0090-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 0090-VAMM-006 through 0090-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 | 30000 | + + 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 leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 30000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + 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 | | 30000 | USD | true | TRANSFER_TYPE_AMM_LOW | + + @VAMM + Scenario Outline: 0090-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 | 100 | 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 | + | 100 | TRADING_MODE_CONTINUOUS | 101 | 101 | 1000 | + 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + # 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 | 29791 | 210 | 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_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 | + | 105 | 205 | 29997 | 29997 | # settle price < market price: +1 from fees +1 from final settlement + | 107 | 203 | 29995 | 29995 | # settle price > market price: +1 from fees, -1 from final settlement + | 104 | 206 | 29998 | 29998 | # settle price < market price: +1 from fees +2 from final settlement + | 106 | 204 | 29996 | 29996 | # settle price = market price: +1 from fees + | 108 | 202 | 29994 | 29994 | # settle price > market price: +1 from fees, -2 from final settlement diff --git a/core/integration/features/amm/0090-VAMM-032.feature b/core/integration/features/amm/0090-VAMM-032.feature new file mode 100644 index 00000000000..dd3f9ea03d2 --- /dev/null +++ b/core/integration/features/amm/0090-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 0090-VAMM-006 through 0090-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 | 30000 | + + 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 leverage | upper leverage | proposed fee | + | vamm1 | ETH/MAR22 | 30000 | 0.1 | 100 | 85 | 150 | 4 | 4 | 0.01 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | lower leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + 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 | | 30000 | USD | true | TRANSFER_TYPE_AMM_LOW | + + @VAMM + Scenario: 0090-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 | 1 | 110 | 1 | TYPE_LIMIT | TIF_GTC | + | party4 | ETH/MAR22 | buy | 1 | 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 | 100 | 1 | vamm1-id | true | + | party4 | 100 | 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 | + | 100 | TRADING_MODE_CONTINUOUS | 101 | 101 | 1000 | 119 | + 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 leverage | upper leverage | + | vamm1 | ETH/MAR22 | 30000 | STATUS_ACTIVE | 100 | 85 | 150 | 4 | 4 | + + # 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 | 29582 | 420 | 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 the general account back to the owner. + Then debug transfers + 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 | vamm1-id | ACCOUNT_TYPE_MARGIN | ETH/MAR22 | 420 | USD | true | TRANSFER_TYPE_MARGIN_LOW | + | vamm1-id | ACCOUNT_TYPE_MARGIN | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 420 | USD | true | TRANSFER_TYPE_LOSS | + | vamm1-id | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_SETTLEMENT | ETH/MAR22 | 1380 | USD | true | TRANSFER_TYPE_LOSS | + | vamm1-id | ACCOUNT_TYPE_GENERAL | vamm1 | ACCOUNT_TYPE_GENERAL | | 28204 | USD | true | TRANSFER_TYPE_AMM_RELEASE | + And the parties should have the following account balances: + | party | asset | market id | general | margin | is amm | + | vamm1 | USD | | 28204 | | | + | vamm1-id | USD | ETH/MAR22 | 0 | 0 | true | diff --git a/core/integration/features/amm/0090-VAMM-auction.feature b/core/integration/features/amm/0090-VAMM-auction.feature new file mode 100644 index 00000000000..42cddc9a64e --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-auction.feature @@ -0,0 +1,370 @@ +Feature: vAMM rebasing when created or amended + + 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 | + | 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 0090-VAMM-006 through 0090-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 | + | vamm2 | USD | 1000000 | + + @VAMM + Scenario: two crossed AMMs at opening auction end + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.05 | 102 | 92 | 112 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 102 | 92 | 112 | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 0 | 0 | + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 0.05 | 98 | 88 | 108 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 98 | 88 | 108 | + + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + | vamm2 | ETH/MAR22 | vamm2-id | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 100 | 91 | + + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 100 | 46 | vamm2-id | true | + + Then the network moves ahead "1" blocks + + # two AMMs are now prices at ~100 which is between their base values + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | + | 100 | TRADING_MODE_CONTINUOUS | 99 | 101 | + + + @VAMM + Scenario: AMM crossed with SELL orders + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.05 | 100 | 90 | 110 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 90 | 110 | + + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | sell | 100 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 96 | 100 | + + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 96 | 100 | lp1 | true | + + + Then the network moves ahead "1" blocks + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | + | 96 | TRADING_MODE_CONTINUOUS | 97 | 99 | + + @VAMM + Scenario: AMM crossed with BUY orders + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.05 | 100 | 90 | 110 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 90 | 110 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 100 | 105 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 104 | 100 | + + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | lp1 | 104 | 100 | vamm1-id | true | + + + Then the network moves ahead "1" blocks + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | + | 104 | TRADING_MODE_CONTINUOUS | 102 | 104 | + + + @VAMM + Scenario: AMM's crossed with orders and AMMs + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.05 | 100 | 90 | 110 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 90 | 110 | + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 0.05 | 98 | 88 | 108 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 98 | 88 | 108 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 50 | 105 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | buy | 50 | 102 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp2 | ETH/MAR22 | sell | 50 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp2-b | + | lp2 | ETH/MAR22 | sell | 50 | 98 | 0 | TYPE_LIMIT | TIF_GTC | lp2-b | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + | vamm2 | ETH/MAR22 | vamm2-id | + + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 99 | 146 | + + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | lp1 | 99 | 46 | vamm2-id | true | + | lp1 | 99 | 4 | lp2 | false | + | lp1 | 99 | 46 | lp2 | false | + | lp1 | 99 | 4 | lp2 | false | + | vamm1-id | 99 | 46 | lp2 | true | + + + Then the network moves ahead "1" blocks + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | + | 99 | TRADING_MODE_CONTINUOUS | 98 | 100 | + + + @VAMM + Scenario: Crossed orders then AMM submitted + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | lp1 | ETH/MAR22 | buy | 50 | 105 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp1 | ETH/MAR22 | buy | 50 | 102 | 0 | TYPE_LIMIT | TIF_GTC | lp1-b | + | lp2 | ETH/MAR22 | sell | 50 | 95 | 0 | TYPE_LIMIT | TIF_GTC | lp2-b | + #| lp2 | ETH/MAR22 | sell | 50 | 98 | 0 | TYPE_LIMIT | TIF_GTC | lp2-b | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 100 | 50 | + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.05 | 100 | 90 | 110 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 90 | 110 | + + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 102 | 100 | + + When the opening auction period ends for market "ETH/MAR22" + #Then the following trades should be executed: + # | buyer | price | size | seller | is amm | + # | vamm1-id | 96 | 100 | lp1 | true | + + + Then the network moves ahead "1" blocks + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | + | 102 | TRADING_MODE_CONTINUOUS | 101 | 103 | + + @VAMM + Scenario: AMM cancelled and amending when in auction + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.05 | 100 | 90 | 110 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 90 | 110 | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 0 | 0 | + + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 0.05 | 95 | 85 | 105 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 95 | 85 | 105 | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 98 | 104 | + + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + | vamm2 | ETH/MAR22 | vamm2-id | + + + # amend so that its not crossed + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 0.1 | 100 | 90 | 110 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 90 | 110 | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 0 | 0 | + + + # amend so that its more crossed again at a different point + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 0.1 | 98 | 88 | 108 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 98 | 88 | 108 | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 99 | 46 | + + # then the second AMM is cancels + When the parties cancel the following AMM: + | party | market id | method | + | vamm2 | ETH/MAR22 | METHOD_IMMEDIATE | + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 0 | 0 | + + + # then amend the first AMM and re-create the second + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 0.1 | 98 | 88 | 108 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 98 | 88 | 108 | + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 0.05 | 102 | 92 | 112 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 102 | 92 | 112 | + + + And the market data for the market "ETH/MAR22" should be: + | trading mode | indicative price | indicative volume | + | TRADING_MODE_OPENING_AUCTION | 100 | 91 | + + + # now uncross + When the opening auction period ends for market "ETH/MAR22" + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 100 | 46 | vamm1-id | true | + + + Then the network moves ahead "1" blocks + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | + | 100 | TRADING_MODE_CONTINUOUS | 99 | 101 | \ No newline at end of file diff --git a/core/integration/features/amm/0090-VAMM-basic.feature b/core/integration/features/amm/0090-VAMM-basic.feature new file mode 100644 index 00000000000..c409d4507be --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-basic.feature @@ -0,0 +1,200 @@ +Feature: vAMM rebasing when created or amended + + 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 | + | 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 "0xCAFECAFE19" named "termination-oracle": + | property | type | binding | decimals | + | prices.ETH.value | TYPE_INTEGER | settlement data | 0 | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE19" named "termination-oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + 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 | termination-oracle | 1e0 | 0 | SLA-22 | + + # Setting up the accounts and vAMM submission now is part of the background, because we'll be running scenarios 0090-VAMM-006 through 0090-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 | + | vamm2 | USD | 1000000 | + + + 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 | + + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.05 | 100 | 95 | 105 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 95 | 105 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | best bid price | best offer price | best bid volume | best offer volume | + | 100 | TRADING_MODE_CONTINUOUS | 99 | 101 | 103 | 92 | + + @VAMM + Scenario: Incoming order at AMM best price + + # AMM's has a BUY at 99 so a SELL at that price should match + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/MAR22 | sell | 1 | 99 | 1 | TYPE_LIMIT | TIF_GTC | | + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 99 | 1 | party1 | true | + + @VAMM + Scenario: Incoming order at AMM best price and orderbook volume exists at that price + + # AMM's has a BUY at 99 so a SELL at that price should match + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | buy | 100 | 99 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | sell | 150 | 99 | 2 | TYPE_LIMIT | TIF_GTC | | + + # incoming move AMM to a fair-price of 99, then we take the orderbook volume at 99 + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 99 | 103 | party1 | true | + | party2 | 99 | 47 | party1 | true | + + + @VAMM + Scenario: Incoming order at AMM best price and orderbook volume exists at FAIR PRICE + + # AMM's has a BUY at 99 so a SELL at that price should match + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | buy | 100 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | sell | 150 | 99 | 2 | TYPE_LIMIT | TIF_GTC | | + + # incoming absorbs order at fair price, then we take volume from AMM + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party2 | 100 | 100 | party1 | true | + | vamm1-id | 99 | 50 | party1 | true | + + + @VAMM + Scenario: Incoming order at AMM fair price and orderbook volume exists at FAIR PRICE + + # AMM's has a BUY at 99 so a SELL at 100 should not match + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | buy | 100 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | sell | 150 | 100 | 1 | TYPE_LIMIT | TIF_GTC | | + + # incoming absorbs order at fair price, then we take volume from AMM + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party2 | 100 | 100 | party1 | true | + + @VAMM + Scenario: Incoming order at AMM fair price and orderbook volume exists at FAIR PRICE and at AMM best price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | ETH/MAR22 | buy | 50 | 100 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/MAR22 | buy | 50 | 99 | 0 | TYPE_LIMIT | TIF_GTC | | + | party1 | ETH/MAR22 | sell | 200 | 99 | 3 | TYPE_LIMIT | TIF_GTC | | + + # incoming absorbs order at fair price, then we take volume from AMM + Then the following trades should be executed: + | buyer | price | size | seller | is amm | + | party2 | 100 | 50 | party1 | true | + | vamm1-id | 99 | 103 | party1 | true | + | party2 | 99 | 47 | party1 | true | + + + @VAMM + Scenario: AMM's cannot be submitted/amended/cancelled when a market is terminated + + When the oracles broadcast data signed with "0xCAFECAFE19": + | name | value | + | trading.terminated | true | + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/MAR22" + And the market data for the market "ETH/MAR22" should be: + | trading mode | + | TRADING_MODE_NO_TRADING | + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | error | + | vamm2 | ETH/MAR22 | 100000 | 0.05 | 100 | 95 | 105 | 0.03 | trading not allowed | + + Then the parties amend the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | upper leverage | error | + | vamm1 | ETH/MAR22 | 20000 | 0.15 | 1010 | 910 | 1110 | 0.2 | trading not allowed | + + Then the parties cancel the following AMM: + | party | market id | method | error | + | party1 | ETH/MAR22 | METHOD_IMMEDIATE | trading not allowed | + + + diff --git a/core/integration/features/amm/0090-VAMM-rebase.feature b/core/integration/features/amm/0090-VAMM-rebase.feature new file mode 100644 index 00000000000..ea144a17127 --- /dev/null +++ b/core/integration/features/amm/0090-VAMM-rebase.feature @@ -0,0 +1,272 @@ +Feature: vAMM rebasing when created or amended + + 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 | + | 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 0090-VAMM-006 through 0090-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 | + | vamm2 | 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" + + Then the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm1 | ETH/MAR22 | 100000 | 0.05 | 100 | 90 | 110 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm1 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 90 | 110 | + + @VAMM + Scenario: a vAMM submits a rebasing order to SELL when its base is lower than an existing AMM's (0090-VAMM-033) + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 0.05 | 95 | 90 | 105 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 95 | 90 | 105 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + | vamm2 | ETH/MAR22 | vamm2-id | + + # second AMM has its base 5 away from the first AMM so it must submit a rebasing-order + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 98 | 140 | vamm2-id | true | + Then the network moves ahead "1" blocks + + # and now the mid-price has shifted lower to a value between the two AMM's bases 95 < 97 < 100 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | + | 98 | TRADING_MODE_CONTINUOUS | 97 | + + + @VAMM + Scenario: a vAMM submission cannot rebase because it exceeds slippage but exceeds slippage + + # sell rebase order + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | error | + | vamm2 | ETH/MAR22 | 100000 | 0.0005 | 95 | 90 | 105 | 0.03 | not enough liquidity for AMM to rebase | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | reason | + | vamm2 | ETH/MAR22 | 100000 | STATUS_REJECTED | 95 | 90 | 105 | STATUS_REASON_CANNOT_REBASE | + + # buy rebase order + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | error | + | vamm2 | ETH/MAR22 | 100000 | 0.0005 | 105 | 100 | 110 | 0.03 | not enough liquidity for AMM to rebase | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | reason | + | vamm2 | ETH/MAR22 | 100000 | STATUS_REJECTED | 105 | 100 | 110 | STATUS_REASON_CANNOT_REBASE | + + @VAMM + Scenario: a vAMM submits a rebasing order to BUY when its base is lower than an existing AMM's (0090-VAMM-033) + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 0.05 | 105 | 100 | 110 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 105 | 100 | 110 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + | vamm2 | ETH/MAR22 | vamm2-id | + + # second AMM has its base 5 away from the first AMM so it must submit a rebasing-order + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 101 | 176 | vamm1-id | true | + Then the network moves ahead "1" blocks + + # and now the mid-price has shifted lower to a value between the two AMM's bases 100 < 104 < 105 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | + | 101 | TRADING_MODE_CONTINUOUS | 103 | + + + + @VAMM + Scenario: two aligned AMM's and one amends shifting its base lower and needs to submit a SELL rebasing order + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 0.05 | 100 | 95 | 105 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 95 | 105 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + | vamm2 | ETH/MAR22 | vamm2-id | + + Then the network moves ahead "1" blocks + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | + | 100 | TRADING_MODE_CONTINUOUS | 100 | + + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 0.1 | 95 | 90 | 105 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 95 | 90 | 105 | + + + # second AMM has its base 5 away from the first AMM so it must submit a rebasing-order + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm1-id | 98 | 140 | vamm2-id | true | + Then the network moves ahead "1" blocks + + # and now the mid-price has shifted lower to a value between the two AMM's bases 95 < 98 < 100 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | + | 98 | TRADING_MODE_CONTINUOUS | 97 | + + + @VAMM + Scenario: two aligned AMM's and one amends shifting its base lower and needs to submit a BUY rebasing order + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 0.05 | 100 | 95 | 105 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 100 | 95 | 105 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + | vamm2 | ETH/MAR22 | vamm2-id | + + Then the network moves ahead "1" blocks + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | + | 100 | TRADING_MODE_CONTINUOUS | 100 | + + When the parties amend the following AMM: + | party | market id | slippage | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 0.1 | 105 | 100 | 110 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 105 | 100 | 110 | + + + # second AMM has its base 5 away from the first AMM so it must submit a rebasing-order + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 101 | 176 | vamm1-id | true | + Then the network moves ahead "1" blocks + + # and now the mid-price has shifted lower to a value between the two AMM's bases 100 < 104 < 105 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | + | 101 | TRADING_MODE_CONTINUOUS | 103 | + + +@VAMM + Scenario: One AMM exists and another on is submitted such that their ranges are disjoint and cross entirely (0090-VAMM-034) + + When the parties submit the following AMM: + | party | market id | amount | slippage | base | lower bound | upper bound | proposed fee | + | vamm2 | ETH/MAR22 | 100000 | 0.50 | 200 | 195 | 205 | 0.03 | + Then the AMM pool status should be: + | party | market id | amount | status | base | lower bound | upper bound | + | vamm2 | ETH/MAR22 | 100000 | STATUS_ACTIVE | 200 | 195 | 205 | + + And set the following AMM sub account aliases: + | party | market id | alias | + | vamm1 | ETH/MAR22 | vamm1-id | + | vamm2 | ETH/MAR22 | vamm2-id | + + Then the network moves ahead "1" blocks + + # second AMM has its base 5 away from the first AMM so it must submit a rebasing-order + And the following trades should be executed: + | buyer | price | size | seller | is amm | + | vamm2-id | 102 | 262 | vamm1-id | true | + + Then the network moves ahead "1" blocks + + # and now the mid-price has shifted lower to a value between the two AMM's bases 100 < 104 < 105 + And the market data for the market "ETH/MAR22" should be: + | mark price | trading mode | mid price | + | 102 | TRADING_MODE_CONTINUOUS | 107 | \ No newline at end of file diff --git a/core/integration/features/auctions/0026-AUCT-039.feature b/core/integration/features/auctions/0026-AUCT-039.feature new file mode 100644 index 00000000000..62526a785e6 --- /dev/null +++ b/core/integration/features/auctions/0026-AUCT-039.feature @@ -0,0 +1,83 @@ +Feature: Set up a market, with an opening auction, then uncross the book. Make sure opening auction can end even if we don't have best bid/ask after uncrossing. + + + Background: + Given the following assets are registered: + | id | decimal places | + | ETH | 5 | + And the simple risk model named "my-simple-risk-model": + | long | short | max move up | min move down | probability of trading | + | 0.08628781058136630000 | 0.09370922348428490000 | -1 | -1 | 0.2 | + And the fees configuration named "my-fees-config": + | maker fee | infrastructure fee | + | 0.004 | 0.001 | + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | decimal places | linear slippage factor | quadratic slippage factor | sla params | + | ETH/DEC20 | ETH | ETH | my-simple-risk-model | default-margin-calculator | 1 | my-fees-config | default-none | default-eth-for-future | 2 | 0.25 | 0 | default-futures | + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 2 | + And the average block duration is "1" + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 1000000000000 | + | party2 | ETH | 1000000000000 | + | party3 | ETH | 1000000000000 | + | lpprov | ETH | 1000000000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov | ETH/DEC20 | 937000000 | 0.1 | submission | + | lp1 | lpprov | ETH/DEC20 | 937000000 | 0.1 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lpprov | ETH/DEC20 | 2 | 1 | buy | BID | 50 | 100 | + | lpprov | ETH/DEC20 | 2 | 1 | sell | ASK | 50 | 100 | + + @NewAuct + Scenario: 0026-AUCT-039: No best bid after leaving opening auction. Also covers 0016-PFUT-025: normal futures can be submitted without specifying the capped futures fields - all futures tests do this. + # place orders and generate trades - slippage 100 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/DEC20 | buy | 1 | 1000000 | 0 | TYPE_LIMIT | TIF_GFA | t1-b-1 | + | party2 | ETH/DEC20 | sell | 2 | 1000000 | 0 | TYPE_LIMIT | TIF_GTC | t2-s-1 | + Then the market data for the market "ETH/DEC20" should be: + | trading mode | supplied stake | target stake | + | TRADING_MODE_OPENING_AUCTION | 937000000 | 937000000 | + + When the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC20" + #And debug detailed orderbook volumes for market "ETH/DEC20" + And the order book should have the following volumes for market "ETH/DEC20": + | volume | price | side | + | 1 | 1000000 | sell | + | 2 | 1000100 | sell | + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000000 | 1 | party2 | + And the mark price should be "1000000" for the market "ETH/DEC20" + + + @NewAuct + Scenario: 0026-AUCT-040: No best ask after leaving opening auction. + # place orders and generate trades - slippage 100 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/DEC20 | buy | 2 | 999500 | 0 | TYPE_LIMIT | TIF_GTC | t1-b-1 | + | party2 | ETH/DEC20 | sell | 1 | 999500 | 0 | TYPE_LIMIT | TIF_GFA | t2-s-1 | + Then the market data for the market "ETH/DEC20" should be: + | trading mode | supplied stake | target stake | + | TRADING_MODE_OPENING_AUCTION | 937000000 | 936531500 | + + When the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC20" + #And debug detailed orderbook volumes for market "ETH/DEC20" + And the order book should have the following volumes for market "ETH/DEC20": + | volume | price | side | + | 1 | 999500 | buy | + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 999500 | 1 | party2 | + And the mark price should be "999500" for the market "ETH/DEC20" + diff --git a/core/integration/features/auctions/0094-PRAC-003.feature b/core/integration/features/auctions/0094-PRAC-003.feature new file mode 100644 index 00000000000..24ebaed4ebc --- /dev/null +++ b/core/integration/features/auctions/0094-PRAC-003.feature @@ -0,0 +1,118 @@ +Feature: Long block auction is triggered after a block that took 90 seconds (0094-PRAC-003) + + + + Background: + Given the following assets are registered: + | id | decimal places | + | ETH | 5 | + And the long block duration table is: + | threshold | duration | + | 3s | 1m | + | 40s | 10m | + | 2m | 1h | + And the simple risk model named "my-simple-risk-model": + | long | short | max move up | min move down | probability of trading | + | 0.08628781058136630000 | 0.09370922348428490000 | -1 | -1 | 0.2 | + And the fees configuration named "my-fees-config": + | maker fee | infrastructure fee | + | 0.004 | 0.001 | + # create 2 markets + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | decimal places | linear slippage factor | quadratic slippage factor | sla params | + | ETH/DEC19 | ETH | ETH | my-simple-risk-model | default-margin-calculator | 1 | my-fees-config | default-none | default-eth-for-future | 2 | 0.25 | 0 | default-futures | + | ETH/DEC20 | ETH | ETH | my-simple-risk-model | default-margin-calculator | 1 | my-fees-config | default-none | default-eth-for-future | 2 | 0.25 | 0 | default-futures | + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 2 | + And the average block duration is "1" + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 1000000000000 | + | party2 | ETH | 1000000000000 | + | party3 | ETH | 1000000000000 | + | party4 | ETH | 1000000000000 | + | lpprov1 | ETH | 1000000000000 | + | lpprov2 | ETH | 1000000000000 | + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | lpprov1 | ETH/DEC20 | 937000000 | 0.1 | submission | + | lp2 | lpprov2 | ETH/DEC19 | 937000000 | 0.1 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | lpprov1 | ETH/DEC20 | 2 | 1 | buy | BID | 50 | 100 | + | lpprov1 | ETH/DEC20 | 2 | 1 | sell | ASK | 50 | 100 | + | lpprov2 | ETH/DEC19 | 2 | 1 | buy | MID | 50 | 100 | + | lpprov2 | ETH/DEC19 | 2 | 1 | sell | MID | 50 | 100 | + + @LBA + Scenario: 0094-PRAC-003: long/slow block triggers auction on all markets. + # place orders and generate trades - slippage 100 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/DEC20 | buy | 1 | 999500 | 0 | TYPE_LIMIT | TIF_GTC | t1-b-1 | + | party1 | ETH/DEC20 | buy | 1 | 1000000 | 0 | TYPE_LIMIT | TIF_GFA | t1-b-2 | + | party2 | ETH/DEC20 | sell | 2 | 1000000 | 0 | TYPE_LIMIT | TIF_GTC | t2-s-1 | + | party3 | ETH/DEC19 | buy | 1 | 999500 | 0 | TYPE_LIMIT | TIF_GTC | t3-b-1 | + | party3 | ETH/DEC19 | buy | 1 | 1000000 | 0 | TYPE_LIMIT | TIF_GTC | t3-b-2 | + | party4 | ETH/DEC19 | sell | 2 | 1000000 | 0 | TYPE_LIMIT | TIF_GTC | t4-s-1 | + Then the market data for the market "ETH/DEC20" should be: + | trading mode | supplied stake | target stake | + | TRADING_MODE_OPENING_AUCTION | 937000000 | 937000000 | + And the market data for the market "ETH/DEC19" should be: + | trading mode | supplied stake | target stake | + | TRADING_MODE_OPENING_AUCTION | 937000000 | 937000000 | + + When the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC20" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC19" + #And debug detailed orderbook volumes for market "ETH/DEC20" + And the order book should have the following volumes for market "ETH/DEC20": + | volume | price | side | + | 2 | 999400 | buy | + | 1 | 999500 | buy | + | 1 | 1000000 | sell | + | 2 | 1000100 | sell | + #And debug detailed orderbook volumes for market "ETH/DEC19" + And the order book should have the following volumes for market "ETH/DEC19": + | volume | price | side | + | 1 | 999500 | buy | + | 2 | 999650 | buy | + | 2 | 999850 | sell | + | 1 | 1000000 | sell | + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 1000000 | 1 | party2 | + | party3 | 1000000 | 1 | party4 | + And the mark price should be "1000000" for the market "ETH/DEC20" + And the mark price should be "1000000" for the market "ETH/DEC19" + + When the previous block duration was "90s" + Then the trading mode should be "TRADING_MODE_LONG_BLOCK_AUCTION" for the market "ETH/DEC20" + And the trading mode should be "TRADING_MODE_LONG_BLOCK_AUCTION" for the market "ETH/DEC19" + + # We know what the volume on the books look like, but let's submit some orders that will trade regardless + # And we'll see no trades happen + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/DEC20 | buy | 1 | 999999 | 0 | TYPE_LIMIT | TIF_GTC | t1-b-3 | + | party2 | ETH/DEC20 | sell | 1 | 999999 | 0 | TYPE_LIMIT | TIF_GTC | t2-s-2 | + | party3 | ETH/DEC19 | buy | 1 | 999999 | 0 | TYPE_LIMIT | TIF_GTC | t3-b-3 | + | party4 | ETH/DEC19 | sell | 1 | 999999 | 0 | TYPE_LIMIT | TIF_GTC | t4-s-2 | + Then the trading mode should be "TRADING_MODE_LONG_BLOCK_AUCTION" for the market "ETH/DEC20" + And the trading mode should be "TRADING_MODE_LONG_BLOCK_AUCTION" for the market "ETH/DEC19" + + When the network moves ahead "9m50s" with block duration of "2s" + Then the trading mode should be "TRADING_MODE_LONG_BLOCK_AUCTION" for the market "ETH/DEC20" + And the trading mode should be "TRADING_MODE_LONG_BLOCK_AUCTION" for the market "ETH/DEC19" + + # still in auction, 10 seconds later, though: + When the network moves ahead "11" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC20" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC19" + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | 999999 | 1 | party2 | + | party3 | 999999 | 1 | party4 | + diff --git a/core/integration/features/auctions/2952-opening-auction-uncrossing-decimals.feature b/core/integration/features/auctions/2952-opening-auction-uncrossing-decimals.feature index e75316c2e40..f4f7381660f 100644 --- a/core/integration/features/auctions/2952-opening-auction-uncrossing-decimals.feature +++ b/core/integration/features/auctions/2952-opening-auction-uncrossing-decimals.feature @@ -1,4 +1,4 @@ -Feature: Set up a market, with an opening auction, then uncross the book. Make sure opening auction can end if we have remaingin volume in the uncrossing range +Feature: Set up a market, with an opening auction, then uncross the book. Make sure opening auction can end if we have remaining volume in the uncrossing range Background: diff --git a/core/integration/features/capped-futures/0016-PFUT-015.feature b/core/integration/features/capped-futures/0016-PFUT-015.feature new file mode 100644 index 00000000000..07090bd400e --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-015.feature @@ -0,0 +1,79 @@ +Feature: Pegged orders are capped to max price. + + Background: + Given the following assets are registered: + | id | decimal places | + | DAI | 5 | + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.0 | 20s | 10 | + And the log normal risk model named "dai-lognormal-risk": + | risk aversion | tau | mu | r | sigma | + | 0.00001 | 0.000114077 | 0 | 0 | 0.41 | + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | decimal places | linear slippage factor | quadratic slippage factor | sla params | max price cap | binary | fully collateralised | + | DAI/DEC22 | DAI | DAI | lqm-params | dai-lognormal-risk | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 5 | 0.25 | 0 | default-futures | 4500000000 | false | false | + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 2 | + + @MidPrice @NoPerp @Capped + Scenario: 0016-PFUT-015: pegged orders are capped to max price. + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | DAI | 110000000000 | + | party2 | DAI | 110000000000 | + | party3 | DAI | 110000000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | reference | lp type | + | lp1 | party1 | DAI/DEC22 | 20000000000 | 0.01 | lp-1 | submission | + | lp1 | party1 | DAI/DEC22 | 20000000000 | 0.01 | lp-1 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | party1 | DAI/DEC22 | 5 | 3 | buy | MID | 5 | 10 | + | party1 | DAI/DEC22 | 5 | 3 | sell | MID | 5 | 10 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | DAI/DEC22 | buy | 1 | 800000000 | 0 | TYPE_LIMIT | TIF_GTC | party2-1 | + | party2 | DAI/DEC22 | buy | 1 | 3500000000 | 0 | TYPE_LIMIT | TIF_GTC | party2-2 | + | party3 | DAI/DEC22 | sell | 1 | 3500000000 | 0 | TYPE_LIMIT | TIF_GTC | party3-1 | + | party3 | DAI/DEC22 | sell | 1 | 4499999999 | 0 | TYPE_LIMIT | TIF_GTC | party3-2 | + + And the opening auction period ends for market "DAI/DEC22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party2 | 3500000000 | 1 | party3 | + And the market data for the market "DAI/DEC22" should be: + | mark price | best static bid price | static mid price | best static offer price | + | 3500000000 | 800000000 | 2649999999 | 4499999999 | + And the order book should have the following volumes for market "DAI/DEC22": + | side | price | volume | + | sell | 4499999999 | 1 | + | sell | 2650000009 | 5 | + | buy | 2649999990 | 5 | + | buy | 800000000 | 1 | + # Ensure the price cap is enforced on all orders + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party3 | DAI/DEC22 | sell | 1 | 8200000000 | 0 | TYPE_LIMIT | TIF_GTC | party3-3 | invalid order price | + + # Now move mid price close to the max price + When the parties cancel the following orders: + | party | reference | + | party2 | party2-1 | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party2 | DAI/DEC22 | buy | 1 | 4499999998 | 0 | TYPE_LIMIT | TIF_GTC | party2-2 | + Then the market data for the market "DAI/DEC22" should be: + | mark price | best static bid price | static mid price | best static offer price | + | 3500000000 | 4499999998 | 4499999998 | 4499999999 | + # Now the sell order should be capped to max price, buy order is offset by 10 + And the order book should have the following volumes for market "DAI/DEC22": + | side | price | volume | + | sell | 4499999999 | 6 | + | buy | 4499999998 | 1 | + | buy | 4499999989 | 5 | diff --git a/core/integration/features/capped-futures/0016-PFUT-016.feature b/core/integration/features/capped-futures/0016-PFUT-016.feature new file mode 100644 index 00000000000..9b9c29a0983 --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-016.feature @@ -0,0 +1,100 @@ +Feature: Oracle price data within range is used to determine the mid price + + Background: + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.auction.minimumDuration | 1 | + | limits.markets.maxPeggedOrders | 2 | + Given the following assets are registered: + | id | decimal places | + | DAI | 2 | + Given the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 1.0 | 20s | 10 | + And the log normal risk model named "dai-lognormal-risk": + | risk aversion | tau | mu | r | sigma | + | 0.00001 | 0.000114077 | 0 | 0 | 0.41 | + And the composite price oracles from "0xCAFECAFE1": + | name | price property | price type | price decimals | + | oracle1 | price1.USD.value | TYPE_INTEGER | 0 | + And the markets: + | id | quote name | asset | liquidity monitoring | risk model | margin calculator | auction duration | fees | price monitoring | data source config | decimal places | linear slippage factor | quadratic slippage factor | sla params | max price cap | binary | fully collateralised | price type | decay weight | decay power | cash amount | source weights | source staleness tolerance | oracle1 | + | DAI/DEC22 | DAI | DAI | lqm-params | dai-lognormal-risk | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 2 | 0.25 | 0 | default-futures | 4500000 | false | false | weight | 1 | 1 | 0 | 0,0,1,0 | 0s,0s,10s,0s | oracle1 | + + @MidPrice @NoPerp @Capped + Scenario: 0016-PFUT-016: When a market is setup to use oracle based mark price and the value received from oracle is less than max_price then it gets used as is and mark-to-market flows are calculated according to that price. + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | DAI | 110000000 | + | party2 | DAI | 110000000 | + | party3 | DAI | 110000000 | + | party4 | DAI | 110000000 | + | party5 | DAI | 110000000 | + + And the average block duration is "1" + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | reference | lp type | + | lp1 | party1 | DAI/DEC22 | 200000 | 0.01 | lp-1 | submission | + | lp1 | party1 | DAI/DEC22 | 200000 | 0.01 | lp-1 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | party1 | DAI/DEC22 | 5 | 3 | buy | MID | 5 | 100000 | + | party1 | DAI/DEC22 | 5 | 3 | sell | MID | 5 | 100000 | + + #0016-PFUT-014:When `max_price` is specified, an order with a `price > max_price` gets rejected. + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party2 | DAI/DEC22 | buy | 1 | 2500000 | 0 | TYPE_LIMIT | TIF_GTC | party2-1 | | + | party2 | DAI/DEC22 | buy | 1 | 3500000 | 0 | TYPE_LIMIT | TIF_GTC | party2-2 | | + | party3 | DAI/DEC22 | sell | 1 | 3500000 | 0 | TYPE_LIMIT | TIF_GTC | party3-1 | | + | party3 | DAI/DEC22 | sell | 1 | 4499999 | 0 | TYPE_LIMIT | TIF_GTC | party3-2 | | + | party3 | DAI/DEC22 | sell | 1 | 8000000 | 0 | TYPE_LIMIT | TIF_GTC | party3-2 | invalid order price | + + And the opening auction period ends for market "DAI/DEC22" + Then the following trades should be executed: + | buyer | price | size | seller | + | party2 | 3500000 | 1 | party3 | + + And the market data for the market "DAI/DEC22" should be: + | mark price | best static bid price | static mid price | best static offer price | + | 3500000 | 2500000 | 3499999 | 4499999 | + And debug detailed orderbook volumes for market "DAI/DEC22" + And the order book should have the following volumes for market "DAI/DEC22": + | side | price | volume | + | sell | 3599999 | 5 | + | sell | 4499999 | 1 | + | buy | 3400000 | 5 | + | buy | 2500000 | 1 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party4 | DAI/DEC22 | buy | 1 | 3200000 | 0 | TYPE_LIMIT | TIF_GTC | party2-2 | + | party5 | DAI/DEC22 | sell | 1 | 3200000 | 1 | TYPE_LIMIT | TIF_GTC | party3-1 | + When the network moves ahead "2" blocks + Then the mark price should be "3500000" for the market "DAI/DEC22" + + #0016-PFUT-017: When `max_price` set by oracle, `mark price > max_price`, then it gets ignored and mark-to-market settlement doesn't occur + Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | price1.USD.value | 330000 | -1s | + + When the network moves ahead "2" blocks + Then the mark price should be "3500000" for the market "DAI/DEC22" + + #0016-PFUT-016: When `max_price` set by oracle, `mark price < max_price`, then it gets used + Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | price1.USD.value | 32000 | -1s | + + When the network moves ahead "2" blocks + Then the mark price should be "3200000" for the market "DAI/DEC22" + + # #MTM happens if mark price < max_price + And the following transfers should happen: + | type | from | to | from account | to account | market id | amount | asset | + | TRANSFER_TYPE_MTM_LOSS | party1 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | DAI/DEC22 | 300000 | DAI | + | TRANSFER_TYPE_MTM_WIN | market | party3 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | DAI/DEC22 | 300000 | DAI | + + diff --git a/core/integration/features/capped-futures/0016-PFUT-018.feature b/core/integration/features/capped-futures/0016-PFUT-018.feature new file mode 100644 index 00000000000..13c6a2d7873 --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-018.feature @@ -0,0 +1,99 @@ +Feature: Settle capped futures market with a price within correct range + + Background: + Given time is updated to "2019-11-30T00:00:00Z" + And the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 1 | 0.99 | 300 | + And the simple risk model named "simple-risk-model-1": + | long | short | max move up | min move down | probability of trading | + | 0.2 | 0.1 | 100 | -100 | 0.1 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec21Oracle | 0.25 | 0 | default-futures | 1500 | false | false | + + @SLABug @NoPerp @Capped + Scenario: 0016-PFUT-018: Settlement happened when market is being closed - happens when the oracle price is < max price cap, higher prices are ignored. + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | ETH | 1000 | + | party3 | ETH | 5000 | + | aux1 | ETH | 100000 | + | aux2 | ETH | 100000 | + | party-lp | ETH | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | party-lp | ETH/DEC21 | 3000000 | 0 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | party-lp | ETH/DEC21 | 60000 | 30000 | buy | BID | 180000 | 10 | + | party-lp | ETH/DEC21 | 60000 | 30000 | sell | ASK | 180000 | 10 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-5 | + | aux2 | ETH/DEC21 | sell | 2 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | ref-6 | + | aux1 | ETH/DEC21 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-7 | + | aux2 | ETH/DEC21 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-8 | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + + Then the network moves ahead "2" blocks + + # The market considered here ("ETH/DEC19") relies on "0xCAFECAFE" oracle, checking that broadcasting events from "0xCAFECAFE1" should have no effect on it apart from insurance pool transfer + And the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | trading.terminated | true | + + And the network moves ahead "2" blocks + + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | prices.ETH.value | 2000 | + + And the network moves ahead "2" blocks + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + # Make sure this does not settle the market + And the last market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + + # within the price range + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | prices.ETH.value | 1499 | + + And the network moves ahead "2" blocks + # Now the market shows as settled + Then the last market state should be "STATE_SETTLED" for the market "ETH/DEC21" + + diff --git a/core/integration/features/capped-futures/0016-PFUT-019.feature b/core/integration/features/capped-futures/0016-PFUT-019.feature new file mode 100644 index 00000000000..84ac6a6537a --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-019.feature @@ -0,0 +1,111 @@ +Feature: Settle capped futures market with a price within correct range + + Background: + Given time is updated to "2019-11-30T00:00:00Z" + And the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 1 | 0.99 | 300 | + And the simple risk model named "simple-risk-model-1": + | long | short | max move up | min move down | probability of trading | + | 0.2 | 0.1 | 100 | -100 | 0.1 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec21Oracle | 0.25 | 0 | default-futures | 1500 | false | false | + + + @SLABug @NoPerp @Capped @CIsolated + Scenario: 0016-PFUT-019: When `max_price` is specified and the final settlement price candidate received from the oracle is equal to `max_price` comes and market settles correctly + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | ETH | 1000 | + | party3 | ETH | 5000 | + | party4 | ETH | 50000 | + | aux1 | ETH | 100000 | + | aux2 | ETH | 100000 | + | party-lp | ETH | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | party-lp | ETH/DEC21 | 3000000 | 0 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | party-lp | ETH/DEC21 | 60000 | 30000 | buy | BID | 180000 | 10 | + | party-lp | ETH/DEC21 | 60000 | 30000 | sell | ASK | 180000 | 10 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-5 | + | aux2 | ETH/DEC21 | sell | 2 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | ref-6 | + | aux1 | ETH/DEC21 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-7 | + | aux2 | ETH/DEC21 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-8 | + | party4 | ETH/DEC21 | buy | 2 | 600 | 0 | TYPE_LIMIT | TIF_GTC | ref-9 | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party4 | ETH | ETH/DEC21 | 480 | 49520 | + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + + When the parties submit update margin mode: + | party | market | margin_mode | margin_factor | error | + | party4 | ETH/DEC21 | isolated margin | 0.5 | | + Then the parties should have the following account balances: + | party | asset | market id | margin | general | order margin | + | party4 | ETH | ETH/DEC21 | 0 | 49400 | 600 | + Then the network moves ahead "2" blocks + + # The market considered here ("ETH/DEC19") relies on "0xCAFECAFE" oracle, checking that broadcasting events from "0xCAFECAFE1" should have no effect on it apart from insurance pool transfer + And the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | trading.terminated | true | + + And the network moves ahead "2" blocks + + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | prices.ETH.value | 2000 | + + And the network moves ahead "2" blocks + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + # Make sure this does not settle the market + And the last market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + + # within the price range + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | prices.ETH.value | 1500 | + + And the network moves ahead "2" blocks + # Now the market shows as settled + Then the last market state should be "STATE_SETTLED" for the market "ETH/DEC21" + + diff --git a/core/integration/features/capped-futures/0016-PFUT-020-ignore.feature b/core/integration/features/capped-futures/0016-PFUT-020-ignore.feature new file mode 100644 index 00000000000..34d410a9698 --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-020-ignore.feature @@ -0,0 +1,231 @@ +Feature: When binary settlement is enabled, the market ignored oracle data that is neither 0 nor max price. + + Background: + Given time is updated to "2019-11-30T00:00:00Z" + And the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the oracle spec for settlement data filtering data from "0xCAFECAFE2" named "ethDec22Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + And the oracle spec for trading termination filtering data from "0xCAFECAFE2" named "ethDec22Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec22Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600000 | 0.99 | 300 | + And the log normal risk model named "lognormal-risk-model-1": + | risk aversion | tau | mu | r | sigma | + | 0.0002 | 0.01 | 0 | 0.0 | 1.2 | + And the simple risk model named "simple-risk-model-1": + | long | short | max move up | min move down | probability of trading | + | 0.2 | 0.1 | 100 | -100 | 0.1 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | USD | lognormal-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec21Oracle | 0.25 | 0 | default-futures | 1500 | true | true | + | ETH/DEC22 | ETH | USD | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec22Oracle | 0.25 | 0 | default-futures | 1500 | false | true | + | ETH/DEC23 | ETH | USD | lognormal-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | default-eth-for-future | 0.25 | 0 | default-futures | 1500 | true | true | + + @NoPerp @Capped @CBin + Scenario: 0016-PFUT-020: Pass in settlement prices that are neither 0 nor max price, then settle at valid prices. + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | USD | 10000 | + | party2 | USD | 10000 | + | party3 | USD | 10000 | + | party4 | USD | 10000 | + | party5 | USD | 10000 | + | party6 | USD | 10000 | + | aux1 | USD | 100000 | + | aux2 | USD | 100000 | + | aux3 | USD | 100000 | + | aux4 | USD | 100000 | + | aux5 | USD | 100000 | + | aux6 | USD | 100000 | + | aux7 | USD | 100000 | + | party-lp1 | USD | 100000000 | + | party-lp2 | USD | 100000000 | + | party-lp3 | USD | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | party-lp1 | ETH/DEC21 | 30000 | 0 | submission | + | lp2 | party-lp2 | ETH/DEC22 | 30000 | 0 | submission | + | lp3 | party-lp3 | ETH/DEC23 | 30000 | 0 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux1 | ETH/DEC21 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-1-1 | | + | aux5 | ETH/DEC22 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-5-1 | | + | aux3 | ETH/DEC23 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-3-1 | | + | party1 | ETH/DEC21 | buy | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-p1-1 | | + | party3 | ETH/DEC22 | buy | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-p3-1 | | + | party5 | ETH/DEC23 | buy | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-p5-1 | | + | party2 | ETH/DEC21 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-p2-1 | | + | party4 | ETH/DEC22 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-p4-1 | | + | party6 | ETH/DEC23 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-p6-1 | | + | aux2 | ETH/DEC21 | sell | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | ref-2-1 | | + | aux4 | ETH/DEC23 | sell | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | ref-4-1 | | + | aux6 | ETH/DEC22 | sell | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | ref-6-1 | | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC22" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC23" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC22" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC23" + And the mark price should be "1000" for the market "ETH/DEC21" + And the mark price should be "1000" for the market "ETH/DEC22" + And the mark price should be "1000" for the market "ETH/DEC23" + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5000 | + | party2 | USD | ETH/DEC21 | 2500 | 7500 | + | party3 | USD | ETH/DEC22 | 2700 | 7300 | + | party4 | USD | ETH/DEC22 | 2100 | 7900 | + | party5 | USD | ETH/DEC23 | 5000 | 5000 | + | party6 | USD | ETH/DEC23 | 2500 | 7500 | + + #order margin for aux1: limit price * size = 999*2=1998 + #order margin for aux2: (max price - limit price) * size = (1500-1301)*2=398 + # party1 maintenance margin level: position size * average entry price = 5*1000=5000 + # party2 maintenance margin level: position size * (max price - average entry price)=5*(1500-1000)=2500 + # Aux1: potential position * average price on book = 2 * 999 = 1998, but due to the MTM settlement the margin level + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party2 | ETH/DEC21 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux2 | ETH/DEC21 | 2 | 2 | 2 | 2 | cross margin | + | aux1 | ETH/DEC21 | 1998 | 1998 | 1998 | 1998 | cross margin | + | party3 | ETH/DEC22 | 2250 | 2475 | 2700 | 3150 | cross margin | + | party4 | ETH/DEC22 | 1750 | 1925 | 2100 | 2450 | cross margin | + | aux5 | ETH/DEC22 | 400 | 440 | 480 | 560 | cross margin | + | aux6 | ETH/DEC22 | 200 | 220 | 240 | 280 | cross margin | + | party5 | ETH/DEC23 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party6 | ETH/DEC23 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux4 | ETH/DEC23 | 2 | 2 | 2 | 2 | cross margin | + | aux3 | ETH/DEC23 | 1998 | 1998 | 1998 | 1998 | cross margin | + + #update mark price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | aux1-2 | + | aux2 | ETH/DEC21 | sell | 1 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | aux2-2 | + | aux5 | ETH/DEC22 | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | aux5-2 | + | aux6 | ETH/DEC22 | sell | 1 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | aux6-2 | + | aux3 | ETH/DEC23 | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | aux3-2 | + | aux4 | ETH/DEC23 | sell | 1 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | aux4-2 | + + And the network moves ahead "2" blocks + Then the mark price should be "1100" for the market "ETH/DEC21" + And the mark price should be "1100" for the market "ETH/DEC22" + And the mark price should be "1100" for the market "ETH/DEC23" + + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | trading.terminated | true | + And the oracles broadcast data signed with "0xCAFECAFE2": + | name | value | + | trading.terminated | true | + Then the network moves ahead "2" blocks + And the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + And the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC22" + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5500 | + | party2 | USD | ETH/DEC21 | 2500 | 7000 | + | party3 | USD | ETH/DEC22 | 3200 | 7300 | + | party4 | USD | ETH/DEC22 | 2310 | 7190 | + | aux1 | USD | ETH/DEC21 | 3098 | 96908 | + | aux2 | USD | ETH/DEC21 | 402 | 99570 | + | aux5 | USD | ETH/DEC22 | 1122 | 98884 | + | aux6 | USD | ETH/DEC22 | 726 | 99246 | + | party5 | USD | ETH/DEC23 | 5000 | 5500 | + | party6 | USD | ETH/DEC23 | 2500 | 7000 | + | aux3 | USD | ETH/DEC23 | 3098 | 96908 | + | aux4 | USD | ETH/DEC23 | 402 | 99570 | + + # First, try settling a market via governance, providing an incorrect price. + When the market states are updated through governance: + | market id | state | settlement price | error | + | ETH/DEC23 | MARKET_STATE_UPDATE_TYPE_TERMINATE | 123 | settlement data is outside of the price cap | + | ETH/DEC23 | MARKET_STATE_UPDATE_TYPE_TERMINATE | 123456789 | settlement data is outside of the price cap | + Then the network moves ahead "1" blocks + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC23" + # now provide a valid price + When the market states are updated through governance: + | market id | state | settlement price | error | + | ETH/DEC23 | MARKET_STATE_UPDATE_TYPE_TERMINATE | 0 | | + Then the network moves ahead "1" blocks + And the last market state should be "STATE_CLOSED" for the market "ETH/DEC23" + # Now we can try to settle the markets with invalid data, making sure it doesn't settle. + # In range, but not valid for binary settlements + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | prices.ETH.value | 100 | + # Out of range, so should be ignored + When the oracles broadcast data signed with "0xCAFECAFE2": + | name | value | + | prices.ETH.value | 90000 | + And the network moves ahead "2" blocks + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + And the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC22" + # Make sure terminated is indeed the LAST state, rather than settled + And the last market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + And the last market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC22" + + # Now one market will settle with a valid price of 0 + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | prices.ETH.value | 0 | + And the network moves ahead "2" blocks + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC22" + And the last market state should be "STATE_SETTLED" for the market "ETH/DEC21" + + # Now settle the remaining market using the max price. + When the oracles broadcast data signed with "0xCAFECAFE2": + | name | value | + | prices.ETH.value | 1500 | + And the network moves ahead "2" blocks + Then the last market state should be "STATE_SETTLED" for the market "ETH/DEC22" + And the last market state should be "STATE_SETTLED" for the market "ETH/DEC21" + # the margin balances should be empty + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 0 | 5000 | + | party2 | USD | ETH/DEC21 | 0 | 15000 | + | party3 | USD | ETH/DEC22 | 0 | 12500 | + | party4 | USD | ETH/DEC22 | 0 | 7500 | + | aux1 | USD | ETH/DEC21 | 0 | 98906 | + | aux2 | USD | ETH/DEC21 | 0 | 101072 | + | aux5 | USD | ETH/DEC22 | 0 | 100406 | + | aux6 | USD | ETH/DEC22 | 0 | 99572 | + | party5 | USD | ETH/DEC23 | 0 | 5000 | + | party6 | USD | ETH/DEC23 | 0 | 15000 | + | aux3 | USD | ETH/DEC23 | 0 | 98906 | + | aux4 | USD | ETH/DEC23 | 0 | 101072 | diff --git a/core/integration/features/capped-futures/0016-PFUT-020.feature b/core/integration/features/capped-futures/0016-PFUT-020.feature new file mode 100644 index 00000000000..aeba7e1463b --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-020.feature @@ -0,0 +1,142 @@ +Feature: Settle capped futures market with a price within correct range + + Background: + Given time is updated to "2019-11-30T00:00:00Z" + And the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the oracle spec for settlement data filtering data from "0xCAFECAFE2" named "ethDec22Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE2" named "ethDec22Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the oracle spec for settlement data filtering data from "0xCAFECAFE3" named "ethDec23Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE3" named "ethDec23Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 1 | 0.99 | 300 | + And the simple risk model named "simple-risk-model-1": + | long | short | max move up | min move down | probability of trading | + | 0.2 | 0.1 | 100 | -100 | 0.1 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec21Oracle | 0.25 | 0 | default-futures | 1500 | false | true | + | ETH/DEC22 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec22Oracle | 0.25 | 0 | default-futures | 1500 | false | true | + | ETH/DEC23 | ETH | ETH | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec23Oracle | 0.25 | 0 | default-futures | 1500 | false | true | + + @SLABug @NoPerp @Capped + Scenario: 0016-PFUT-020: When `max_price` is specified, the `binary_settlement` flag is set to `true` and the final settlement price candidate received from the oracle is greater than `0` and less than `max_price` the value gets ignored, next a value of `0` comes in from the settlement oracle and market settles correctly. + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party2 | ETH | 1000 | + | party3 | ETH | 5000 | + | aux1 | ETH | 100000 | + | aux2 | ETH | 100000 | + | party-lp | ETH | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp1 | party-lp | ETH/DEC21 | 300000 | 0 | submission | + | lp2 | party-lp | ETH/DEC22 | 300000 | 0 | submission | + | lp3 | party-lp | ETH/DEC23 | 300000 | 0 | submission | + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | + | party-lp | ETH/DEC21 | 6000 | 3000 | buy | BID | 18000 | 10 | + | party-lp | ETH/DEC21 | 6000 | 3000 | sell | ASK | 18000 | 10 | + | party-lp | ETH/DEC22 | 6000 | 3000 | buy | BID | 18000 | 10 | + | party-lp | ETH/DEC22 | 6000 | 3000 | sell | ASK | 18000 | 10 | + | party-lp | ETH/DEC23 | 6000 | 3000 | buy | BID | 18000 | 10 | + | party-lp | ETH/DEC23 | 6000 | 3000 | sell | ASK | 18000 | 10 | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-5 | + | aux2 | ETH/DEC21 | sell | 2 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | ref-6 | + | aux1 | ETH/DEC21 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-7 | + | aux2 | ETH/DEC21 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-8 | + | aux1 | ETH/DEC22 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-5 | + | aux2 | ETH/DEC22 | sell | 2 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | ref-6 | + | aux1 | ETH/DEC22 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-7 | + | aux2 | ETH/DEC22 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-8 | + | aux1 | ETH/DEC23 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-5 | + | aux2 | ETH/DEC23 | sell | 2 | 1001 | 0 | TYPE_LIMIT | TIF_GTC | ref-6 | + | aux1 | ETH/DEC23 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-7 | + | aux2 | ETH/DEC23 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-8 | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC22" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC23" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC22" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC23" + + Then the network moves ahead "2" blocks + + # The market considered here ("ETH/DEC19") relies on "0xCAFECAFE" oracle, checking that broadcasting events from "0xCAFECAFE1" should have no effect on it apart from insurance pool transfer + And the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | trading.terminated | true | + And the oracles broadcast data signed with "0xCAFECAFE2": + | name | value | + | trading.terminated | true | + And the oracles broadcast data signed with "0xCAFECAFE3": + | name | value | + | trading.terminated | true | + And the network moves ahead "2" blocks + + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC22" + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC23" + + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | prices.ETH.value | 0 | + When the oracles broadcast data signed with "0xCAFECAFE2": + | name | value | + | prices.ETH.value | 100 | + When the oracles broadcast data signed with "0xCAFECAFE3": + | name | value | + | prices.ETH.value | 1500 | + + And the network moves ahead "2" blocks + + Then the last market state should be "STATE_SETTLED" for the market "ETH/DEC21" + Then the last market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC22" + Then the last market state should be "STATE_SETTLED" for the market "ETH/DEC23" + diff --git a/core/integration/features/capped-futures/0016-PFUT-021.feature b/core/integration/features/capped-futures/0016-PFUT-021.feature new file mode 100644 index 00000000000..f70dcd9d9b2 --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-021.feature @@ -0,0 +1,164 @@ +Feature: When `max_price` is specified and the market is ran in a fully-collateralised mode + + Background: + Given time is updated to "2019-11-30T00:00:00Z" + And the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600000 | 0.99 | 300 | + And the log normal risk model named "lognormal-risk-model-1": + | risk aversion | tau | mu | r | sigma | + | 0.0002 | 0.01 | 0 | 0.0 | 1.2 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | USD | lognormal-risk-model-1 | default-capped-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec21Oracle | 0.25 | 0 | default-futures | 1500 | true | false | + + @SLABug @NoPerp @Capped @CMargin + Scenario: 0016-PFUT-021: parties with open positions settling it at a price of `max_price` + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | USD | 10000 | + | party2 | USD | 10000 | + | aux1 | USD | 100000 | + | aux2 | USD | 100000 | + | aux3 | USD | 100000 | + | aux4 | USD | 100000 | + | aux5 | USD | 100000 | + | party-lp | USD | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | party-lp | ETH/DEC21 | 30000 | 0 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux1 | ETH/DEC21 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | | + | aux2 | ETH/DEC21 | sell | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | | + | party1 | ETH/DEC21 | buy | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-3 | | + | party2 | ETH/DEC21 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-4 | | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + And the mark price should be "1000" for the market "ETH/DEC21" + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5000 | + | party2 | USD | ETH/DEC21 | 2500 | 7500 | + + #order margin for aux1: limit price * size = 999*2=1998 + #order margin for aux2: (max price - limit price) * size = (1500-1301)*2=398 + # party1 maintenance margin level: position size * average entry price = 5*1000=5000 + # party2 maintenance margin level: position size * (max price - average entry price)=5*(1500-1000)=2500 + # Aux1: potential position * average price on book = 2 * 999 = 1998, but due to the MTM settlement the margin level + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party2 | ETH/DEC21 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux2 | ETH/DEC21 | 2 | 2 | 2 | 2 | cross margin | + | aux1 | ETH/DEC21 | 1998 | 1998 | 1998 | 1998 | cross margin | + + #update mark price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | aux1-2 | + | aux2 | ETH/DEC21 | sell | 1 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | aux2-2 | + + And the network moves ahead "2" blocks + Then the mark price should be "1100" for the market "ETH/DEC21" + + # MTM settlement 5 long makes a profit of 500, 5 short loses 500 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: then placing the order (max price - average order price) * 3 = (1500 - (1301 + 1301 + 1100)/3) * 3 = (1500 - 1234) * 3 = 266 * 3 = 798 + # aux2's short position and potential margins are calculated separately as 2 * (1500-1301) + 1 * (1500 - 1100) = 398 + 400 = 798 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5500 | + | party2 | USD | ETH/DEC21 | 2500 | 7000 | + | aux1 | USD | ETH/DEC21 | 3098 | 96908 | + | aux2 | USD | ETH/DEC21 | 402 | 99570 | + # The market is fully collateralised, switching to isolated margin is not supported + When the parties submit update margin mode: + | party | market | margin_mode | margin_factor | error | + | party1 | ETH/DEC21 | isolated margin | 0.5 | margin factor (0.5) must be greater than max(riskFactorLong (0.3696680542085883), riskFactorShort (0.5650462045113667)) + linearSlippageFactor (0.25) | + | party1 | ETH/DEC21 | isolated margin | 0.9 | isolated margin not permitted on fully collateralised markets | + + #update mark price to max_price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux3 | ETH/DEC21 | buy | 2 | 1499 | 1 | TYPE_LIMIT | TIF_GTC | aux3-1 | | + + And the following trades should be executed: + | buyer | price | size | seller | + | aux3 | 1499 | 2 | aux2 | + + And the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + Then the mark price should be "1499" for the market "ETH/DEC21" + + # MTM settlement 5 long makes a profit of 2000, 5 short loses 2000 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: short position of size 2, traded price at 1500, then margin: postion size * (max price - average entry price) = 3*(1100+1500*2)/3 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 7495 | + | party2 | USD | ETH/DEC21 | 2500 | 5005 | + | aux1 | USD | ETH/DEC21 | 3098 | 97307 | + | aux2 | USD | ETH/DEC21 | 402 | 99186 | + | aux3 | USD | ETH/DEC21 | 2998 | 96927 | + + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party2 | ETH/DEC21 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux2 | ETH/DEC21 | 402 | 402 | 402 | 402 | cross margin | + | aux1 | ETH/DEC21 | 3098 | 3098 | 3098 | 3098 | cross margin | + + #0016-PFUT-024: trade at max_price, no closeout for parties with short position + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux4 | ETH/DEC21 | buy | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | aux4-1 | + | aux5 | ETH/DEC21 | sell | 2 | 1499 | 1 | TYPE_LIMIT | TIF_GTC | aux5-1 | + + And the network moves ahead "2" blocks + + # aux5: short position of size 2, traded price at 1500, then margin: postion size * (max price - average entry price) = 0 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | aux1 | USD | ETH/DEC21 | 3098 | 97307 | + | aux2 | USD | ETH/DEC21 | 402 | 99186 | + | aux4 | USD | ETH/DEC21 | 2998 | 97017 | + | aux5 | USD | ETH/DEC21 | 2 | 99923 | + + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | aux5 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_MAKER | ETH/DEC21 | 15 | USD | + | aux5 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | ETH/DEC21 | 60 | USD | + | aux5 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | ETH/DEC21 | 0 | USD | + | market | aux4 | ACCOUNT_TYPE_FEES_MAKER | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 15 | USD | + diff --git a/core/integration/features/capped-futures/0016-PFUT-022-max.feature b/core/integration/features/capped-futures/0016-PFUT-022-max.feature new file mode 100644 index 00000000000..507b11f3cf0 --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-022-max.feature @@ -0,0 +1,196 @@ +Feature: When max_price is specified and the market is ran in a fully-collateralised mode and it has parties with open positions settling it at a price of 0 works correctly + + Background: + Given time is updated to "2019-11-30T00:00:00Z" + And the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600000 | 0.99 | 300 | + And the log normal risk model named "lognormal-risk-model-1": + | risk aversion | tau | mu | r | sigma | + | 0.0002 | 0.01 | 0 | 0.0 | 1.2 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | USD | lognormal-risk-model-1 | default-capped-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec21Oracle | 0.25 | 0 | default-futures | 1500 | true | false | + + @NoPerp @Capped @CSettle + Scenario: 0016-PFUT-022: Same as the settlement at price 0 test, only with a settlement at max price. + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | USD | 10000 | + | party2 | USD | 10000 | + | aux1 | USD | 100000 | + | aux2 | USD | 100000 | + | aux3 | USD | 100000 | + | aux4 | USD | 100000 | + | aux5 | USD | 100000 | + | party-lp | USD | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | party-lp | ETH/DEC21 | 30000 | 0 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux1 | ETH/DEC21 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | | + | aux2 | ETH/DEC21 | sell | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | | + | party1 | ETH/DEC21 | buy | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-3 | | + | party2 | ETH/DEC21 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-4 | | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + And the mark price should be "1000" for the market "ETH/DEC21" + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5000 | + | party2 | USD | ETH/DEC21 | 2500 | 7500 | + + #order margin for aux1: limit price * size = 999*2=1998 + #order margin for aux2: (max price - limit price) * size = (1500-1301)*2=398 + # party1 maintenance margin level: position size * average entry price = 5*1000=5000 + # party2 maintenance margin level: position size * (max price - average entry price)=5*(1500-1000)=2500 + # Aux1: potential position * average price on book = 2 * 999 = 1998, but due to the MTM settlement the margin level + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party2 | ETH/DEC21 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux2 | ETH/DEC21 | 2 | 2 | 2 | 2 | cross margin | + | aux1 | ETH/DEC21 | 1998 | 1998 | 1998 | 1998 | cross margin | + + #update mark price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | aux1-2 | + | aux2 | ETH/DEC21 | sell | 1 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | aux2-2 | + + And the network moves ahead "2" blocks + Then the mark price should be "1100" for the market "ETH/DEC21" + + # MTM settlement 5 long makes a profit of 500, 5 short loses 500 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: then placing the order (max price - average order price) * 3 = (1500 - (1301 + 1301 + 1100)/3) * 3 = (1500 - 1234) * 3 = 266 * 3 = 798 + # aux2's short position and potential margins are calculated separately as 2 * (1500-1301) + 1 * (1500 - 1100) = 398 + 400 = 798 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5500 | + | party2 | USD | ETH/DEC21 | 2500 | 7000 | + | aux1 | USD | ETH/DEC21 | 3098 | 96908 | + | aux2 | USD | ETH/DEC21 | 402 | 99570 | + # The market is fully collateralised, switching to isolated margin is not supported + When the parties submit update margin mode: + | party | market | margin_mode | margin_factor | error | + | party1 | ETH/DEC21 | isolated margin | 0.5 | margin factor (0.5) must be greater than max(riskFactorLong (0.3696680542085883), riskFactorShort (0.5650462045113667)) + linearSlippageFactor (0.25) | + | party1 | ETH/DEC21 | isolated margin | 0.9 | isolated margin not permitted on fully collateralised markets | + + #update mark price to max_price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux3 | ETH/DEC21 | buy | 2 | 1499 | 1 | TYPE_LIMIT | TIF_GTC | aux3-1 | | + + And the following trades should be executed: + | buyer | price | size | seller | + | aux3 | 1499 | 2 | aux2 | + + And the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + Then the mark price should be "1499" for the market "ETH/DEC21" + + # MTM settlement 5 long makes a profit of 2000, 5 short loses 2000 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: short position of size 2, traded price at 1500, then margin: postion size * (max price - average entry price) = 3*(1100+1500*2)/3 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 7495 | + | party2 | USD | ETH/DEC21 | 2500 | 5005 | + | aux1 | USD | ETH/DEC21 | 3098 | 97307 | + | aux2 | USD | ETH/DEC21 | 402 | 99186 | + | aux3 | USD | ETH/DEC21 | 2998 | 96927 | + + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party2 | ETH/DEC21 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux2 | ETH/DEC21 | 402 | 402 | 402 | 402 | cross margin | + | aux1 | ETH/DEC21 | 3098 | 3098 | 3098 | 3098 | cross margin | + #trade at max_price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux4 | ETH/DEC21 | buy | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | aux4-1 | + | aux5 | ETH/DEC21 | sell | 2 | 1499 | 1 | TYPE_LIMIT | TIF_GTC | aux5-1 | + + And the network moves ahead "2" blocks + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | aux4 | USD | ETH/DEC21 | 2998 | 97017 | + | aux5 | USD | ETH/DEC21 | 2 | 99923 | + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | aux5 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_MAKER | ETH/DEC21 | 15 | USD | + | aux5 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | ETH/DEC21 | 60 | USD | + | aux5 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | ETH/DEC21 | 0 | USD | + | market | aux4 | ACCOUNT_TYPE_FEES_MAKER | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 15 | USD | + + # Terminate trading + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | trading.terminated | true | + And the network moves ahead "2" blocks + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + + # Trigger settlement at price 0. + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | prices.ETH.value | 1500 | + And the network moves ahead "2" blocks + Then the last market state should be "STATE_SETTLED" for the market "ETH/DEC21" + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | type | + | aux2 | | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC21 | 3 | USD | TRANSFER_TYPE_LOSS | + | aux5 | | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC21 | 2 | USD | TRANSFER_TYPE_LOSS | + | party2 | | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC21 | 5 | USD | TRANSFER_TYPE_LOSS | + | market | aux1 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC21 | 1 | USD | TRANSFER_TYPE_WIN | + | market | aux3 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC21 | 2 | USD | TRANSFER_TYPE_WIN | + | market | aux4 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC21 | 2 | USD | TRANSFER_TYPE_WIN | + | market | party1 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC21 | 5 | USD | TRANSFER_TYPE_WIN | + | aux1 | aux1 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 3099 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | aux2 | aux2 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 399 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | aux3 | aux3 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 3000 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | aux4 | aux4 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 3000 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | aux5 | aux5 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 0 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | party1 | party1 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 5005 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | party-lp | party-lp | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 30000 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 0 | 12500 | + | party2 | USD | ETH/DEC21 | 0 | 7500 | + | aux1 | USD | ETH/DEC21 | 0 | 100406 | + | aux2 | USD | ETH/DEC21 | 0 | 99585 | + | aux3 | USD | ETH/DEC21 | 0 | 99927 | + | aux4 | USD | ETH/DEC21 | 0 | 100017 | + | aux5 | USD | ETH/DEC21 | 0 | 99923 | diff --git a/core/integration/features/capped-futures/0016-PFUT-022.feature b/core/integration/features/capped-futures/0016-PFUT-022.feature new file mode 100644 index 00000000000..5ce5b0c1c41 --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-022.feature @@ -0,0 +1,195 @@ +Feature: When max_price is specified and the market is ran in a fully-collateralised mode and it has parties with open positions settling it at a price of 0 works correctly + + Background: + Given time is updated to "2019-11-30T00:00:00Z" + And the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600000 | 0.99 | 300 | + And the log normal risk model named "lognormal-risk-model-1": + | risk aversion | tau | mu | r | sigma | + | 0.0002 | 0.01 | 0 | 0.0 | 1.2 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | USD | lognormal-risk-model-1 | default-capped-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec21Oracle | 0.25 | 0 | default-futures | 1500 | true | false | + + @SLABug @NoPerp @Capped @CSettle + Scenario: 0016-PFUT-022: The sum of all final settlement cashflows equals 0 (loss socialisation does not happen). Assuming general account balances of all parties were 0 after opening the positions and all of their funds were in the margin accounts: short parties end up with balances equal to abs(position size) * max_price and long parties end up with 0 balances. + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | USD | 10000 | + | party2 | USD | 10000 | + | aux1 | USD | 100000 | + | aux2 | USD | 100000 | + | aux3 | USD | 100000 | + | aux4 | USD | 100000 | + | aux5 | USD | 100000 | + | party-lp | USD | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | party-lp | ETH/DEC21 | 30000 | 0 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux1 | ETH/DEC21 | buy | 2 | 999 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | | + | aux2 | ETH/DEC21 | sell | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | | + | party1 | ETH/DEC21 | buy | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-3 | | + | party2 | ETH/DEC21 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-4 | | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + And the mark price should be "1000" for the market "ETH/DEC21" + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5000 | + | party2 | USD | ETH/DEC21 | 2500 | 7500 | + + #order margin for aux1: limit price * size = 999*2=1998 + #order margin for aux2: (max price - limit price) * size = (1500-1301)*2=398 + # party1 maintenance margin level: position size * average entry price = 5*1000=5000 + # party2 maintenance margin level: position size * (max price - average entry price)=5*(1500-1000)=2500 + # Aux1: potential position * average price on book = 2 * 999 = 1998, but due to the MTM settlement the margin level + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party2 | ETH/DEC21 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux2 | ETH/DEC21 | 2 | 2 | 2 | 2 | cross margin | + | aux1 | ETH/DEC21 | 1998 | 1998 | 1998 | 1998 | cross margin | + + #update mark price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 1 | 1100 | 0 | TYPE_LIMIT | TIF_GTC | aux1-2 | + | aux2 | ETH/DEC21 | sell | 1 | 1100 | 1 | TYPE_LIMIT | TIF_GTC | aux2-2 | + + And the network moves ahead "2" blocks + Then the mark price should be "1100" for the market "ETH/DEC21" + + # MTM settlement 5 long makes a profit of 500, 5 short loses 500 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: then placing the order (max price - average order price) * 3 = (1500 - (1301 + 1301 + 1100)/3) * 3 = (1500 - 1234) * 3 = 266 * 3 = 798 + # aux2's short position and potential margins are calculated separately as 2 * (1500-1301) + 1 * (1500 - 1100) = 398 + 400 = 798 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5500 | + | party2 | USD | ETH/DEC21 | 2500 | 7000 | + | aux1 | USD | ETH/DEC21 | 3098 | 96908 | + | aux2 | USD | ETH/DEC21 | 402 | 99570 | + # The market is fully collateralised, switching to isolated margin is not supported + When the parties submit update margin mode: + | party | market | margin_mode | margin_factor | error | + | party1 | ETH/DEC21 | isolated margin | 0.5 | margin factor (0.5) must be greater than max(riskFactorLong (0.3696680542085883), riskFactorShort (0.5650462045113667)) + linearSlippageFactor (0.25) | + | party1 | ETH/DEC21 | isolated margin | 0.9 | isolated margin not permitted on fully collateralised markets | + + #update mark price to max_price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux3 | ETH/DEC21 | buy | 2 | 1499 | 1 | TYPE_LIMIT | TIF_GTC | aux3-1 | | + + And the following trades should be executed: + | buyer | price | size | seller | + | aux3 | 1499 | 2 | aux2 | + + And the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + Then the mark price should be "1499" for the market "ETH/DEC21" + + # MTM settlement 5 long makes a profit of 2000, 5 short loses 2000 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: short position of size 2, traded price at 1500, then margin: postion size * (max price - average entry price) = 3*(1100+1500*2)/3 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 7495 | + | party2 | USD | ETH/DEC21 | 2500 | 5005 | + | aux1 | USD | ETH/DEC21 | 3098 | 97307 | + | aux2 | USD | ETH/DEC21 | 402 | 99186 | + | aux3 | USD | ETH/DEC21 | 2998 | 96927 | + + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party2 | ETH/DEC21 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux2 | ETH/DEC21 | 402 | 402 | 402 | 402 | cross margin | + | aux1 | ETH/DEC21 | 3098 | 3098 | 3098 | 3098 | cross margin | + #trade at max_price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux4 | ETH/DEC21 | buy | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | aux4-1 | + | aux5 | ETH/DEC21 | sell | 2 | 1499 | 1 | TYPE_LIMIT | TIF_GTC | aux5-1 | + + And the network moves ahead "2" blocks + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | aux4 | USD | ETH/DEC21 | 2998 | 97017 | + | aux5 | USD | ETH/DEC21 | 2 | 99923 | + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | + | aux5 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_MAKER | ETH/DEC21 | 15 | USD | + | aux5 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | ETH/DEC21 | 60 | USD | + | aux5 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_FEES_LIQUIDITY | ETH/DEC21 | 0 | USD | + | market | aux4 | ACCOUNT_TYPE_FEES_MAKER | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 15 | USD | + + # Terminate trading + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | trading.terminated | true | + And the network moves ahead "2" blocks + Then the market state should be "STATE_TRADING_TERMINATED" for the market "ETH/DEC21" + + # Trigger settlement at price 0. + When the oracles broadcast data signed with "0xCAFECAFE1": + | name | value | + | prices.ETH.value | 0 | + And the network moves ahead "2" blocks + Then the last market state should be "STATE_SETTLED" for the market "ETH/DEC21" + And the following transfers should happen: + | from | to | from account | to account | market id | amount | asset | type | + | aux1 | | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC21 | 1499 | USD | TRANSFER_TYPE_LOSS | + | aux3 | | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC21 | 2998 | USD | TRANSFER_TYPE_LOSS | + | aux4 | | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC21 | 2998 | USD | TRANSFER_TYPE_LOSS | + | party1 | | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC21 | 5000 | USD | TRANSFER_TYPE_LOSS | + | party1 | | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC21 | 2495 | USD | TRANSFER_TYPE_LOSS | + | market | aux2 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC21 | 4497 | USD | TRANSFER_TYPE_WIN | + | market | aux5 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC21 | 2998 | USD | TRANSFER_TYPE_WIN | + | market | party2 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC21 | 7495 | USD | TRANSFER_TYPE_WIN | + | aux1 | aux1 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 1599 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | aux2 | aux2 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 4899 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | aux5 | aux5 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 3000 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | party2 | party2 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 9995 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + | party-lp | party-lp | ACCOUNT_TYPE_BOND | ACCOUNT_TYPE_GENERAL | ETH/DEC21 | 30000 | USD | TRANSFER_TYPE_CLEAR_ACCOUNT | + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 0 | 5000 | + | party2 | USD | ETH/DEC21 | 0 | 15000 | + | aux1 | USD | ETH/DEC21 | 0 | 98906 | + | aux2 | USD | ETH/DEC21 | 0 | 104085 | + | aux3 | USD | ETH/DEC21 | 0 | 96927 | + | aux4 | USD | ETH/DEC21 | 0 | 97017 | + | aux5 | USD | ETH/DEC21 | 0 | 102923 | diff --git a/core/integration/features/capped-futures/0016-PFUT-023.feature b/core/integration/features/capped-futures/0016-PFUT-023.feature new file mode 100644 index 00000000000..2052ce5bac0 --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-023.feature @@ -0,0 +1,142 @@ +Feature: When max_price is specified and the market is ran in a fully-collateralised mode and it has parties with open positions settling it at a price of 0 works correctly + + Background: + Given time is updated to "2019-11-30T00:00:00Z" + And the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600000 | 0.99 | 300 | + And the log normal risk model named "lognormal-risk-model-1": + | risk aversion | tau | mu | r | sigma | + | 0.0002 | 0.01 | 0 | 0.0 | 1.2 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | USD | lognormal-risk-model-1 | default-capped-margin-calculator | 1 | fees-config-1 | default-none | ethDec21Oracle | 0.25 | 0 | default-futures | 1500 | true | false | + + @SLABug @NoPerp @Capped @CZero + Scenario: 0016-PFUT-023: no closeout happens when mark to market settlement is carried out at a price of `0` + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | USD | 10000 | + | party2 | USD | 10000 | + | aux1 | USD | 100000 | + | aux2 | USD | 100000 | + | aux3 | USD | 100000 | + | aux4 | USD | 100000 | + | aux5 | USD | 100000 | + | party-lp | USD | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | party-lp | ETH/DEC21 | 30000 | 0 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux1 | ETH/DEC21 | buy | 2 | 1 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | | + | aux2 | ETH/DEC21 | sell | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | | + | party1 | ETH/DEC21 | buy | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-3 | | + | party2 | ETH/DEC21 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-4 | | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + And the mark price should be "1000" for the market "ETH/DEC21" + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5000 | + | party2 | USD | ETH/DEC21 | 2500 | 7500 | + + #order margin for aux1: limit price * size = 999*2=1998 + #order margin for aux2: (max price - limit price) * size = (1500-1301)*2=398 + #party1 maintenance margin level: position size * average entry price = 5*1000=5000 + #party2 maintenance margin level: position size * (max price - average entry price)=5*(1500-1000)=2500 + #aux1: potential position * average price on book = 2 * 0 = 0 + #aux2: potential position * (max price - limit price) = 2 * 0 = 0 + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party2 | ETH/DEC21 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux2 | ETH/DEC21 | 2 | 2 | 2 | 2 | cross margin | + | aux1 | ETH/DEC21 | 2 | 2 | 2 | 2 | cross margin | + + #update mark price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | aux1-2 | + | aux2 | ETH/DEC21 | sell | 1 | 1 | 1 | TYPE_LIMIT | TIF_GTC | aux2-2 | + + And debug trades + And debug detailed orderbook volumes for market "ETH/DEC21" + And the network moves ahead "2" blocks + Then the mark price should be "1" for the market "ETH/DEC21" + + And the following trades should be executed: + | buyer | price | size | seller | + | aux1 | 1 | 1 | aux2 | + + # MTM settlement 5 long makes a loss of 5000, 5 short makes a profit of 5000 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: then placing the order (max price - average order price) * 3 = (1500 - (1301 + 1301 + 1100)/3) * 3 = (1500 - 1234) * 3 = 266 * 3 = 798 + # aux2's short position and potential margins are calculated separately as 2 * (1500-1301) + 1 * (1500 - 1100) = 398 + 400 = 798 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 5 | + | party2 | USD | ETH/DEC21 | 2500 | 12495 | + | aux1 | USD | ETH/DEC21 | 3 | 99998 | + | aux2 | USD | ETH/DEC21 | 1501 | 98497 | + + #update mark price to max_price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux3 | ETH/DEC21 | buy | 2 | 1499 | 1 | TYPE_LIMIT | TIF_GTC | aux3-1 | | + + And the following trades should be executed: + | buyer | price | size | seller | + | aux3 | 1499 | 2 | aux2 | + + And the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + Then the mark price should be "1499" for the market "ETH/DEC21" + + # MTM settlement 5 long makes a profit of 2000, 5 short loses 2000 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: short position of size 2, traded price at 1500, then margin: postion size * (max price - average entry price) = 3*(1100+1500*2)/3 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 5000 | 7495 | + | party2 | USD | ETH/DEC21 | 2500 | 5005 | + | aux1 | USD | ETH/DEC21 | 3 | 101496 | + | aux2 | USD | ETH/DEC21 | 1503 | 97012 | + | aux3 | USD | ETH/DEC21 | 2998 | 96927 | + + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 5000 | 5000 | 5000 | 5000 | cross margin | + | party2 | ETH/DEC21 | 2500 | 2500 | 2500 | 2500 | cross margin | + | aux2 | ETH/DEC21 | 1503 | 1503 | 1503 | 1503 | cross margin | + | aux1 | ETH/DEC21 | 3 | 3 | 3 | 3 | cross margin | diff --git a/core/integration/features/capped-futures/0016-PFUT-026.feature b/core/integration/features/capped-futures/0016-PFUT-026.feature new file mode 100644 index 00000000000..4c64effe72b --- /dev/null +++ b/core/integration/features/capped-futures/0016-PFUT-026.feature @@ -0,0 +1,161 @@ +Feature: Futures market can be created with a with [hardcoded risk factors](./0018-RSKM-quant_risk_models.ipynb). + + Background: + Given the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600000 | 0.99 | 300 | + And the simple risk model named "simple-risk-model": + | long | short | max move up | min move down | probability of trading | + | 0.1 | 0.2 | 100 | -100 | 0.2 | + And the log normal risk model named "lognormal-risk-model-1": + | risk aversion | tau | mu | r | sigma | + | 0.0002 | 0.01 | 0 | 0.0 | 1.2 | + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | USD | simple-risk-model | default-margin-calculator | 1 | fees-config-1 | default-none | ethDec21Oracle | 0.25 | 0 | default-futures | 1500 | false | false | + + @SLABug @NoPerp @Capped @MarginCap + Scenario: 0016-PFUT-026, 0016-PFUT-028: Capped futures market can be created with a with [hardcoded risk factors](./0018-RSKM-quant_risk_models.ipynb). + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | USD | 10000 | + | party2 | USD | 10000 | + | aux1 | USD | 100000 | + | aux2 | USD | 100000 | + | aux3 | USD | 100000 | + | aux4 | USD | 100000 | + | aux5 | USD | 100000 | + | party-lp | USD | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | party-lp | ETH/DEC21 | 30000 | 0 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux1 | ETH/DEC21 | buy | 2 | 1 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | | + | aux2 | ETH/DEC21 | sell | 2 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | | + | party1 | ETH/DEC21 | buy | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-3 | | + | party2 | ETH/DEC21 | sell | 5 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | ref-4 | | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + And the mark price should be "1000" for the market "ETH/DEC21" + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 2100 | 7900 | + | party2 | USD | ETH/DEC21 | 2700 | 7300 | + + #order margin for aux1: limit price * size = 999*2=1998 + #order margin for aux2: (max price - limit price) * size = (1500-1301)*2=398 + #party1 maintenance margin level: position size * average entry price = 5*1000=5000 + #party2 maintenance margin level: position size * (max price - average entry price)=5*(1500-1000)=2500 + #aux1: potential position * average price on book = 2 * 0 = 0 + #aux2: potential position * (max price - limit price) = 2 * 0 = 0 + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 1750 | 1925 | 2100 | 2450 | cross margin | + | party2 | ETH/DEC21 | 2250 | 2475 | 2700 | 3150 | cross margin | + | aux2 | ETH/DEC21 | 400 | 440 | 480 | 560 | cross margin | + | aux1 | ETH/DEC21 | 200 | 220 | 240 | 280 | cross margin | + + #update mark price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | aux1-2 | + | aux2 | ETH/DEC21 | sell | 1 | 1 | 1 | TYPE_LIMIT | TIF_GTC | aux2-2 | + + And the network moves ahead "2" blocks + Then the mark price should be "1" for the market "ETH/DEC21" + + And the following trades should be executed: + | buyer | price | size | seller | + | aux1 | 1 | 1 | aux2 | + + # MTM settlement 5 long makes a loss of 5000, 5 short makes a profit of 5000 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: then placing the order (max price - average order price) * 3 = (1500 - (1301 + 1301 + 1100)/3) * 3 = (1500 - 1234) * 3 = 266 * 3 = 798 + # aux2's short position and potential margins are calculated separately as 2 * (1500-1301) + 1 * (1500 - 1100) = 398 + 400 = 798 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 2 | 5003 | + | party2 | USD | ETH/DEC21 | 3 | 14992 | + | aux1 | USD | ETH/DEC21 | 1 | 100000 | + | aux2 | USD | ETH/DEC21 | 1 | 99997 | + + #update mark price to max_price + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux3 | ETH/DEC21 | buy | 2 | 1499 | 1 | TYPE_LIMIT | TIF_GTC | aux3-1 | | + + And the following trades should be executed: + | buyer | price | size | seller | + | aux3 | 1499 | 2 | aux2 | + + And the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + Then the mark price should be "1499" for the market "ETH/DEC21" + + # MTM settlement 5 long makes a profit of 2000, 5 short loses 2000 + # Now for aux1 and 2, the calculations from above still hold but more margin is required due to the open positions: + # aux1: position * 1100 + 999*2 = 1100 + 1998 = 3098 + # aux2: short position of size 2, traded price at 1500, then margin: postion size * (max price - average entry price) = 3*(1100+1500*2)/3 + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 3148 | 9347 | + | party2 | USD | ETH/DEC21 | 4047 | 3458 | + | aux1 | USD | ETH/DEC21 | 990 | 100509 | + | aux2 | USD | ETH/DEC21 | 2428 | 96087 | + | aux3 | USD | ETH/DEC21 | 1260 | 98665 | + + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 2624 | 2886 | 3148 | 3673 | cross margin | + | party2 | ETH/DEC21 | 3373 | 3710 | 4047 | 4722 | cross margin | + | aux2 | ETH/DEC21 | 2024 | 2226 | 2428 | 2833 | cross margin | + | aux1 | ETH/DEC21 | 825 | 907 | 990 | 1155 | cross margin | + + When the markets are updated: + | id | risk model | + | ETH/DEC21 | lognormal-risk-model-1 | + # Place a trade, but don't move mark price. This will trigger the margin to be recalculated + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux2 | ETH/DEC21 | sell | 1 | 1499 | 0 | TYPE_LIMIT | TIF_GTC | aux2-3 | + | aux1 | ETH/DEC21 | buy | 1 | 1499 | 1 | TYPE_LIMIT | TIF_GTC | aux1-3 | + When the network moves ahead "2" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + # Ensure the mark price is still 1499 + And the mark price should be "1499" for the market "ETH/DEC21" + # Now check the margin levels + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 4645 | 5109 | 5574 | 6503 | cross margin | + | party2 | ETH/DEC21 | 6109 | 6719 | 7330 | 8552 | cross margin | + | aux2 | ETH/DEC21 | 4888 | 5376 | 5865 | 6843 | cross margin | + | aux1 | ETH/DEC21 | 2967 | 3263 | 3560 | 4153 | cross margin | diff --git a/core/integration/features/capped-futures/0019-MCAL-154.feature b/core/integration/features/capped-futures/0019-MCAL-154.feature new file mode 100644 index 00000000000..2a085322112 --- /dev/null +++ b/core/integration/features/capped-futures/0019-MCAL-154.feature @@ -0,0 +1,170 @@ +Feature: Margin calculation on a fully collateralised capped future + + Background: + Given time is updated to "2019-11-30T00:00:00Z" + And the average block duration is "1" + + And the oracle spec for settlement data filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | prices.ETH.value | TYPE_INTEGER | settlement data | + + And the oracle spec for trading termination filtering data from "0xCAFECAFE1" named "ethDec21Oracle": + | property | type | binding | + | trading.terminated | TYPE_BOOLEAN | trading termination | + + And the settlement data decimals for the oracle named "ethDec21Oracle" is given in "0" decimal places + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.liquidity.successorLaunchWindowLength | 1s | + | limits.markets.maxPeggedOrders | 4 | + + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.02 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 3600000 | 0.99 | 300 | + And the log normal risk model named "lognormal-risk-model-1": + | risk aversion | tau | mu | r | sigma | + | 0.0002 | 0.01 | 0 | 0.0 | 1.2 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | max price cap | fully collateralised | binary | + | ETH/DEC21 | ETH | USD | lognormal-risk-model-1 | default-capped-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | ethDec21Oracle | 0.25 | 0 | default-futures | 100 | true | false | + + @SLABug @NoPerp @Capped @CFC + Scenario: 0019-MCAL-154: Party A posts an order to buy 10 contracts at a price of 30, there's no other volume in that price range so the order lands on the book and the maintenance and initial margin levels for the party and order margin account balance are all equal to 300. + Given the initial insurance pool balance is "10000" for all the markets + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | USD | 10000 | + | party2 | USD | 10000 | + | aux1 | USD | 100000 | + | aux2 | USD | 100000 | + | aux3 | USD | 100000 | + | aux4 | USD | 100000 | + | aux5 | USD | 100000 | + | party-lp | USD | 100000000 | + + And the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lp2 | party-lp | ETH/DEC21 | 30000 | 0 | submission | + + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | aux1 | ETH/DEC21 | buy | 2 | 9 | 0 | TYPE_LIMIT | TIF_GTC | ref-1 | | + | aux2 | ETH/DEC21 | sell | 2 | 99 | 0 | TYPE_LIMIT | TIF_GTC | ref-2 | | + | party1 | ETH/DEC21 | buy | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | ref-3 | | + | party2 | ETH/DEC21 | sell | 5 | 50 | 0 | TYPE_LIMIT | TIF_GTC | ref-4 | | + And the network moves ahead "2" blocks + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" + And the market state should be "STATE_ACTIVE" for the market "ETH/DEC21" + And the mark price should be "50" for the market "ETH/DEC21" + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 250 | 9750 | + | party2 | USD | ETH/DEC21 | 250 | 9750 | + | aux1 | USD | ETH/DEC21 | 18 | 99982 | + + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 250 | 250 | 250 | 250 | cross margin | + | party2 | ETH/DEC21 | 250 | 250 | 250 | 250 | cross margin | + | aux1 | ETH/DEC21 | 18 | 18 | 18 | 18 | cross margin | + | aux2 | ETH/DEC21 | 2 | 2 | 2 | 2 | cross margin | + + # The case the AC is actually about: buy 10@30 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux3 | ETH/DEC21 | buy | 10 | 30 | 0 | TYPE_LIMIT | TIF_GTC | aux3-1 | + And the network moves ahead "2" blocks + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 250 | 9750 | + | party2 | USD | ETH/DEC21 | 250 | 9750 | + | aux1 | USD | ETH/DEC21 | 18 | 99982 | + | aux3 | USD | ETH/DEC21 | 300 | 99700 | + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 250 | 250 | 250 | 250 | cross margin | + | party2 | ETH/DEC21 | 250 | 250 | 250 | 250 | cross margin | + | aux1 | ETH/DEC21 | 18 | 18 | 18 | 18 | cross margin | + | aux2 | ETH/DEC21 | 2 | 2 | 2 | 2 | cross margin | + | aux3 | ETH/DEC21 | 300 | 300 | 300 | 300 | cross margin | + + #0019-MCAL-155 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux4 | ETH/DEC21 | sell | 15 | 20 | 1 | TYPE_LIMIT | TIF_GTC | aux3-1 | + And the network moves ahead "2" blocks + + And the following trades should be executed: + | buyer | price | size | seller | + | aux3 | 30 | 10 | aux4 | + + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 250 | 9650 | + | party2 | USD | ETH/DEC21 | 250 | 9850 | + | aux1 | USD | ETH/DEC21 | 18 | 99982 | + | aux3 | USD | ETH/DEC21 | 300 | 99702 | + | aux4 | USD | ETH/DEC21 | 1100 | 98892 | + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | margin mode | + | party1 | ETH/DEC21 | 250 | 250 | 250 | 250 | cross margin | + | party2 | ETH/DEC21 | 250 | 250 | 250 | 250 | cross margin | + | aux1 | ETH/DEC21 | 18 | 18 | 18 | 18 | cross margin | + | aux2 | ETH/DEC21 | 2 | 2 | 2 | 2 | cross margin | + | aux3 | ETH/DEC21 | 300 | 300 | 300 | 300 | cross margin | + | aux4 | ETH/DEC21 | 1100 | 1100 | 1100 | 1100 | cross margin | + + #0019-MCAL-156 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux4 | ETH/DEC21 | buy | 15 | 18 | 0 | TYPE_LIMIT | TIF_GTC | aux3-1 | + And the network moves ahead "2" blocks + + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 250 | 9650 | + | party2 | USD | ETH/DEC21 | 250 | 9850 | + | aux1 | USD | ETH/DEC21 | 18 | 99982 | + | aux3 | USD | ETH/DEC21 | 300 | 99702 | + | aux4 | USD | ETH/DEC21 | 1100 | 98892 | + + #0019-MCAL-157 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux4 | ETH/DEC21 | buy | 30 | 16 | 0 | TYPE_LIMIT | TIF_GTC | aux3-1 | + And the network moves ahead "2" blocks + + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 250 | 9650 | + | party2 | USD | ETH/DEC21 | 250 | 9850 | + | aux1 | USD | ETH/DEC21 | 18 | 99982 | + | aux3 | USD | ETH/DEC21 | 300 | 99702 | + | aux4 | USD | ETH/DEC21 | 1420 | 98572 | + + #0019-MCAL-158 + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux3 | ETH/DEC21 | sell | 20 | 17 | 1 | TYPE_LIMIT | TIF_GTC | aux3-1 | + And the network moves ahead "2" blocks + + And the following trades should be executed: + | buyer | price | size | seller | + | aux4 | 18 | 15 | aux3 | + + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | party1 | USD | ETH/DEC21 | 250 | 9590 | + | party2 | USD | ETH/DEC21 | 250 | 9910 | + | aux1 | USD | ETH/DEC21 | 18 | 99982 | + | aux3 | USD | ETH/DEC21 | 785 | 99089 | + | aux4 | USD | ETH/DEC21 | 610 | 99504 | + 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/margin/0016-PFUT-026.feature b/core/integration/features/margin/0016-PFUT-026.feature new file mode 100644 index 00000000000..008e6d668ef --- /dev/null +++ b/core/integration/features/margin/0016-PFUT-026.feature @@ -0,0 +1,106 @@ +Feature: Futures market can be created with a with [hardcoded risk factors](./0018-RSKM-quant_risk_models.ipynb). + Background: + # Set liquidity parameters to allow "zero" target-stake which is needed to construct the order-book defined in the ACs + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 1s | + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.001 | 24h | 1e-9 | + And the simple risk model named "simple-risk-model": + | long | short | max move up | min move down | probability of trading | + | 0.1 | 0.2 | 100 | -100 | 0.2 | + And the log normal risk model named "lognormal-risk-model-1": + | risk aversion | tau | mu | r | sigma | + | 0.0002 | 0.01 | 0 | 0.0 | 1.2 | + #rf_long: 0.369668054 + #rf_short: 0.5650462 + 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 | max price cap | fully collateralised | binary | + | ETH/FEB23 | ETH | USD | lqm-params | simple-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 0.25 | 0 | default-futures | 19000 | false | false | + @NoPerp + Scenario: 001 0016-PFUT-026, 0016-PFUT-028 + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | buySideProvider | USD | 1000000 | + | sellSideProvider | USD | 1000000 | + | aux1 | USD | 1000000 | + | aux2 | USD | 100000 | + | party | USD | 480500 | + | party1 | USD | 480500 | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/FEB23 | buy | 10 | 14900 | 0 | TYPE_LIMIT | TIF_GTC | | + | buySideProvider | ETH/FEB23 | buy | 1 | 15000 | 0 | TYPE_LIMIT | TIF_GTC | | + | buySideProvider | ETH/FEB23 | buy | 3 | 15900 | 0 | TYPE_LIMIT | TIF_GTC | | + | party | ETH/FEB23 | sell | 3 | 15900 | 0 | TYPE_LIMIT | TIF_GTC | | + | party | ETH/FEB23 | sell | 3 | 15900 | 0 | TYPE_LIMIT | TIF_GTC | party-sell | + | party1 | ETH/FEB23 | sell | 3 | 16100 | 0 | TYPE_LIMIT | TIF_GTC | party1-sell | + | sellSideProvider | ETH/FEB23 | sell | 1 | 18100 | 0 | TYPE_LIMIT | TIF_GTC | | + | aux2 | ETH/FEB23 | sell | 10 | 18200 | 0 | TYPE_LIMIT | TIF_GTC | | + + When the network moves ahead "2" blocks + Then the mark price should be "15900" for the market "ETH/FEB23" + + And the average fill price is: + | market | volume | side | ref price | mark price | equivalent linear slippage factor | + | ETH/FEB23 | 3 | sell | 15900 | 15900 | 0 | + + #party margin:15900*(0.25+0.2)*3 +15900*0.2*3=31005 + And the parties should have the following margin levels: + | party | market id | maintenance | + | party | ETH/FEB23 | 31005 | + | aux1 | ETH/FEB23 | 15900 | + | aux2 | ETH/FEB23 | 31800 | + + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | party | USD | ETH/FEB23 | 37206 | 443294 | + | aux1 | USD | ETH/FEB23 | 17880 | 982120 | + | aux2 | USD | ETH/FEB23 | 43680 | 56320 | + + #0016-PFUT-028: Updating a risk model on a futures market with [hardcoded risk factors] + And the markets are updated: + | id | risk model | + | ETH/FEB23 | lognormal-risk-model-1 | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | buySideProvider | ETH/FEB23 | buy | 1 | 15900 | 1 | TYPE_LIMIT | TIF_GTC | | + And the network moves ahead "3" blocks + + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | party | USD | ETH/FEB23 | 83767 | 396733 | + | aux1 | USD | ETH/FEB23 | 70533 | 929467 | + | aux2 | USD | ETH/FEB23 | 100000 | 0 | + + #party margin:15900*(0.25+0.5650462)*4 +15900*0.5650462*2=69806 + And the parties should have the following margin levels: + | party | market id | maintenance | + | party | ETH/FEB23 | 69806 | + | aux1 | ETH/FEB23 | 58778 | + | aux2 | ETH/FEB23 | 89843 | + + #0016-PFUT-027: Updating a risk model on a futures market with regular risk model to with [hardcoded risk factors] + And the markets are updated: + | id | risk model | + | ETH/FEB23 | simple-risk-model | + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | buySideProvider | ETH/FEB23 | buy | 1 | 15900 | 1 | TYPE_LIMIT | TIF_GTC | | + And the network moves ahead "3" blocks + + Then the parties should have the following account balances: + | party | asset | market id | margin | general | + | party | USD | ETH/FEB23 | 46746 | 433754 | + | aux1 | USD | ETH/FEB23 | 19080 | 980920 | + | aux2 | USD | ETH/FEB23 | 38160 | 61840 | + + #party margin:15900*(0.25+0.2)*5 +15900*0.2*1=69806=38955 + And the parties should have the following margin levels: + | party | market id | maintenance | + | party | ETH/FEB23 | 38955 | + | aux1 | ETH/FEB23 | 15900 | + | aux2 | ETH/FEB23 | 31800 | diff --git a/core/integration/features/orders/0037-OPEG-022.feature b/core/integration/features/orders/0037-OPEG-022.feature new file mode 100644 index 00000000000..8d575324b2e --- /dev/null +++ b/core/integration/features/orders/0037-OPEG-022.feature @@ -0,0 +1,89 @@ + +Feature: 0001 tick size should be using market decimal, A pegged order specifying an offset which is not an integer multiple of the markets tick size should be rejected. + + Background: + Given the following network parameters are set: + | name | value | + | market.liquidity.bondPenaltyParameter | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | validators.epoch.length | 5s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.stakeToCcyVolume | 1.0 | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.19 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 1 | + + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.1 | 24h | 1 | + + And the following assets are registered: + | id | decimal places | + | ETH | 1 | + + And the average block duration is "1" + And the simple risk model named "simple-risk-model-1": + | long | short | max move up | min move down | probability of trading | + | 0.1 | 0.1 | 60 | 50 | 0.2 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.004 | 0.001 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 1 | 0.99 | 5 | + And the liquidity sla params named "SLA": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.01 | 0.5 | 1 | 1.0 | + + Scenario: + #0037-OPEG-022:Given a market with non-zero market and asset decimals where the asset decimals are strictly less than the market decimals (yielding a negative price factor). A pegged order specifying an offset which is not an integer multiple of the markets tick size should be rejected. + #0037-OPEG-025:Given a market with non-zero market and asset decimals where the asset decimals are equal to the market decimals (yielding a negative price factor). A pegged order specifying an offset which is not an integer multiple of the markets tick size should be rejected. + #0037-OPEG-026:Given a market with non-zero market and asset decimals where the asset decimals are strictly more than the market decimals (yielding a negative price factor). A pegged order specifying an offset which is not an integer multiple of the markets tick size should be rejected. + 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 | decimal places | tick size | + | ETH/DEC21 | ETH | ETH | lqm-params | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | default-eth-for-future | 0.5 | 0 | SLA | 2 | 10 | + | ETH/DEC22 | ETH | ETH | lqm-params | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | default-eth-for-future | 0.5 | 0 | SLA | 2 | 5 | + | ETH/DEC23 | ETH | ETH | lqm-params | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | default-eth-for-future | 0.5 | 0 | SLA | 1 | 5 | + | ETH/DEC24 | ETH | ETH | lqm-params | simple-risk-model-1 | default-margin-calculator | 1 | fees-config-1 | price-monitoring-1 | default-eth-for-future | 0.5 | 0 | SLA | 0 | 10 | + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100000 | + | party3 | ETH | 1000000 | + | party4 | ETH | 1000000 | + And the average block duration is "1" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party3 | ETH/DEC21 | buy | 100 | 101 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | OrderError: price not in tick size | + | party3 | ETH/DEC21 | buy | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | OrderError: price not in tick size | + | party4 | ETH/DEC21 | sell | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p4s2-1 | OrderError: price not in tick size | + | party4 | ETH/DEC21 | sell | 1000 | 191 | 0 | TYPE_LIMIT | TIF_GTC | p4s1-1 | OrderError: price not in tick size | + | party3 | ETH/DEC22 | buy | 100 | 101 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-2 | OrderError: price not in tick size | + | party3 | ETH/DEC22 | buy | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-2 | OrderError: price not in tick size | + | party4 | ETH/DEC22 | sell | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p4s2-2 | OrderError: price not in tick size | + | party4 | ETH/DEC22 | sell | 1000 | 191 | 0 | TYPE_LIMIT | TIF_GTC | p4s1-2 | OrderError: price not in tick size | + | party3 | ETH/DEC23 | buy | 100 | 101 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-3 | OrderError: price not in tick size | + | party3 | ETH/DEC23 | buy | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-3 | OrderError: price not in tick size | + | party4 | ETH/DEC23 | sell | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p4s2-3 | OrderError: price not in tick size | + | party4 | ETH/DEC23 | sell | 1000 | 191 | 0 | TYPE_LIMIT | TIF_GTC | p4s1-3 | OrderError: price not in tick size | + | party3 | ETH/DEC24 | buy | 100 | 101 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-4 | OrderError: price not in tick size | + | party3 | ETH/DEC24 | buy | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-4 | OrderError: price not in tick size | + | party4 | ETH/DEC24 | sell | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p4s2-4 | OrderError: price not in tick size | + | party4 | ETH/DEC24 | sell | 1000 | 191 | 0 | TYPE_LIMIT | TIF_GTC | p4s1-4 | OrderError: price not in tick size | + + Then the network moves ahead "2" blocks + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/DEC21" + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/DEC22" + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/DEC23" + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/DEC24" + + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | error | + | party1 | ETH/DEC21 | 10 | 5 | buy | MID | 10 | 10 | peg-buy-1 | | + | party1 | ETH/DEC21 | 10 | 5 | sell | MID | 20 | 20 | peg-buy-2 | | + | party1 | ETH/DEC21 | 10 | 5 | buy | MID | 20 | 100 | peg-buy-3 | | + | party1 | ETH/DEC21 | 10 | 5 | sell | MID | 20 | 2 | peg-buy-4 | OrderError: price not in tick size | + | party1 | ETH/DEC21 | 10 | 5 | buy | MID | 20 | 5 | peg-buy-5 | OrderError: price not in tick size | + | party1 | ETH/DEC22 | 10 | 5 | buy | MID | 20 | 15 | peg-buy-6 | | + | party1 | ETH/DEC23 | 10 | 5 | sell | MID | 20 | 6 | peg-buy-7 | OrderError: price not in tick size | + | party1 | ETH/DEC24 | 10 | 5 | buy | MID | 20 | 17 | peg-buy-8 | OrderError: price not in tick size | diff --git a/core/integration/features/price_monitoring/0032-PRIM-014.feature b/core/integration/features/price_monitoring/0032-PRIM-014.feature new file mode 100644 index 00000000000..dd2b3833a0e --- /dev/null +++ b/core/integration/features/price_monitoring/0032-PRIM-014.feature @@ -0,0 +1,123 @@ +Feature: When market is in price monitoring auction, change of a risk model or any of its parameters doesn't affect the previously calculated + auction end time, any remaining price monitoring bounds cannot extend the auction further. Upon uncrossing price monitoring bounds get + reset using the updated parameter values. (0032-PRIM-014) + + Background: + Given time is updated to "2024-01-01T00:00:00Z" + + Given the following assets are registered: + | id | decimal places | + | ETH | 2 | + + And the price monitoring named "my-price-monitoring": + | horizon | probability | auction extension | + | 30 | 0.999 | 10 | + | 60 | 0.999 | 20 | + | 90 | 0.999 | 40 | + | 120 | 0.999 | 80 | + + And the log normal risk model named "my-log-normal-risk-model": + | risk aversion | tau | mu | r | sigma | + | 0.000001 | 0.00011407711613050422 | 0 | 0.016 | 2.0 | + + And the log normal risk model named "my-log-normal-risk-model-2": + | risk aversion | tau | mu | r | sigma | + | 0.000001 | 0.00011407711613050421 | 0 | 0.016 | 2.0 | + + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | + | ETH/DEC24 | ETH | ETH | default-log-normal-risk-model | default-margin-calculator | 1 | default-none | my-price-monitoring | default-eth-for-future | 0.01 | 0 | default-futures | + + And the following network parameters are set: + | name | value | + | market.auction.minimumDuration | 10 | + | limits.markets.maxPeggedOrders | 2 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.value.windowLength | 1h | + + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000000000 | + | party5 | ETH | 10000000000 | + | lp1 | ETH | 10000000000 | + | lp2 | ETH | 10000000000 | + + When the parties submit the following liquidity provision: + | id | party | market id | commitment amount | fee | lp type | + | lpp1 | lp1 | ETH/DEC24 | 90000000 | 0.1 | submission | + | lpp2 | lp2 | ETH/DEC24 | 90000000 | 0.1 | 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/DEC24 | 2 | 1 | buy | BID | 50 | 500 | + | lp2 | ETH/DEC24 | 2 | 1 | sell | ASK | 50 | 500 | + + Scenario: + + # Place some orders to get out of auction + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | ETH/DEC24 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GFA | + | party5 | ETH/DEC24 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + And the opening auction period ends for market "ETH/DEC24" + When the network moves ahead "1" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC24" + And the mark price should be "1000" for the market "ETH/DEC24" + + # Check that the market price bounds are set + And the market data for the market "ETH/DEC24" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | auction start | auction end | + | 1000 | TRADING_MODE_CONTINUOUS | 30 | 994 | 1006 | 74340 | 180000000 | 1 | 0 | 0 | + | 1000 | TRADING_MODE_CONTINUOUS | 60 | 991 | 1009 | 74340 | 180000000 | 1 | 0 | 0 | + | 1000 | TRADING_MODE_CONTINUOUS | 90 | 989 | 1011 | 74340 | 180000000 | 1 | 0 | 0 | + | 1000 | TRADING_MODE_CONTINUOUS | 120 | 988 | 1012 | 74340 | 180000000 | 1 | 0 | 0 | + + # Place 2 persistent orders that are outside all of the price bounds + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | ETH/DEC24 | buy | 1 | 1013 | 0 | TYPE_LIMIT | TIF_GTC | buy1 | + | party5 | ETH/DEC24 | sell | 1 | 1013 | 0 | TYPE_LIMIT | TIF_GTC | sell1 | + + When the network moves ahead "1" blocks + + # Check we have been placed in auction + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "ETH/DEC24" + + And the starting auction time for market "ETH/DEC24" is "1704067221000000000" + And the ending auction time for market "ETH/DEC24" is "1704067231000000000" + + # Check we know the auction time + And the market data for the market "ETH/DEC24" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | auction start | auction end | + | 1000 | TRADING_MODE_MONITORING_AUCTION | 60 | 991 | 1009 | 150612 | 180000000 | 1 | 1704067221000000000 | 1704067231000000000 | + | 1000 | TRADING_MODE_MONITORING_AUCTION | 90 | 989 | 1011 | 150612 | 180000000 | 1 | 1704067221000000000 | 1704067231000000000 | + | 1000 | TRADING_MODE_MONITORING_AUCTION | 120 | 988 | 1012 | 150612 | 180000000 | 1 | 1704067221000000000 | 1704067231000000000 | + + # Now update the risk model to deactivate all pending price bounds + Then the markets are updated: + | id | risk model | + | ETH/DEC24 | my-log-normal-risk-model-2 | + + # If we move ahead 10 blocks we should come out of auction instead of it being extended + When the network moves ahead "15" blocks + + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC24" + + And the market data for the market "ETH/DEC24" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | auction start | auction end | + | 1013 | TRADING_MODE_CONTINUOUS | 30 | 1007 | 1019 | 225372 | 180000000 | 2 | 0 | 0 | + | 1013 | TRADING_MODE_CONTINUOUS | 60 | 1004 | 1022 | 225372 | 180000000 | 2 | 0 | 0 | + | 1013 | TRADING_MODE_CONTINUOUS | 90 | 1002 | 1024 | 225372 | 180000000 | 2 | 0 | 0 | + | 1013 | TRADING_MODE_CONTINUOUS | 120 | 1001 | 1026 | 225372 | 180000000 | 2 | 0 | 0 | + + + # The mark price should show the orders have traded + And the mark price should be "1013" for the market "ETH/DEC24" + + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | party1 | ETH/DEC24 | buy1 | buy | 1 | 0 | 1013 | STATUS_FILLED | + | party5 | ETH/DEC24 | sell1 | sell | 1 | 0 | 1013 | STATUS_FILLED | + diff --git a/core/integration/features/price_monitoring/end-long-auction-with-trigger-change.feature b/core/integration/features/price_monitoring/end-long-auction-with-trigger-change.feature index dba28256f0f..a053e359dd8 100644 --- a/core/integration/features/price_monitoring/end-long-auction-with-trigger-change.feature +++ b/core/integration/features/price_monitoring/end-long-auction-with-trigger-change.feature @@ -114,16 +114,16 @@ Feature: Confirm return to continuous trading during significant mark price chan | ETH/FEB23 | my-price-monitoring-2 | weight | 0,0,1,0 | 0s,0s,0h0m120s,0s | # first we get bounds based on default factors, once the state variable engine finishes its calculation we get the proper values Then the market data for the market "ETH/FEB23" should be: - | mark price | trading mode | auction trigger | horizon | ref price | min bound | max bound | - | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 30 | 1000 | 900 | 1100 | + | mark price | trading mode | auction trigger | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | # the last second of the original extensions And the network moves ahead "3" blocks Then the market data for the market "ETH/FEB23" should be: - | mark price | trading mode | auction trigger | horizon | ref price | min bound | max bound | - | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 30 | 1000 | 997 | 1003 | + | mark price | trading mode | auction trigger | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | - # the updated extension triggered, no triggers left + # the updated extension triggered, no triggers left as they've all been switched off since update took place during auction And the network moves ahead "1" blocks Then the market data for the market "ETH/FEB23" should be: | mark price | trading mode | auction trigger | @@ -174,15 +174,15 @@ Feature: Confirm return to continuous trading during significant mark price chan # the last second of the original extensions And the network moves ahead "3" blocks Then the market data for the market "ETH/FEB23" should be: - | mark price | trading mode | auction trigger | horizon | ref price | min bound | max bound | - | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 30 | 1000 | 997 | 1003 | + | mark price | trading mode | auction trigger | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | When the parties place the following orders with ticks: | party | market id | side | volume | price | resulting trades | type | tif | | party1 | ETH/FEB23 | buy | 1 | 2004 | 0 | TYPE_LIMIT | TIF_GTC | | party2 | ETH/FEB23 | sell | 1 | 2004 | 0 | TYPE_LIMIT | TIF_GTC | - # the updated extension triggered, no triggers left + # the updated extension triggered, no triggers left as they've all been switched off since update took place during auction And the network moves ahead "1" blocks Then the market data for the market "ETH/FEB23" should be: | mark price | trading mode | auction trigger | @@ -217,14 +217,14 @@ Feature: Confirm return to continuous trading during significant mark price chan # the last second of the original extensions And the network moves ahead "3" blocks Then the market data for the market "ETH/FEB23" should be: - | mark price | trading mode | auction trigger | horizon | ref price | min bound | max bound | - | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | 30 | 1000 | 997 | 1003 | + | mark price | trading mode | auction trigger | + | 1000 | TRADING_MODE_MONITORING_AUCTION | AUCTION_TRIGGER_PRICE | When the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | prices.ETH.value | 2000 | -1s | - # the updated extension triggered, no triggers left + # the updated extension triggered, no triggers left as they've all been switched off since update took place during auction And the network moves ahead "1" blocks Then the market data for the market "ETH/FEB23" should be: | mark price | trading mode | auction trigger | @@ -253,4 +253,26 @@ Feature: Confirm return to continuous trading during significant mark price chan And the network moves ahead "118" blocks Then the market data for the market "ETH/FEB23" should be: | mark price | trading mode | auction trigger | last traded price | horizon | ref price | min bound | max bound | - | 1000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 1003 | 30 | 1003 | 1000 | 1006 | \ No newline at end of file + | 1000 | TRADING_MODE_CONTINUOUS | AUCTION_TRIGGER_UNSPECIFIED | 1003 | 30 | 1003 | 1000 | 1006 | + + Scenario: Verify that trigger update in continuous trading works as expected + + When the network moves ahead "2" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | horizon | ref price | min bound | max bound | + | 1000 | TRADING_MODE_CONTINUOUS | 60 | 1000 | 995 | 1005 | + + And the price monitoring named "my-price-monitoring-2": + | horizon | probability | auction extension | + | 30 | 0.95 | 1 | + + # update trigger here so that there's only one + When the markets are updated: + | id | price monitoring | price type | source weights | source staleness tolerance | + | ETH/FEB23 | my-price-monitoring-2 | weight | 0,0,1,0 | 0s,0s,0h0m120s,0s | + + # the last second of the original extensions + And the network moves ahead "3" blocks + Then the market data for the market "ETH/FEB23" should be: + | mark price | trading mode | horizon | ref price | min bound | max bound | + | 1000 | TRADING_MODE_CONTINUOUS | 30 | 1000 | 997 | 1003 | diff --git a/core/integration/features/settlement/0019-MCAL_018.feature b/core/integration/features/settlement/0019-MCAL_018.feature index 9ce59dec02d..1dcd31ec0fa 100644 --- a/core/integration/features/settlement/0019-MCAL_018.feature +++ b/core/integration/features/settlement/0019-MCAL_018.feature @@ -2,7 +2,7 @@ Feature: check when settlement data precision is different/equal to the settleme Background: - And the following assets are registered: + Given the following assets are registered: | id | decimal places | | USD | 2 | @@ -26,15 +26,15 @@ Feature: check when settlement data precision is different/equal to the settleme @Perpetual Scenario: 001 oracle data decimal > asset decimal 0070-MKTD-018, 0019-MCAL-091 + # start at this timestamp + Given time is updated to "2021-02-11T16:35:21Z" And the markets: | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | position decimal places | market type | sla params | | ETH/DEC19 | ETH | USD | default-simple-risk-model-3 | default-margin-calculator | 1 | default-none | default-none | perp-oracle-1 | 0.25 | 0 | -1 | perp | default-futures | And the following network parameters are set: - | name | value | - | market.auction.minimumDuration | 1 | - | limits.markets.maxPeggedOrders | 2 | - Given the following network parameters are set: | name | value | + | market.auction.minimumDuration | 1 | + | limits.markets.maxPeggedOrders | 2 | | network.markPriceUpdateMaximumFrequency | 5s | And the parties deposit on asset's general account the following amount: | party | asset | amount | @@ -62,11 +62,13 @@ Feature: check when settlement data precision is different/equal to the settleme | aux2 | ETH/DEC19 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | aux | ETH/DEC19 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | - Then the opening auction period ends for market "ETH/DEC19" + # Time moves forwards 2s + Then the network moves ahead "2" blocks And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC19" + # Another +1s making it 2021-02-11T16:35:24 When the network moves ahead "1" blocks - When the parties place the following orders: + And the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | | party1 | ETH/DEC19 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | | party2 | ETH/DEC19 | buy | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | @@ -88,9 +90,18 @@ Feature: check when settlement data precision is different/equal to the settleme | party3 | USD | ETH/DEC19 | 132000 | 99866000 | | lp1 | USD | ETH/DEC19 | 6600000 | 492200000 | - When the oracles broadcast data with block time signed with "0xCAFECAFE1": + + And the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | perp.funding.cue | 1613061324 | 0s | + # 4320h is 6 * 30 * 24 (180days, or 6 months) with a block duration of 10 days (so 18 ticks) + # making it 2021-08-10T16:35:24 + Then the network moves ahead "4320h" with block duration of "240h" + # now move ahead the remaining time to get to 2021-08-11T11:04:07 + # We're moving by 66,583s (18 * 3600 + 29 * 60 + 43), divisible by 11 (6053) + # So set block duration to 6053 for 11 ticks + And the network moves ahead "18h29m43s" with block duration of "6053s" + #When time is updated to "2021-08-12T11:04:07Z" When the network moves ahead "5" blocks When the oracles broadcast data with block time signed with "0xCAFECAFE1": @@ -109,6 +120,7 @@ Feature: check when settlement data precision is different/equal to the settleme @Perpetual Scenario: 002 oracle data decimal < asset decimal 0070-MKTD-019 + Given time is updated to "2021-02-11T16:35:21Z" And the markets: | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | position decimal places | decimal places | market type | sla params | | ETH/DEC19 | ETH | USD | default-simple-risk-model-3 | default-margin-calculator | 1 | default-none | default-none | perp-oracle-3 | 0.25 | 0 | 1 | 2 | perp | default-futures | @@ -145,11 +157,12 @@ Feature: check when settlement data precision is different/equal to the settleme | aux2 | ETH/DEC19 | buy | 100 | 100000 | 0 | TYPE_LIMIT | TIF_GTC | | aux | ETH/DEC19 | sell | 100 | 100000 | 0 | TYPE_LIMIT | TIF_GTC | - Then the opening auction period ends for market "ETH/DEC19" + Then the network moves ahead "2" blocks And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC19" + # Time at start of the scenario is now +3s When the network moves ahead "1" blocks - When the parties place the following orders: + And the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | | party1 | ETH/DEC19 | sell | 100 | 100000 | 0 | TYPE_LIMIT | TIF_GTC | | party2 | ETH/DEC19 | buy | 100 | 100000 | 1 | TYPE_LIMIT | TIF_GTC | @@ -171,17 +184,29 @@ Feature: check when settlement data precision is different/equal to the settleme | party3 | USD | ETH/DEC19 | 132000 | 99866000 | | lp1 | USD | ETH/DEC19 | 6600000 | 492200000 | + When the oracles broadcast data with block time signed with "0xCAFECAFE3": | name | value | time offset | | perp.funding.cue | 1613061324 | 0s | - When the network moves ahead "5" blocks - When the oracles broadcast data with block time signed with "0xCAFECAFE3": + # 4320h is 6 * 30 * 24 (180days, or 6 months) with a block duration of 10 days (so 18 ticks) + # making it 2021-08-10T16:35:24 + Then the network moves ahead "4320h" with block duration of "240h" + # now move ahead the remaining time to get to 2021-08-11T11:04:07 + # We're moving by 66,583s (18 * 3600 + 29 * 60 + 43), divisible by 11 (6053) + # So set block duration to 6053 for 11 ticks + And the network moves ahead "18h29m43s" with block duration of "6053s" + + # When time is updated to "2021-08-12T11:04:07Z" + + And the network moves ahead "5" blocks + Then the oracles broadcast data with block time signed with "0xCAFECAFE3": | name | value | time offset | | perp.ETH.value | 30000 | 0s | | perp.funding.cue | 1628766252 | 0s | #1628766252 is half year after the first oracel time + #Then debug funding period events And the following transfers should happen: | from | to | from account | to account | market id | amount | asset | | aux2 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 74700 | USD | @@ -190,7 +215,9 @@ Feature: check when settlement data precision is different/equal to the settleme | market | aux | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 74700 | USD | | market | party1 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 149400 | USD | + @PBlock Scenario: 003 oracle data decimal = asset decimal, while market decimal is 1, 0070-MKTD-020 + Given time is updated to "2021-02-11T16:35:21Z" And the markets: | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | decimal places | position decimal places | market type | sla params | | ETH/DEC19 | ETH | USD | default-simple-risk-model-3 | default-margin-calculator | 1 | default-none | default-none | perp-oracle-2 | 0.25 | 0 | 1 | -1 | perp | default-futures | @@ -198,7 +225,7 @@ Feature: check when settlement data precision is different/equal to the settleme | name | value | | market.auction.minimumDuration | 1 | | limits.markets.maxPeggedOrders | 2 | - Given the following network parameters are set: + And the following network parameters are set: | name | value | | network.markPriceUpdateMaximumFrequency | 5s | And the parties deposit on asset's general account the following amount: @@ -227,7 +254,7 @@ Feature: check when settlement data precision is different/equal to the settleme | aux2 | ETH/DEC19 | buy | 1 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | | aux | ETH/DEC19 | sell | 1 | 10000 | 0 | TYPE_LIMIT | TIF_GTC | - Then the opening auction period ends for market "ETH/DEC19" + Then the network moves ahead "2" blocks And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC19" When the network moves ahead "1" blocks @@ -253,25 +280,30 @@ Feature: check when settlement data precision is different/equal to the settleme | party3 | USD | ETH/DEC19 | 132000 | 99866000 | | lp1 | USD | ETH/DEC19 | 6600000 | 492200000 | + When the oracles broadcast data with block time signed with "0xCAFECAFE2": | name | value | time offset | | perp.funding.cue | 1613061324 | 0s | - - When the network moves ahead "5" blocks - When the oracles broadcast data with block time signed with "0xCAFECAFE2": + + # 4320h is 6 * 30 * 24 (180days, or 6 months) with a block duration of 10 days (so 18 ticks) + # making it 2021-08-10T16:35:24 + Then the network moves ahead "4320h" with block duration of "240h" + # now move ahead the remaining time to get to 2021-08-11T11:04:07 + # We're moving by 66,583s (18 * 3600 + 29 * 60 + 43), divisible by 11 (6053) + # So set block duration to 6053 for 11 ticks + And the network moves ahead "18h29m43s" with block duration of "6053s" + + And the network moves ahead "5" blocks + And the oracles broadcast data with block time signed with "0xCAFECAFE2": | name | value | time offset | | perp.ETH.value | 300000 | 0s | | perp.funding.cue | 1628766252 | 0s | #1628766252 is half year after the first oracel time - And the following transfers should happen: + Then the following transfers should happen: | from | to | from account | to account | market id | amount | asset | | aux2 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 74700 | USD | | party2 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 74700 | USD | | party3 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 74700 | USD | | market | aux | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 74700 | USD | | market | party1 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 149400 | USD | - - - - diff --git a/core/integration/features/settlement/0019-MCAL_fundingMargin5.feature b/core/integration/features/settlement/0019-MCAL_fundingMargin5.feature index 45552770ce2..c4ec346c007 100644 --- a/core/integration/features/settlement/0019-MCAL_fundingMargin5.feature +++ b/core/integration/features/settlement/0019-MCAL_fundingMargin5.feature @@ -79,16 +79,22 @@ Feature: check when settlement data precision is different/equal to the settleme | party1 | ETH/DEC19 | sell | 1 | 2000 | 0 | TYPE_LIMIT | TIF_GTC | | party3 | ETH/DEC19 | buy | 1 | 2000 | 1 | TYPE_LIMIT | TIF_GTC | + When time is updated to "2021-02-11T16:35:24Z" + Then system unix time is "1613061324" + When the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | perp.funding.cue | 1613061324 | 0s | And the network moves ahead "5" blocks + When time is updated to "2021-08-12T11:04:12Z" + Then system unix time is "1628766252" + Then the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | perp.ETH.value | 300000000 | 0s | | perp.funding.cue | 1628766252 | 0s | -# #1628766252 is half year after the first oracel time + #1628766252 is half year after the first oracle time And the following transfers should happen: | from | to | from account | to account | market id | amount | asset | @@ -104,27 +110,35 @@ Feature: check when settlement data precision is different/equal to the settleme | id | data source config | linear slippage factor | quadratic slippage factor | | ETH/DEC19 | perp-oracle-2 | 0.25 | 0 | + When time is updated to "2021-08-12T11:04:30Z" + Then system unix time is "1628766270" + And the oracles broadcast data with block time signed with "0xCAFECAFE2": | name | value | time offset | | perp.funding.cue | 1628766270 | 0s | + | perp.ETH.value | 350000000 | 0s | - When the network moves ahead "5" blocks + When time is updated to "2024-10-12T20:51:10Z" + Then system unix time is "1728766270" Then the oracles broadcast data with block time signed with "0xCAFECAFE2": | name | value | time offset | - | perp.ETH.value | 350000000 | 0s | | perp.funding.cue | 1728766270 | 0s | + And the following funding period events should be emitted: + | start | end | internal twap | external twap | funding payment | + | 1628766270 | 1728766270 | 200000 | 350000000 | -174800000 | + # funding loss, win, margin excess transfers: And the following transfers should happen: - | from | to | from account | to account | market id | amount | asset | - | aux | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 1080000 | USD | - | aux | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 297994700 | USD | - | party1 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 1680000 | USD | - | party1 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 997469400 | USD | - | market | party2 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 432741366 | USD | - | market | party3 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 432741368 | USD | - | market | aux2 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 432741366 | USD | - | aux2 | aux2 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC19 | 432666666 | USD | - | party2 | party2 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC19 | 432666666 | USD | - | party3 | party3 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC19 | 432666668 | USD | + | from | to | from account | to account | market id | amount | asset | type | + | aux | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 1080000 | USD | TRANSFER_TYPE_PERPETUALS_FUNDING_LOSS | + | aux | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 297994700 | USD | TRANSFER_TYPE_PERPETUALS_FUNDING_LOSS | + | party1 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 1680000 | USD | TRANSFER_TYPE_PERPETUALS_FUNDING_LOSS | + | party1 | market | ACCOUNT_TYPE_GENERAL | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 997469400 | USD | TRANSFER_TYPE_PERPETUALS_FUNDING_LOSS | + | market | party2 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 432741366 | USD | TRANSFER_TYPE_PERPETUALS_FUNDING_WIN | + | market | party3 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 432741368 | USD | TRANSFER_TYPE_PERPETUALS_FUNDING_WIN | + | market | aux2 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 432741366 | USD | TRANSFER_TYPE_PERPETUALS_FUNDING_WIN | + | aux2 | aux2 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC19 | 432711486 | USD | TRANSFER_TYPE_MARGIN_HIGH | + | party2 | party2 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC19 | 432711486 | USD | TRANSFER_TYPE_MARGIN_HIGH | + | party3 | party3 | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_GENERAL | ETH/DEC19 | 432711488 | USD | TRANSFER_TYPE_MARGIN_HIGH | diff --git a/core/integration/features/settlement/0053-PERP-024_Closeout.feature b/core/integration/features/settlement/0053-PERP-024_Closeout.feature deleted file mode 100644 index b4436126352..00000000000 --- a/core/integration/features/settlement/0053-PERP-024_Closeout.feature +++ /dev/null @@ -1,147 +0,0 @@ -Feature: Test funding payment triggering closeout for Perps market - - Background: - - And the perpetual oracles from "0xCAFECAFE1": - | name | asset | settlement property | settlement type | schedule property | schedule type | margin funding factor | interest rate | clamp lower bound | clamp upper bound | quote name | settlement decimals | - | perp-oracle | USD | perp.ETH.value | TYPE_INTEGER | perp.funding.cue | TYPE_TIMESTAMP | 0.5 | 0.05 | 0.1 | 0.9 | ETH | 18 | - 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 | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | position decimal places | market type | sla params | - | ETH/DEC19 | ETH | USD | default-simple-risk-model-3 | default-margin-calculator | 1 | default-none | default-none | perp-oracle | 1 | 0 | -3 | perp | default-futures | - - And the initial insurance pool balance is "100" for all the markets - And the following network parameters are set: - | name | value | - | market.auction.minimumDuration | 1 | - | limits.markets.maxPeggedOrders | 2 | - - @Perpetual @Liquidation - Scenario: (0053-PERP-024) Funding payment triggering closeout but no loss soccialization - Given the following network parameters are set: - | name | value | - | network.markPriceUpdateMaximumFrequency | 5s | - And the parties deposit on asset's general account the following amount: - | party | asset | amount | - | party1 | USD | 10000000 | - | party2 | USD | 10000000 | - | party3 | USD | 10000000 | - | aux | USD | 100000000 | - | aux2 | USD | 2391000 | - | lpprov | USD | 100000000 | - - When the parties submit the following liquidity provision: - | id | party | market id | commitment amount | fee | lp type | - | lp1 | lpprov | ETH/DEC19 | 10000000 | 0.001 | submission | - | lp1 | lpprov | ETH/DEC19 | 10000000 | 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 | - | lpprov | ETH/DEC19 | 2 | 1 | buy | BID | 50 | 1 | - | lpprov | ETH/DEC19 | 2 | 1 | sell | ASK | 50 | 1 | - - # place auxiliary orders so we always have best bid and best offer as to not trigger the liquidity auction - When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | - | aux | ETH/DEC19 | buy | 1 | 49 | 0 | TYPE_LIMIT | TIF_GTC | - | aux | ETH/DEC19 | sell | 1 | 5001 | 0 | TYPE_LIMIT | TIF_GTC | - | aux2 | ETH/DEC19 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | - | aux | ETH/DEC19 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | - - And the market data for the market "ETH/DEC19" should be: - | target stake | supplied stake | - | 1100000 | 10000000 | - Then the opening auction period ends for market "ETH/DEC19" - And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC19" - And the settlement account should have a balance of "0" for the market "ETH/DEC19" - - # back sure we end the block so we're in a new one after opening auction - When the network moves ahead "1" blocks - - When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | - | party1 | ETH/DEC19 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | - | party2 | ETH/DEC19 | buy | 1 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | - - And the settlement account should have a balance of "0" for the market "ETH/DEC19" - When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | - | party1 | ETH/DEC19 | sell | 1 | 2000 | 0 | TYPE_LIMIT | TIF_GTC | - - When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | - | party3 | ETH/DEC19 | buy | 1 | 2000 | 1 | TYPE_LIMIT | TIF_GTC | - - And the market data for the market "ETH/DEC19" should be: - | mark price | trading mode | target stake | supplied stake | open interest | - | 1000 | TRADING_MODE_CONTINUOUS | 3300000 | 10000000 | 3 | - # send in external data to the perpetual market, it should not change anything and a MTM should not happen - When the network moves ahead "1" blocks - And the mark price should be "1000" for the market "ETH/DEC19" - - When the oracles broadcast data with block time signed with "0xCAFECAFE1": - | name | value | time offset | - | perp.ETH.value | 1600000000000000000000 | 0s | - | perp.funding.cue | 1612998252 | 0s | - When the network moves ahead "4" blocks - - And the following transfers should happen: - | from | to | from account | to account | market id | amount | asset | - | party1 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 1000000 | USD | - | aux | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 1000000 | USD | - | market | aux2 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 1000000 | USD | - | market | party2 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 1000000 | USD | - # And the cumulated balance for all accounts should be worth "330010000" - And the settlement account should have a balance of "0" for the market "ETH/DEC19" - - When the network moves ahead "1" blocks - - When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | - | aux | ETH/DEC19 | sell | 1 | 2001 | 0 | TYPE_LIMIT | TIF_GTC | - | aux2 | ETH/DEC19 | buy | 1 | 2001 | 1 | TYPE_LIMIT | TIF_GTC | - - And the mark price should be "2000" for the market "ETH/DEC19" - Then the parties should have the following profit and loss: - | party | volume | unrealised pnl | realised pnl | - | aux | -1 | -1000000 | 96000 | - | aux2 | 1 | 1000000 | -96000 | - | party1 | -2 | -1000000 | 0 | - | party2 | 1 | 1000000 | 0 | - | party3 | 1 | 0 | 0 | - | lpprov | 0 | 0 | 0 | - ## allow close-outs to happen - When the network moves ahead "1" blocks - #1 year has 8760 hours,so 0.002 year would be: 8760*0.002*3600 = 63072second, so next funding time (with delta_t = 0.002) would be 1612998252+63072=1613061324 - And the oracles broadcast data with block time signed with "0xCAFECAFE1": - | name | value | time offset | - | perp.funding.cue | 1613061324 | 0s | - - #funding payment = f_twap - s_twap + clamp_lower_bound*s_twap =2000-1600+(0.1*1600)=560 - Then the following transfers should happen: - | from | to | from account | to account | market id | amount | asset | - | aux2 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 1120000 | USD | - | party2 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 560000 | USD | - | party3 | market | ACCOUNT_TYPE_MARGIN | ACCOUNT_TYPE_SETTLEMENT | ETH/DEC19 | 560000 | USD | - | market | aux | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 1120000 | USD | - | market | party1 | ACCOUNT_TYPE_SETTLEMENT | ACCOUNT_TYPE_MARGIN | ETH/DEC19 | 1120000 | USD | - - And the parties should have the following account balances: - | party | asset | market id | margin | general | - | aux2 | USD | ETH/DEC19 | 0 | 0 | - - And the parties should have the following profit and loss: - | party | volume | unrealised pnl | realised pnl | - | aux | -1 | -1000000 | 1216000 | - | aux2 | 0 | 0 | -2388999 | - | party1 | -2 | -1000000 | 1120000 | - | party2 | 1 | 1000000 | -560000 | - | party3 | 1 | 0 | -560000 | - | lpprov | 0 | 0 | 0 | - - And the insurance pool balance should be "2173099" for the market "ETH/DEC19" - - - diff --git a/core/integration/features/settlement/0053-PERP-024_LossSocialisation.feature b/core/integration/features/settlement/0053-PERP-024_LossSocialisation.feature index 5b399a42843..57a9eaa273d 100644 --- a/core/integration/features/settlement/0053-PERP-024_LossSocialisation.feature +++ b/core/integration/features/settlement/0053-PERP-024_LossSocialisation.feature @@ -19,7 +19,7 @@ Feature: Test funding payment triggering closeout for Perps market | limits.markets.maxPeggedOrders | 2 | @Perpetual @Liquidation - Scenario: (0053-PERP-024) Funding payment triggering loss soccialization + Scenario: (0053-PERP-024) Funding payment triggering loss socialization Given the following network parameters are set: | name | value | | network.markPriceUpdateMaximumFrequency | 5s | @@ -80,10 +80,17 @@ Feature: Test funding payment triggering closeout for Perps market When the network moves ahead "1" blocks And the mark price should be "1000" for the market "ETH/DEC19" + When time is updated to "2021-02-10T23:04:12Z" + Then system unix time is "1612998252" + When the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | perp.ETH.value | 3000000000000000000000 | 0s | | perp.funding.cue | 1612998252 | 0s | + + When time is updated to "2021-08-12T11:04:12Z" + Then system unix time is "1628766252" + When the network moves ahead "4" blocks #MTM for mark price 1000 to 1200 @@ -96,8 +103,6 @@ Feature: Test funding payment triggering closeout for Perps market And the settlement account should have a balance of "0" for the market "ETH/DEC19" - When the network moves ahead "1" blocks - When the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | | aux | ETH/DEC19 | sell | 1 | 2001 | 0 | TYPE_LIMIT | TIF_GTC | diff --git a/core/integration/features/settlement/0053-PERP-028_twap_calculation_with_auction.feature b/core/integration/features/settlement/0053-PERP-028_twap_calculation_with_auction.feature index 68d08430be6..7c046703b68 100644 --- a/core/integration/features/settlement/0053-PERP-028_twap_calculation_with_auction.feature +++ b/core/integration/features/settlement/0053-PERP-028_twap_calculation_with_auction.feature @@ -3,38 +3,41 @@ Feature: Test internal and external twap calculation Background: # epoch time is 1602806400 Given time is updated to "2020-10-16T00:00:00Z" - And the perpetual oracles from "0xCAFECAFE1": - | name | asset | settlement property | settlement type | schedule property | schedule type | margin funding factor | interest rate | clamp lower bound | clamp upper bound | quote name | settlement decimals | - | perp-oracle | USD | perp.ETH.value | TYPE_INTEGER | perp.funding.cue | TYPE_TIMESTAMP | 0.5 | 0.00 | 0.0 | 0.0 | ETH | 18 | - And the liquidity sla params named "SLA": + And the following assets are registered: + | id | decimal places | quantum | + | USD.3.1000 | 3 | 1000 | + And the perpetual oracles from "0xCAFECAFE1": + | name | asset | settlement property | settlement type | schedule property | schedule type | margin funding factor | interest rate | clamp lower bound | clamp upper bound | quote name | settlement decimals | + | perp-oracle | USD.3.1000 | perp.ETH.value | TYPE_INTEGER | perp.funding.cue | TYPE_TIMESTAMP | 0.5 | 0.00 | 0.0 | 0.0 | ETH | 18 | + And the liquidity sla params named "SLA": | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | | 100.0 | 0.5 | 1 | 1.0 | - And the price monitoring named "my-price-monitoring": + And the price monitoring named "my-price-monitoring": | horizon | probability | auction extension | | 43200 | 0.9999999 | 120 | - And the log normal risk model named "my-log-normal-risk-model": + And the log normal risk model named "my-log-normal-risk-model": | risk aversion | tau | mu | r | sigma | | 0.000001 | 0.00011407711613050422 | 0 | 0.016 | 0.8 | - And the markets: - | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | position decimal places | market type | sla params | - | ETH/DEC19 | ETH | USD | my-log-normal-risk-model | default-margin-calculator | 120 | default-none | my-price-monitoring | perp-oracle | 0.25 | 0 | -3 | perp | SLA | - And the following network parameters are set: + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | position decimal places | market type | sla params | + | ETH/DEC19 | ETH | USD.3.1000 | my-log-normal-risk-model | default-margin-calculator | 120 | default-none | my-price-monitoring | perp-oracle | 0.25 | 0 | -3 | perp | SLA | + And the following network parameters are set: | name | value | | network.markPriceUpdateMaximumFrequency | 0s | - And the average block duration is "1" + And the average block duration is "1" When the parties deposit on asset's general account the following amount: - | party | asset | amount | - | party1 | USD | 100000000000 | - | party2 | USD | 100000000000 | - | party3 | USD | 100000000000 | - | aux | USD | 100000000000 | - | aux2 | USD | 100000000000 | - | lpprov | USD | 100000000000 | + | party | asset | amount | + | party1 | USD.3.1000 | 100000000000000 | + | party2 | USD.3.1000 | 100000000000000 | + | party3 | USD.3.1000 | 100000000000000 | + | aux | USD.3.1000 | 100000000000000 | + | aux2 | USD.3.1000 | 100000000000000 | + | lpprov | USD.3.1000 | 100000000000000 | Then the parties submit the following liquidity provision: | id | party | market id | commitment amount | fee | lp type | - | lp1 | lpprov | ETH/DEC19 | 100000 | 0.001 | submission | - # move market to continuous - And the parties place the following orders: + | lp1 | lpprov | ETH/DEC19 | 100000000 | 0.001 | submission | + # move market to continuous + And the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | | aux2 | ETH/DEC19 | buy | 1 | 1 | 0 | TYPE_LIMIT | TIF_GTC | | lpprov | ETH/DEC19 | buy | 100000 | 1 | 0 | TYPE_LIMIT | TIF_GTC | @@ -42,116 +45,131 @@ Feature: Test internal and external twap calculation | aux | ETH/DEC19 | sell | 1 | 10 | 0 | TYPE_LIMIT | TIF_GTC | | aux | ETH/DEC19 | sell | 1 | 35 | 0 | TYPE_LIMIT | TIF_GTC | | lpprov | ETH/DEC19 | sell | 100000 | 35 | 0 | TYPE_LIMIT | TIF_GTC | - And the market data for the market "ETH/DEC19" should be: + And the market data for the market "ETH/DEC19" should be: | target stake | supplied stake | - | 4315 | 100000 | - And the opening auction period ends for market "ETH/DEC19" + | 4315000 | 100000000 | + And the opening auction period ends for market "ETH/DEC19" @Perpetual @twap Scenario: 0053-PERP-028 Internal and External TWAP calculation, auction in funding period Given the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC19" - And time is updated to "2020-10-16T00:05:00Z" + And time is updated to "2020-10-16T00:05:00Z" When the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | | party1 | ETH/DEC19 | buy | 1 | 10 | 0 | TYPE_LIMIT | TIF_GTC | | party2 | ETH/DEC19 | sell | 1 | 10 | 1 | TYPE_LIMIT | TIF_GTC | Then time is updated to "2020-10-16T00:10:00Z" - # 1602806400 + 120s = 1602807000 - # funding period is ended with perp.funding.cue - And the oracles broadcast data with block time signed with "0xCAFECAFE1": + # 0 min in to the next funding period + Given the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | perp.ETH.value | 11000000000000000000 | -1s | | perp.funding.cue | 1602807000 | 0s | - And the mark price should be "10" for the market "ETH/DEC19" + And the mark price should be "10" for the market "ETH/DEC19" # 1 min in to the next funding period - Given time is updated to "2020-10-16T00:11:00Z" - When the parties place the following orders: + Given the network moves ahead "60" blocks + Then the product data for the market "ETH/DEC19" should be: + | internal twap | external twap | funding payment | + | 10000 | 11000 | -1000 | + Given the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | | party1 | ETH/DEC19 | buy | 1 | 11 | 0 | TYPE_LIMIT | TIF_GTC | | party2 | ETH/DEC19 | sell | 1 | 11 | 1 | TYPE_LIMIT | TIF_GTC | - Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + And the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | - | perp.ETH.value | 9000000000000000000 | -1s | + | perp.ETH.value | 9000000000000000000 | 0s | + + # 2 min in to the next funding period + Given the network moves ahead "60" blocks + Then the product data for the market "ETH/DEC19" should be: + | internal twap | external twap | funding payment | + | 10500 | 10000 | 500 | # 3 min in to the next funding period - Given time is updated to "2020-10-16T00:13:00Z" - And the mark price should be "11" for the market "ETH/DEC19" - When the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | - | party1 | ETH/DEC19 | buy | 1 | 11 | 0 | TYPE_LIMIT | TIF_GTC | - | party2 | ETH/DEC19 | sell | 1 | 11 | 1 | TYPE_LIMIT | TIF_GTC | - Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + Given the network moves ahead "60" blocks + Then the product data for the market "ETH/DEC19" should be: + | internal twap | external twap | funding payment | + | 10666 | 9666 | 1000 | + Given the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | - | perp.ETH.value | 10000000000000000000 | -1s | + | perp.ETH.value | 10000000000000000000 | 0s | - # 5 min in to the next funding period market moves into auction - Given time is updated to "2020-10-16T00:15:00Z" - And the mark price should be "11" for the market "ETH/DEC19" - # this spot price is not counted in external twap calclation because it was broadcast during auction - # if it did then the External spot price would be pushed to 11.625 or 11 since field type is int - # similarly the mark price woul dbe pushed to 12.125 - When the oracles broadcast data with block time signed with "0xCAFECAFE1": - | name | value | time offset | - | perp.ETH.value | 30000000000000000000 | -1s | - And the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | reference | - | aux2 | ETH/DEC19 | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | trigger-auction2 | - | aux | ETH/DEC19 | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | trigger-auction1 | - Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "ETH/DEC19" + # 4 min in to the next funding period + Given the network moves ahead "60" blocks + Then the product data for the market "ETH/DEC19" should be: + | internal twap | external twap | funding payment | + | 10750 | 9750 | 1000 | - ### 6 mins in Now we cancel the aux2 order, its served its purpose - Given the parties cancel the following orders: + # 5 min in to the next funding period, the auction period will start + Given the network moves ahead "60" blocks + Then the product data for the market "ETH/DEC19" should be: + | internal twap | external twap | funding payment | + | 10800 | 9800 | 1000 | + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux2 | ETH/DEC19 | buy | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | trigger-auction2 | + | aux | ETH/DEC19 | sell | 1 | 15 | 0 | TYPE_LIMIT | TIF_GTC | trigger-auction1 | + | party1 | ETH/DEC19 | buy | 10 | 9 | 0 | TYPE_LIMIT | TIF_GTC | | + | party2 | ETH/DEC19 | sell | 10 | 9 | 0 | TYPE_LIMIT | TIF_GTC | | + And the parties cancel the following orders: | party | reference | | aux | trigger-auction1 | | aux2 | trigger-auction2 | - When time is updated to "2020-10-16T00:16:00Z" - Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "ETH/DEC19" + Given the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | - | perp.ETH.value | 11000000000000000000 | -1s | - And the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "ETH/DEC19" + | perp.ETH.value | 30000000000000000000 | 0s | - # 7 mins in, the auction period will end - Given time is updated to "2020-10-16T00:17:01Z" - When the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC19" - Then the markets are updated: - | id | price monitoring | linear slippage factor | quadratic slippage factor | - | ETH/DEC19 | default-none | 0.25 | 0 | - And the parties place the following orders: - | party | market id | side | volume | price | resulting trades | type | tif | - | party1 | ETH/DEC19 | buy | 10 | 9 | 0 | TYPE_LIMIT | TIF_GTC | - | party2 | ETH/DEC19 | sell | 10 | 9 | 1 | TYPE_LIMIT | TIF_GTC | + ### 6 mins in, still in monitoring auction (fraction outside auction is 5/6, hence the funding payment ends up being 5/6*1000=~833) + Given the network moves ahead "60" blocks + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "ETH/DEC19" + Then the product data for the market "ETH/DEC19" should be: + | internal twap | external twap | funding payment | + | 10800 | 9800 | 833 | + Given the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | perp.ETH.value | 11000000000000000000 | 0s | + + # 7 mins in, the auction period will end (fraction outside auction is 5/7, hence the funding payment ends up being 5/7*1000=~714) + Given the network moves ahead "60" blocks + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "ETH/DEC19" + Then the product data for the market "ETH/DEC19" should be: + | internal twap | external twap | funding payment | + | 10800 | 9800 | 714 | + Then the network moves ahead "1" blocks - # 8 mins in, the auction period will end - Given time is updated to "2020-10-16T00:18:00Z" - When the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC19" - Then the parties place the following orders: + # 8 mins in, still in continuous trading (fraction outside auction is ~6/8, hence the funding payment ends up being 6/8*500=~374) + Given the network moves ahead "60" blocks + Then the product data for the market "ETH/DEC19" should be: + | internal twap | external twap | funding payment | + | 10500 | 10000 | 374 | + Given the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | | party1 | ETH/DEC19 | buy | 1 | 8 | 0 | TYPE_LIMIT | TIF_GTC | | party2 | ETH/DEC19 | sell | 1 | 8 | 1 | TYPE_LIMIT | TIF_GTC | And the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | - | perp.ETH.value | 8000000000000000000 | -1s | + | perp.ETH.value | 8000000000000000000 | 0s | - # 9 mins in, the auction period will end - Given time is updated to "2020-10-16T00:19:00Z" - Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + # 9 mins in, still in continuous trading (fraction outside auction is ~7/9, hence the funding payment ends up being 7/9*500=~332) + Given the network moves ahead "60" blocks + Then the product data for the market "ETH/DEC19" should be: + | internal twap | external twap | funding payment | + | 10142 | 9714 | 332 | + Given the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | - | perp.ETH.value | 14000000000000000000 | -1s | + | perp.ETH.value | 14000000000000000000 | 0s | - # 10 mins in, the auction period will end - Given time is updated to "2020-10-16T00:20:00Z" + # 10 mins in, still in continuous trading (fraction outside auction is ~8/10, hence the funding payment ends up being 8/10*375=~299) + Given the network moves ahead "60" blocks + Then the markets are updated: + | id | price monitoring | linear slippage factor | quadratic slippage factor | + | ETH/DEC19 | default-none | 0.25 | 0 | When the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | | party1 | ETH/DEC19 | buy | 1 | 30 | 0 | TYPE_LIMIT | TIF_GTC | | party2 | ETH/DEC19 | sell | 1 | 30 | 1 | TYPE_LIMIT | TIF_GTC | - # in theory internal TWAP = 9.625 external TWAP = 10.25 - # if the auction period is included then the internal TWAP = 10.1 and external TWAP = 11.2 - # but these are type int so the decimal is truncated Then the product data for the market "ETH/DEC19" should be: - | internal twap | external twap | - | 9 | 10 | - - - + | internal twap | external twap | funding payment | + | 9875 | 10250 | -299 | diff --git a/core/integration/features/settlement/0053-PERP-039.feature b/core/integration/features/settlement/0053-PERP-039.feature index c9644fb757f..4eab6eb5617 100644 --- a/core/integration/features/settlement/0053-PERP-039.feature +++ b/core/integration/features/settlement/0053-PERP-039.feature @@ -60,6 +60,10 @@ Feature: If a market insurance pool does not have enough funds to cover a fundin # back sure we end the block so we're in a new one after opening auction When the network moves ahead "1" blocks + Then the oracles broadcast data with block time signed with "0xCAFECAFE1": + | name | value | time offset | + | perp.ETH.value | 1000000000000000000000 | 0s | + When the parties place the following orders: | party | market id | side | volume | price | resulting trades | type | tif | @@ -80,9 +84,12 @@ Feature: If a market insurance pool does not have enough funds to cover a fundin When the network moves ahead "1" blocks And the mark price should be "1000" for the market "ETH/DEC19" + When time is updated to "2021-02-10T23:04:12Z" + Then system unix time is "1612998252" + When the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | - | perp.ETH.value | 1000000000000000000000 | 0s | + | perp.ETH.value | 6200000000000000000000 | 0s | | perp.funding.cue | 1612998252 | 0s | When the network moves ahead "4" blocks @@ -98,15 +105,15 @@ Feature: If a market insurance pool does not have enough funds to cover a fundin And the settlement account should have a balance of "0" for the market "ETH/DEC19" And the insurance pool balance should be "200" for the market "ETH/DEC19" When the network moves ahead "1" blocks - And the mark price should be "1200" for the market "ETH/DEC19" + When time is updated to "2021-08-12T11:04:12Z" + Then system unix time is "1628766252" + When the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | - | perp.ETH.value | 6200000000000000000000 | 0s | | perp.funding.cue | 1628766252 | 0s | - And the following funding period events should be emitted: | start | end | internal twap | external twap | funding payment | | 1612998252 | 1628766252 | 1200 | 6200 | -5000 | diff --git a/core/integration/features/settlement/0053-PERP-040.feature b/core/integration/features/settlement/0053-PERP-040.feature index 2b5a80faeb8..2de8f49b62e 100644 --- a/core/integration/features/settlement/0053-PERP-040.feature +++ b/core/integration/features/settlement/0053-PERP-040.feature @@ -61,18 +61,18 @@ Feature: Assert that the scaling factor is applied before the funding cap is app # send in external data to the perpetual market, it should not change anything and a MTM should not happen When the network moves ahead "1" blocks + Then system unix time is "1575072004" When the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | perp.ETH.value | 3000000000000000000000 | 0s | - | perp.funding.cue | 1612998252 | 0s | + | perp.funding.cue | 1575072004 | 0s | When the network moves ahead "6" blocks - + When the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | perp.ETH.value | 3000000000000000000000 | 0s | - | perp.funding.cue | 1628766252 | 0s | - + | perp.funding.cue | 1575072012 | 0s | # funding payments = s_twap * delta_t * interest_rate * fund rate scaling * dp = (3000-1200)*1*10.0*1000 = 18,000,000 # funding rate will be funding payment / s_twap = 18,000,000/(3,000*dp) = 6 # So having a lower/upper bound of -6/+6 will not change the result @@ -143,17 +143,18 @@ Feature: Assert that the scaling factor is applied before the funding cap is app # send in external data to the perpetual market, it should not change anything and a MTM should not happen When the network moves ahead "1" blocks - + Then system unix time is "1575072004" + When the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | perp.ETH.value | 3000000000000000000000 | 0s | - | perp.funding.cue | 1612998252 | 0s | + | perp.funding.cue | 1575072004 | 0s | When the network moves ahead "6" blocks When the oracles broadcast data with block time signed with "0xCAFECAFE1": | name | value | time offset | | perp.ETH.value | 3000000000000000000000 | 0s | - | perp.funding.cue | 1628766252 | 0s | + | perp.funding.cue | 1575072012 | 0s | # funding payments = s_twap * delta_t * interest_rate * fund rate scaling * dp = (3000-1200)*1*10.0*1000 = 18,000,000 # funding rate will be funding payment / s_twap = 18,000,000/(3,000*dp) = 6 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/spot/orders/0014-ORDT-163.feature b/core/integration/features/spot/orders/0014-ORDT-163.feature new file mode 100644 index 00000000000..7ec687b10ad --- /dev/null +++ b/core/integration/features/spot/orders/0014-ORDT-163.feature @@ -0,0 +1,109 @@ +Feature: stop order in spot market + + Background: + Given time is updated to "2024-01-01T00:00:00Z" + + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 1s | + | market.value.windowLength | 1h | + | spam.protection.max.stopOrdersPerMarket | 5 | + + Given the following assets are registered: + | id | decimal places | + | ETH | 2 | + | BTC | 2 | + + Given the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0 | 0 | + Given 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 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 360000 | 0.999 | 1 | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | decimal places | position decimal places | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | 2 | 2 | default-basic | + + # setup accounts + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 100 | + | party1 | BTC | 11 | + | party2 | ETH | 10000 | + | party2 | BTC | 10 | + | party3 | ETH | 10000 | + | party3 | BTC | 1000 | + | party4 | BTC | 1000 | + | party5 | BTC | 1000 | + And the average block duration is "1" + + # Place some orders to get out of auction + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GFA | + | party4 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + And the opening auction period ends for market "BTC/ETH" + When the network moves ahead "1" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "1000" for the market "BTC/ETH" + + Scenario:0014-ORDT-163, 0014-ORDT-164: A wrapped buy/sell order will be rejected when triggered if the party doesn't have enough of the required quote asset to cover the order. + + # place an order to match with the limit order then check the stop is filled + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party4 | BTC/ETH | sell | 50 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | p4-sell | + + # create party1 stop order + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | error | reference | + | party1 | BTC/ETH | buy | 50 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | | 1005 | | stop1 | + + # now we trade at 1005, this will breach the trigger + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | buy | 1 | 1005 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | BTC/ETH | sell | 1 | 1005 | 1 | TYPE_LIMIT | TIF_GTC | + + # check that the order was triggered + Then the stop orders should have the following states + | party | market id | status | reference | + | party1 | BTC/ETH | STATUS_TRIGGERED | stop1 | + + Then "party1" should have general account balance of "100" for asset "ETH" + Then "party1" should have general account balance of "11" for asset "BTC" + + And the parties cancel the following orders: + | party | reference | + | party4 | p4-sell | + + # place an order to match with the limit order then check the stop is filled + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | BTC/ETH | buy | 50 | 1015 | 0 | TYPE_LIMIT | TIF_GTC | p4-sell | + + # create party2 stop order + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | only | ra price trigger | error | reference | + | party2 | BTC/ETH | sell | 50 | 1015 | 0 | TYPE_LIMIT | TIF_GTC | | 1020 | | stop2 | + + # now we trade at 1005, this will breach the trigger + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party3 | BTC/ETH | buy | 1 | 1020 | 0 | TYPE_LIMIT | TIF_GTC | + | party4 | BTC/ETH | sell | 1 | 1020 | 1 | TYPE_LIMIT | TIF_GTC | + + # check that the order was triggered + Then the stop orders should have the following states + | party | market id | status | reference | + | party2 | BTC/ETH | STATUS_TRIGGERED | stop2 | + + Then "party2" should have general account balance of "10000" for asset "ETH" + Then "party2" should have general account balance of "10" for asset "BTC" + + diff --git a/core/integration/features/spot/orders/0032-PRIM-033.feature b/core/integration/features/spot/orders/0032-PRIM-033.feature new file mode 100644 index 00000000000..d0ade166939 --- /dev/null +++ b/core/integration/features/spot/orders/0032-PRIM-033.feature @@ -0,0 +1,112 @@ +Feature: Spot market + + Background: + Given time is updated to "2024-01-01T00:00:00Z" + + Given the following network parameters are set: + | name | value | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.value.windowLength | 1h | + + Given the following assets are registered: + | id | decimal places | + | ETH | 2 | + | BTC | 2 | + + Given the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.01 | 0.03 | + Given 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 | + + Given the log normal risk model named "lognormal-risk-model-2": + | risk aversion | tau | mu | r | sigma | + | 0.002 | 0.02 | 0 | 0.1 | 1.3 | + + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 30 | 0.999 | 10 | + | 60 | 0.999 | 20 | + | 90 | 0.999 | 40 | + | 120 | 0.999 | 80 | + + And the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | decimal places | position decimal places | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | lognormal-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | 2 | 2 | default-basic | + + # setup accounts + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000 | + | party1 | BTC | 1000 | + | party2 | ETH | 10000 | + | party4 | BTC | 1000 | + | party5 | BTC | 1000 | + And the average block duration is "1" + + # Place some orders to get out of auction + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | party1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GFA | + | party5 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + + And the opening auction period ends for market "BTC/ETH" + When the network moves ahead "1" blocks + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "1000" for the market "BTC/ETH" + + Scenario: When market is in price monitoring auction, change of a risk model or any of its parameters doesn't affect the previously + calculated auction end time, any remaining price monitoring bounds cannot extend the auction further. Upon uncrossing + price monitoring bounds get reset using the updated parameter values. (0032-PRIM-033) + + # Check that the market price bounds are set + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | auction start | auction end | + | 1000 | TRADING_MODE_CONTINUOUS | 30 | 997 | 1003 | 0 | 0 | 0 | 0 | 0 | + | 1000 | TRADING_MODE_CONTINUOUS | 60 | 995 | 1005 | 0 | 0 | 0 | 0 | 0 | + | 1000 | TRADING_MODE_CONTINUOUS | 90 | 994 | 1006 | 0 | 0 | 0 | 0 | 0 | + | 1000 | TRADING_MODE_CONTINUOUS | 120 | 993 | 1007 | 0 | 0 | 0 | 0 | 0 | + + # Place 2 persistent orders that are outside all of the price bounds + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | 1 | 1008 | 0 | TYPE_LIMIT | TIF_GTC | buy1 | + | party5 | BTC/ETH | sell | 1 | 1008 | 0 | TYPE_LIMIT | TIF_GTC | sell1 | + When the network moves ahead "1" blocks + + # Check we have been placed in auction + Then the trading mode should be "TRADING_MODE_MONITORING_AUCTION" for the market "BTC/ETH" + + # Check we know the auction time + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | auction start | auction end | + | 1000 | TRADING_MODE_MONITORING_AUCTION | 60 | 995 | 1005 | 0 | 0 | 0 | 1704067203000000000 | 1704067213000000000 | + | 1000 | TRADING_MODE_MONITORING_AUCTION | 90 | 994 | 1006 | 0 | 0 | 0 | 1704067203000000000 | 1704067213000000000 | + | 1000 | TRADING_MODE_MONITORING_AUCTION | 120 | 993 | 1007 | 0 | 0 | 0 | 1704067203000000000 | 1704067213000000000 | + + # Now update the risk model to deactivate all pending price bounds + Then the spot markets are updated: + | id | risk model | + | BTC/ETH | lognormal-risk-model-2 | + + # If we move ahead 25 blocks we should come out of auction instead of it being extended + When the network moves ahead "25" blocks + + And the market data for the market "BTC/ETH" should be: + | mark price | trading mode | horizon | min bound | max bound | target stake | supplied stake | open interest | auction start | auction end | + | 1008 | TRADING_MODE_CONTINUOUS | 30 | 1004 | 1012 | 0 | 0 | 0 | 0 | 0 | + | 1008 | TRADING_MODE_CONTINUOUS | 60 | 1003 | 1013 | 0 | 0 | 0 | 0 | 0 | + | 1008 | TRADING_MODE_CONTINUOUS | 90 | 1001 | 1015 | 0 | 0 | 0 | 0 | 0 | + | 1008 | TRADING_MODE_CONTINUOUS | 120 | 1000 | 1016 | 0 | 0 | 0 | 0 | 0 | + + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + # The mark price should show the orders have traded + And the mark price should be "1008" for the market "BTC/ETH" + + And the orders should have the following states: + | party | market id | reference | side | volume | remaining | price | status | + | party1 | BTC/ETH | buy1 | buy | 1 | 0 | 1008 | STATUS_FILLED | + | party5 | BTC/ETH | sell1 | sell | 1 | 0 | 1008 | STATUS_FILLED | + diff --git a/core/integration/features/spot/orders/0037-OPEG-023.feature b/core/integration/features/spot/orders/0037-OPEG-023.feature new file mode 100644 index 00000000000..71f64c9ce4c --- /dev/null +++ b/core/integration/features/spot/orders/0037-OPEG-023.feature @@ -0,0 +1,91 @@ + +Feature: 0001 tick size should be using market decimal, A pegged order specifying an offset which is not an integer multiple of the markets tick size should be rejected. + + Background: + Given the following network parameters are set: + | name | value | + | market.liquidity.bondPenaltyParameter | 1 | + | network.markPriceUpdateMaximumFrequency | 0s | + | limits.markets.maxPeggedOrders | 6 | + | validators.epoch.length | 5s | + | market.liquidity.earlyExitPenalty | 0.25 | + | market.liquidity.stakeToCcyVolume | 1.0 | + | market.liquidity.sla.nonPerformanceBondPenaltySlope | 0.19 | + | market.liquidity.sla.nonPerformanceBondPenaltyMax | 1 | + + And the liquidity monitoring parameters: + | name | triggering ratio | time window | scaling factor | + | lqm-params | 0.1 | 24h | 1 | + + And the following assets are registered: + | id | decimal places | + | ETH | 1 | + | BTC | 1 | + + And the average block duration is "1" + And the simple risk model named "simple-risk-model-1": + | long | short | max move up | min move down | probability of trading | + | 0.1 | 0.1 | 60 | 50 | 0.2 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0 | 0 | + And the price monitoring named "price-monitoring-1": + | horizon | probability | auction extension | + | 1 | 0.99 | 5 | + And the liquidity sla params named "SLA": + | price range | commitment min time fraction | performance hysteresis epochs | sla competition factor | + | 0.01 | 0.5 | 1 | 1.0 | + + Scenario: + #0037-OPEG-023:Given a market with non-zero market and asset decimals where the asset decimals are strictly less than the market decimals (yielding a negative price factor). A pegged order specifying an offset which is not an integer multiple of the markets tick size should be rejected. + #0037-OPEG-024:Given a market with non-zero market and asset decimals where the asset decimals are equal to the market decimals (yielding a negative price factor). A pegged order specifying an offset which is not an integer multiple of the markets tick size should be rejected. + #0037-OPEG-027:Given a market with non-zero market and asset decimals where the asset decimals are strictly more than the market decimals (yielding a negative price factor). A pegged order specifying an offset which is not an integer multiple of the markets tick size should be rejected. + And the spot markets: + | id | name | quote asset | base asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | decimal places | tick size | + | ETH/DEC21 | BTC/ETH | BTC | ETH | lqm-params | simple-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | default-basic | 2 | 10 | + | ETH/DEC22 | BTC/ETH | BTC | ETH | lqm-params | simple-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | default-basic | 2 | 5 | + | ETH/DEC23 | BTC/ETH | BTC | ETH | lqm-params | simple-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | default-basic | 1 | 5 | + | ETH/DEC24 | BTC/ETH | BTC | ETH | lqm-params | simple-risk-model-1 | 1 | fees-config-1 | price-monitoring-1 | default-basic | 0 | 10 | + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 1000000000000 | + | party1 | BTC | 1000 | + | party3 | ETH | 1000000 | + | party4 | ETH | 1000000 | + And the average block duration is "1" + + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | error | + | party3 | ETH/DEC21 | buy | 100 | 101 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | OrderError: price not in tick size | + | party3 | ETH/DEC21 | buy | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | OrderError: price not in tick size | + | party4 | ETH/DEC21 | sell | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p4s2-1 | OrderError: price not in tick size | + | party4 | ETH/DEC21 | sell | 1000 | 191 | 0 | TYPE_LIMIT | TIF_GTC | p4s1-1 | OrderError: price not in tick size | + | party3 | ETH/DEC22 | buy | 100 | 101 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-2 | OrderError: price not in tick size | + | party3 | ETH/DEC22 | buy | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-2 | OrderError: price not in tick size | + | party4 | ETH/DEC22 | sell | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p4s2-2 | OrderError: price not in tick size | + | party4 | ETH/DEC22 | sell | 1000 | 191 | 0 | TYPE_LIMIT | TIF_GTC | p4s1-2 | OrderError: price not in tick size | + | party3 | ETH/DEC23 | buy | 100 | 101 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-3 | OrderError: price not in tick size | + | party3 | ETH/DEC23 | buy | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-3 | OrderError: price not in tick size | + | party4 | ETH/DEC23 | sell | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p4s2-3 | OrderError: price not in tick size | + | party4 | ETH/DEC23 | sell | 1000 | 191 | 0 | TYPE_LIMIT | TIF_GTC | p4s1-3 | OrderError: price not in tick size | + | party3 | ETH/DEC24 | buy | 100 | 101 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-4 | OrderError: price not in tick size | + | party3 | ETH/DEC24 | buy | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-4 | OrderError: price not in tick size | + | party4 | ETH/DEC24 | sell | 10 | 111 | 0 | TYPE_LIMIT | TIF_GTC | p4s2-4 | OrderError: price not in tick size | + | party4 | ETH/DEC24 | sell | 1000 | 191 | 0 | TYPE_LIMIT | TIF_GTC | p4s1-4 | OrderError: price not in tick size | + + Then the network moves ahead "2" blocks + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/DEC21" + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/DEC22" + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/DEC23" + And the trading mode should be "TRADING_MODE_OPENING_AUCTION" for the market "ETH/DEC24" + + And the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | error | + | party1 | ETH/DEC21 | 10 | 5 | buy | MID | 10 | 10 | peg-buy-1 | | + | party1 | ETH/DEC21 | 10 | 5 | sell | MID | 20 | 20 | peg-buy-2 | | + | party1 | ETH/DEC21 | 10 | 5 | buy | MID | 20 | 100 | peg-buy-3 | | + | party1 | ETH/DEC21 | 10 | 5 | sell | MID | 20 | 2 | peg-buy-4 | OrderError: price not in tick size | + | party1 | ETH/DEC21 | 10 | 5 | buy | MID | 20 | 5 | peg-buy-5 | OrderError: price not in tick size | + | party1 | ETH/DEC22 | 10 | 5 | buy | MID | 20 | 15 | peg-buy-6 | | + | party1 | ETH/DEC23 | 10 | 5 | sell | MID | 20 | 6 | peg-buy-7 | OrderError: price not in tick size | + | party1 | ETH/DEC24 | 10 | 5 | buy | MID | 20 | 17 | peg-buy-8 | OrderError: price not in tick size | diff --git a/core/integration/features/spots/SpotFunctionalTests/spot-decimal-positions-2.feature b/core/integration/features/spots/SpotFunctionalTests/spot-decimal-positions-2.feature new file mode 100644 index 00000000000..dd76b46f6ee --- /dev/null +++ b/core/integration/features/spots/SpotFunctionalTests/spot-decimal-positions-2.feature @@ -0,0 +1,96 @@ +Feature: Simple Spot Order between two parties match successfully + Background: + Given the following assets are registered: + | id | decimal places | + | ETH | 5 | + | BTC | 5 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.002 | + And the simple risk model named "my-simple-risk-model": + | long | short | max move up | min move down | probability of trading | + | 0.08628781058136630000 | 0.09370922348428490000 | -1 | -1 | 0.2 | + And the fees configuration named "my-fees-config": + | maker fee | infrastructure fee | + | 0.004 | 0.001 | + And the following network parameters are set: + | name | value | + | market.fee.factors.makerFee | 0.001 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.auction.minimumDuration | 1 | + | validators.epoch.length | 60s | + | limits.markets.maxPeggedOrders | 4 | + | referralProgram.minStakedVegaTokens | 0 | + + @SDP + Scenario Outline: Simple Spot Order matches with counter party using different combinations of decimal places. + + Given the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | decimal places | position decimal places | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | my-simple-risk-model | 1 | fees-config-1 | default-none | | | default-basic | + # setup accounts + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000000 | + | party2 | BTC | 10000000 | + | party3 | ETH | 10000000 | + | party4 | BTC | 10000000 | + # place orders and generate trades + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | | | 0 | TYPE_LIMIT | TIF_GFA | t1-b-1111 | + | party2 | BTC/ETH | sell | | | 0 | TYPE_LIMIT | TIF_GTC | t2-s-1111 | + + Then "party2" should have holding account balance of "100000" for asset "BTC" + And "party1" should have holding account balance of "1000000" for asset "ETH" + + And the orders should have the following states: + | party | market id | side | volume | remaining | price | status | + | party1 | BTC/ETH | buy | | | | STATUS_ACTIVE | + | party2 | BTC/ETH | sell | | | | STATUS_ACTIVE | + + When the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "" for the market "BTC/ETH" + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | | | party2 | + And "party2" should have holding account balance of "0" for asset "BTC" + And "party1" should have holding account balance of "0" for asset "ETH" + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | BTC/ETH | buy | | | 0 | TYPE_LIMIT | TIF_GTC | p3-b-1 | + | party4 | BTC/ETH | sell | | | 1 | TYPE_LIMIT | TIF_GTC | p4-s-1 | + And the network moves ahead "1" blocks + Then the following trades should be executed: + | buyer | price | size | seller | + | party3 | | | party4 | + And the mark price should be "" for the market "BTC/ETH" + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | type | + | party4 | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_FEES_MAKER | BTC/ETH | | ETH | TRANSFER_TYPE_MAKER_FEE_PAY | + | party4 | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | BTC/ETH | | ETH | TRANSFER_TYPE_INFRASTRUCTURE_FEE_PAY | + | party4 | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | | ETH | TRANSFER_TYPE_LIQUIDITY_FEE_PAY | + | | ACCOUNT_TYPE_FEES_MAKER | party3 | ACCOUNT_TYPE_GENERAL | BTC/ETH | | ETH | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + # A bunch of possible position/market decimal combinations possible + Examples: + | ETH decimals | BTC decimals | volume | price | mark price | volume2 | price2 | mark price 2 | maker fee | infra fee | liquidity fee | receive fee | + | 1 | 2 | 100 | 100 | 100 | 10 | 11 | 11 | 11 | 22 | 0 | 11 | + | 2 | 1 | 10 | 1000 | 1000 | 1 | 110 | 110 | 11 | 22 | 0 | 11 | + | 3 | 2 | 100 | 10000 | 10000 | 10 | 11000 | 11000 | 110 | 220 | 0 | 110 | + | 4 | 1 | 10 | 100000 | 100000 | 1 | 110000 | 110000 | 110 | 220 | 0 | 110 | + | 5 | 0 | 1 | 1000000 | 1000000 | 1 | 100000 | 100000 | 100 | 200 | 0 | 100 | + | 0 | 0 | 1 | 10 | 10 | 1 | 11 | 11 | 1100 | 2200 | 0 | 1100 | + | 0 | 5 | 100000 | 10 | 10 | 10000 | 1 | 1 | 10 | 20 | 0 | 10 | + | 1 | 4 | 10000 | 100 | 100 | 1000 | 110 | 110 | 110 | 220 | 0 | 110 | + | 2 | 3 | 1000 | 1000 | 1000 | 100 | 1100 | 1100 | 110 | 220 | 0 | 110 | + | 3 | 2 | 100 | 10000 | 10000 | 10 | 11000 | 11000 | 110 | 220 | 0 | 110 | + | 4 | 1 | 10 | 100000 | 100000 | 10 | 11000 | 11000 | 110 | 220 | 0 | 110 | + | 2 | 0 | 1 | 1000 | 1000 | 1 | 110 | 110 | 110 | 220 | 0 | 110 | + | 3 | 0 | 1 | 10000 | 10000 | 1 | 11000 | 11000 | 1100 | 2200 | 0 | 1100 | + | 3 | 3 | 1000 | 10000 | 10000 | 1000 | 11000 | 11000 | 1100 | 2200 | 0 | 1100 | + | 0 | 0 | 1 | 10 | 10 | 2 | 11 | 11 | 2200 | 4400 | 0 | 2200 | + | 3 | 0 | 1 | 10000 | 10000 | 2 | 11000 | 11000 | 2200 | 4400 | 0 | 2200 | + | 0 | 5 | 100000 | 10 | 10 | 2 | 1 | 1 | 1 | 1 | 0 | 1 | + | 1 | 1 | 10 | 100 | 100 | 1 | 110 | 110 | 110 | 220 | 0 | 110 | diff --git a/core/integration/features/spots/SpotFunctionalTests/spot-decimal-positions.feature b/core/integration/features/spots/SpotFunctionalTests/spot-decimal-positions.feature new file mode 100644 index 00000000000..9930076f605 --- /dev/null +++ b/core/integration/features/spots/SpotFunctionalTests/spot-decimal-positions.feature @@ -0,0 +1,84 @@ +Feature: Simple Spot Order between two parties match successfully + Background: + Given the following assets are registered: + | id | decimal places | + | ETH | 3 | + | BTC | 5 | + And the fees configuration named "fees-config-1": + | maker fee | infrastructure fee | + | 0.005 | 0.002 | + And the simple risk model named "my-simple-risk-model": + | long | short | max move up | min move down | probability of trading | + | 0.08628781058136630000 | 0.09370922348428490000 | -1 | -1 | 0.2 | + And the fees configuration named "my-fees-config": + | maker fee | infrastructure fee | + | 0.004 | 0.001 | + And the following network parameters are set: + | name | value | + | market.fee.factors.makerFee | 0.001 | + | network.markPriceUpdateMaximumFrequency | 0s | + | market.auction.minimumDuration | 1 | + | validators.epoch.length | 60s | + | limits.markets.maxPeggedOrders | 4 | + | referralProgram.minStakedVegaTokens | 0 | + + @SDP2 + Scenario Outline: Simple Spot Order matches with counter party using different combinations of decimal places. + + Given the spot markets: + | id | name | base asset | quote asset | risk model | auction duration | fees | price monitoring | decimal places | position decimal places | sla params | + | BTC/ETH | BTC/ETH | BTC | ETH | my-simple-risk-model | 1 | fees-config-1 | default-none | | | default-basic | + # setup accounts + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | party1 | ETH | 10000000 | + | party2 | BTC | 10000000 | + | party3 | ETH | 10000000 | + | party4 | BTC | 10000000 | + # place orders and generate trades + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party1 | BTC/ETH | buy | | | 0 | TYPE_LIMIT | TIF_GFA | t1-b-1111 | + | party2 | BTC/ETH | sell | | | 0 | TYPE_LIMIT | TIF_GTC | t2-s-1111 | + + Then "party2" should have holding account balance of "100000" for asset "BTC" + And "party1" should have holding account balance of "10000" for asset "ETH" + + And the orders should have the following states: + | party | market id | side | volume | remaining | price | status | + | party1 | BTC/ETH | buy | | | | STATUS_ACTIVE | + | party2 | BTC/ETH | sell | | | | STATUS_ACTIVE | + + When the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + And the mark price should be "" for the market "BTC/ETH" + + And the following trades should be executed: + | buyer | price | size | seller | + | party1 | | | party2 | + And "party2" should have holding account balance of "0" for asset "BTC" + And "party1" should have holding account balance of "0" for asset "ETH" + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | party3 | BTC/ETH | buy | | | 0 | TYPE_LIMIT | TIF_GTC | p3-b-1 | + | party4 | BTC/ETH | sell | | | 1 | TYPE_LIMIT | TIF_GTC | p4-s-1 | + And the network moves ahead "1" blocks + Then the following trades should be executed: + | buyer | price | size | seller | + | party3 | | | party4 | + And the mark price should be "" for the market "BTC/ETH" + And the following transfers should happen: + | from | from account | to | to account | market id | amount | asset | type | + | party4 | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_FEES_MAKER | BTC/ETH | | ETH | TRANSFER_TYPE_MAKER_FEE_PAY | + | party4 | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_FEES_INFRASTRUCTURE | BTC/ETH | | ETH | TRANSFER_TYPE_INFRASTRUCTURE_FEE_PAY | + | party4 | ACCOUNT_TYPE_GENERAL | | ACCOUNT_TYPE_FEES_LIQUIDITY | BTC/ETH | | ETH | TRANSFER_TYPE_LIQUIDITY_FEE_PAY | + | | ACCOUNT_TYPE_FEES_MAKER | party3 | ACCOUNT_TYPE_GENERAL | BTC/ETH | | ETH | TRANSFER_TYPE_MAKER_FEE_RECEIVE | + # Some permutations of position/market decimals within the possible ranges. + Examples: + | ETH decimals | BTC decimals | volume | price | mark price | volume2 | price2 | mark price 2 | maker fee | infra fee | liquidity fee | receive fee | + | 2 | 1 | 10 | 1000 | 1000 | 1 | 110 | 110 | 1 | 1 | 0 | 1 | + | 1 | 1 | 10 | 100 | 100 | 10 | 110 | 110 | 11 | 22 | 0 | 11 | + | 1 | 2 | 100 | 100 | 100 | 10 | 11 | 11 | 1 | 1 | 0 | 1 | + | 3 | 0 | 1 | 10000 | 10000 | 1 | 11000 | 11000 | 11 | 22 | 0 | 11 | + | 0 | 3 | 1000 | 10 | 10 | 2000 | 11 | 11 | 22 | 44 | 0 | 22 | + | 0 | 0 | 1 | 10 | 10 | 1 | 11 | 11 | 11 | 22 | 0 | 11 | 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/features/verified/fees_from_margin.feature b/core/integration/features/verified/fees_from_margin.feature new file mode 100644 index 00000000000..72ea8058568 --- /dev/null +++ b/core/integration/features/verified/fees_from_margin.feature @@ -0,0 +1,185 @@ +Feature: Over leveraged trader can pay fees with released margin + + Ticket #2010 (https://github.com/vegaprotocol/specs/issues/2010) + states a party should be able to cover any expected fees when + reducing their position with a zero balance in their general + account. + + Test checks this is true for the following combinations: + - long and shorts positions + - market and limit orders + - exit price above and below the mark price at exit + + + Background: + + # Initialise the network + And the average block duration is "1" + And the following network parameters are set: + | name | value | + | market.fee.factors.makerFee | 0.00 | + | market.fee.factors.infrastructureFee | 0.01 | + | network.markPriceUpdateMaximumFrequency | 0s | + + # Initialise the market + And the following assets are registered: + | id | decimal places | quantum | + | USD-1-10 | 0 | 1 | + And the simple risk model named "simple-risk-model": + | long | short | max move up | min move down | probability of trading | + | 0.1 | 0.1 | 100 | -100 | 0.1 | + And the markets: + | id | quote name | asset | risk model | margin calculator | auction duration | fees | price monitoring | data source config | linear slippage factor | quadratic slippage factor | sla params | decimal places | position decimal places | + | ETH/USD-1-10 | ETH | USD-1-10 | simple-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 0 | 0 | default-futures | 0 | 0 | + + # Initialise the parties + Given the parties deposit on asset's general account the following amount: + | party | asset | amount | + | aux1 | USD-1-10 | 1000000 | + | aux2 | USD-1-10 | 1000000 | + | trader | USD-1-10 | 1250 | + + # Exit opening auctions + When the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USD-1-10 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + And the opening auction period ends for market "ETH/USD-1-10" + And the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/USD-1-10" + + + Scenario Outline: With no funds in the general account, reducing long position with a limit order at various prices + + # Open a position + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | trader | ETH/USD-1-10 | buy | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USD-1-10 | sell | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | trader | 10 | 0 | 0 | + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | trader | USD-1-10 | ETH/USD-1-10 | 1200 | 50 | + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | + | trader | ETH/USD-1-10 | 1000 | 1100 | 1200 | 1400 | + + # Empty general account + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | buy | 1 | 975 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USD-1-10 | sell | 1 | 975 | 1 | TYPE_LIMIT | TIF_GTC | + When the network moves ahead "1" blocks + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | trader | USD-1-10 | ETH/USD-1-10 | 1000 | 0 | + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | + | trader | ETH/USD-1-10 | 975 | 1072 | 1170 | 1365 | + + # Attempt to reduce position + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | ETH/USD-1-10 | buy | | | 0 | TYPE_LIMIT | TIF_GTC | + | trader | ETH/USD-1-10 | sell | | | 1 | | TIF_IOC | + When the network moves ahead "1" blocks + And the following trades should be executed: + | buyer | price | size | seller | seller fee | + | aux2 | | | trader | | + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | trader | USD-1-10 | ETH/USD-1-10 | | | + + Examples: + # Table contains inputs for the trade reducing the over leveraged + # position and the resulting account balances. + | size | price | fee | margin | general | type | + | 1 | 950 | 10 | 0 | 0 | TYPE_LIMIT | + | 9 | 950 | 86 | 114 | 550 | TYPE_LIMIT | + | 10 | 970 | 97 | 0 | 853 | TYPE_LIMIT | + | 1 | 975 | 10 | 990 | 0 | TYPE_LIMIT | + | 9 | 975 | 88 | 117 | 795 | TYPE_LIMIT | + | 10 | 975 | 98 | 0 | 902 | TYPE_LIMIT | + | 1 | 1000 | 10 | 1240 | 0 | TYPE_LIMIT | + | 9 | 1000 | 90 | 120 | 1040 | TYPE_LIMIT | + | 10 | 1000 | 100 | 0 | 1150 | TYPE_LIMIT | + | 1 | 950 | 10 | 0 | 0 | TYPE_MARKET | + | 9 | 950 | 86 | 114 | 550 | TYPE_MARKET | + | 10 | 970 | 97 | 0 | 853 | TYPE_MARKET | + | 1 | 975 | 10 | 990 | 0 | TYPE_MARKET | + | 9 | 975 | 88 | 117 | 795 | TYPE_MARKET | + | 10 | 975 | 98 | 0 | 902 | TYPE_MARKET | + | 1 | 1000 | 10 | 1240 | 0 | TYPE_MARKET | + | 9 | 1000 | 90 | 120 | 1040 | TYPE_MARKET | + | 10 | 1000 | 100 | 0 | 1150 | TYPE_MARKET | + + + Scenario Outline: With no funds in the general account, reducing short position with a limit order at various prices + + # Open a position + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | trader | ETH/USD-1-10 | sell | 10 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USD-1-10 | buy | 10 | 1000 | 1 | TYPE_LIMIT | TIF_GTC | + When the network moves ahead "1" blocks + Then the parties should have the following profit and loss: + | party | volume | unrealised pnl | realised pnl | + | trader | -10 | 0 | 0 | + And the parties should have the following account balances: + | party | asset | market id | margin | general |e + | trader | USD-1-10 | ETH/USD-1-10 | 1200 | 50 | + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | + | trader | ETH/USD-1-10 | 1000 | 1100 | 1200 | 1400 | + + # Empty general account + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux1 | ETH/USD-1-10 | buy | 1 | 1020 | 0 | TYPE_LIMIT | TIF_GTC | + | aux2 | ETH/USD-1-10 | sell | 1 | 1020 | 1 | TYPE_LIMIT | TIF_GTC | + When the network moves ahead "1" blocks + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | trader | USD-1-10 | ETH/USD-1-10 | 1050 | 0 | + And the parties should have the following margin levels: + | party | market id | maintenance | search | initial | release | + | trader | ETH/USD-1-10 | 1020 | 1122 | 1224 | 1428 | + + # Attempt to reduce position + Given the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | + | aux2 | ETH/USD-1-10 | sell | | | 0 | TYPE_LIMIT | TIF_GTC | + | trader | ETH/USD-1-10 | buy | | | 1 | | TIF_IOC | + When the network moves ahead "1" blocks + Then debug trades + And the following trades should be executed: + | buyer | price | size | seller | buyer fee | + | trader | | | aux2 | | + And the parties should have the following account balances: + | party | asset | market id | margin | general | + | trader | USD-1-10 | ETH/USD-1-10 | | | + + Examples: + # Table contains inputs for the trade reducing the over leveraged + # position and the resulting account balances. + | size | price | fee | margin | general | type | + | 1 | 1040 | 11 | 0 | 0 | TYPE_LIMIT | + | 9 | 1040 | 94 | 124 | 632 | TYPE_LIMIT | + | 10 | 1040 | 104 | 0 | 746 | TYPE_LIMIT | + | 1 | 1020 | 11 | 1039 | 0 | TYPE_LIMIT | + | 9 | 1020 | 92 | 122 | 836 | TYPE_LIMIT | + | 10 | 1020 | 102 | 0 | 948 | TYPE_LIMIT | + | 1 | 1000 | 10 | 1240 | 0 | TYPE_LIMIT | + | 9 | 1000 | 90 | 120 | 1040 | TYPE_LIMIT | + | 10 | 1000 | 100 | 0 | 1150 | TYPE_LIMIT | + | 1 | 1040 | 11 | 0 | 0 | TYPE_MARKET | + | 9 | 1040 | 94 | 124 | 632 | TYPE_MARKET | + | 10 | 1040 | 104 | 0 | 746 | TYPE_MARKET | + | 1 | 1020 | 11 | 1039 | 0 | TYPE_MARKET | + | 9 | 1020 | 92 | 122 | 836 | TYPE_MARKET | + | 10 | 1020 | 102 | 0 | 948 | TYPE_MARKET | + | 1 | 1000 | 10 | 1240 | 0 | TYPE_MARKET | + | 9 | 1000 | 90 | 120 | 1040 | TYPE_MARKET | + | 10 | 1000 | 100 | 0 | 1150 | TYPE_MARKET | \ No newline at end of file diff --git a/core/integration/features/verified/pegged_orders.feature b/core/integration/features/verified/pegged_orders.feature new file mode 100644 index 00000000000..a99abf2d611 --- /dev/null +++ b/core/integration/features/verified/pegged_orders.feature @@ -0,0 +1,165 @@ + +Feature: Pegged orders do not cross + + Aiming for full coverage of edge-cases, check the following for both + derivative and spot markets: + + - Market decimals > asset decimals + - Market decimals < asset decimals + + - For each of the above + - tick size cannot be expressed in asset decimals + - tick size can just be expressed in asset decimals + - tick size can be expressed in asset decimals + + - For each of the above + - offset cannot be expressed in asset decimals + - offset can just be expressed in asset decimals + - offset can be expressed in asset decimals + + Background: + + Given the average block duration is "1" + And the following assets are registered: + | id | decimal places | quantum | + | ETH.1.10 | 1 | 1 | + | BTC.1.10 | 1 | 1 | + + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 6 | + + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | aux1 | ETH.1.10 | 1000000000000000 | + | aux2 | ETH.1.10 | 1000000000000000 | + | party1 | ETH.1.10 | 1000000000000000 | + | party2 | ETH.1.10 | 1000000000000000 | + | aux1 | BTC.1.10 | 1000000000000000 | + | aux2 | BTC.1.10 | 1000000000000000 | + | party1 | BTC.1.10 | 1000000000000000 | + | party2 | BTC.1.10 | 1000000000000000 | + + Scenario Outline: Derivative markets - market decimals > asset decimals + + Given 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 | decimal places | tick size | + | ETH.1.10/DEC21 | ETH.1.10 | ETH.1.10 | default-parameters | default-simple-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 0.5 | 0 | default-basic | 2 | | + Given the parties place the following pegged orders: + | party | market id | side | pegged reference | volume | offset | reference | error | + | party1 | ETH.1.10/DEC21 | buy | MID | 10 | | peg-buy | | + | party2 | ETH.1.10/DEC21 | sell | MID | 10 | | peg-sell | | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH.1.10/DEC21 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux1 | ETH.1.10/DEC21 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux2 | ETH.1.10/DEC21 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + | aux2 | ETH.1.10/DEC21 | sell | 1 | | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + When the opening auction period ends for market "ETH.1.10/DEC21" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH.1.10/DEC21" + + Examples: + | bo | tick size | offset | error | + | 1010 | 1 | 1 | invalid offset - pegged mid will cross | + | 1010 | 1 | 10 | | + | 1010 | 1 | 100 | | + | 1010 | 10 | 1 | OrderError: price not in tick size | + | 1010 | 10 | 10 | | + | 1010 | 10 | 100 | | + | 1100 | 100 | 1 | OrderError: price not in tick size | + | 1100 | 100 | 10 | OrderError: price not in tick size | + | 1100 | 100 | 100 | | + + + Scenario Outline: Derivative markets - market decimals < asset decimals + + Given 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 | decimal places | tick size | + | ETH.1.10/DEC21 | ETH.1.10 | ETH.1.10 | default-parameters | default-simple-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 0.5 | 0 | default-basic | 0 | | + Given the parties place the following pegged orders: + | party | market id | side | pegged reference | volume | offset | reference | error | + | party1 | ETH.1.10/DEC21 | buy | MID | 10 | | peg-buy | | + | party2 | ETH.1.10/DEC21 | sell | MID | 10 | | peg-sell | | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH.1.10/DEC21 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux1 | ETH.1.10/DEC21 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux2 | ETH.1.10/DEC21 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + | aux2 | ETH.1.10/DEC21 | sell | 1 | | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + When the opening auction period ends for market "ETH.1.10/DEC21" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH.1.10/DEC21" + + Examples: + | bo | tick size | offset | error | + | 1001 | 1 | 1 | | + | 1001 | 1 | 10 | | + | 1001 | 1 | 100 | | + | 1010 | 10 | 1 | OrderError: price not in tick size | + | 1010 | 10 | 10 | | + | 1010 | 10 | 100 | | + | 1100 | 100 | 1 | OrderError: price not in tick size | + | 1100 | 100 | 10 | OrderError: price not in tick size | + | 1100 | 100 | 100 | | + + + Scenario Outline: Spot market - market decimals > asset decimals + + Given the spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | decimal places | tick size | + | BTC/ETH | BTC/ETH | BTC.1.10 | ETH.1.10 | default-parameters | default-simple-risk-model | 1 | default-none | default-none | default-basic | 2 | | + Given the parties place the following pegged orders: + | party | market id | side | pegged reference | volume | offset | reference | error | + | party1 | BTC/ETH | buy | MID | 10 | | peg-buy | | + | party2 | BTC/ETH | sell | MID | 10 | | peg-sell | | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux2 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + | aux2 | BTC/ETH | sell | 1 | | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + When the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + Examples: + | bo | tick size | offset | error | + | 1010 | 1 | 1 | invalid offset - pegged mid will cross | + | 1010 | 1 | 10 | | + | 1010 | 1 | 100 | | + | 1010 | 10 | 1 | OrderError: price not in tick size | + | 1010 | 10 | 10 | | + | 1010 | 10 | 100 | | + | 1100 | 100 | 1 | OrderError: price not in tick size | + | 1100 | 100 | 10 | OrderError: price not in tick size | + | 1100 | 100 | 100 | | + + + Scenario Outline: Spot market - market decimals < asset decimals + + Given the spot markets: + | id | name | base asset | quote asset | liquidity monitoring | risk model | auction duration | fees | price monitoring | sla params | decimal places | tick size | + | BTC/ETH | BTC/ETH | BTC.1.10 | ETH.1.10 | default-parameters | default-simple-risk-model | 1 | default-none | default-none | default-basic | 0 | | + Given the parties place the following pegged orders: + | party | market id | side | pegged reference | volume | offset | reference | error | + | party1 | BTC/ETH | buy | MID | 10 | | peg-buy | | + | party2 | BTC/ETH | sell | MID | 10 | | peg-sell | | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux1 | BTC/ETH | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux2 | BTC/ETH | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + | aux2 | BTC/ETH | sell | 1 | | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + When the opening auction period ends for market "BTC/ETH" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "BTC/ETH" + + Examples: + | bo | tick size | offset | error | + | 1001 | 1 | 1 | | + | 1001 | 1 | 10 | | + | 1001 | 1 | 100 | | + | 1010 | 10 | 1 | OrderError: price not in tick size | + | 1010 | 10 | 10 | | + | 1010 | 10 | 100 | | + | 1100 | 100 | 1 | OrderError: price not in tick size | + | 1100 | 100 | 10 | OrderError: price not in tick size | + | 1100 | 100 | 100 | | + diff --git a/core/integration/features/verified/special_orders_crossed.feature b/core/integration/features/verified/special_orders_crossed.feature new file mode 100644 index 00000000000..1d0cced078c --- /dev/null +++ b/core/integration/features/verified/special_orders_crossed.feature @@ -0,0 +1,37 @@ + +Feature: Issue: re submit special order would cross + + Background: + + Given the average block duration is "1" + And the following assets are registered: + | id | decimal places | + | ETH | 1 | + And the following network parameters are set: + | name | value | + | limits.markets.maxPeggedOrders | 6 | + + Given 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 | decimal places | tick size | + | ETH/DEC21 | ETH | ETH | default-parameters | default-simple-risk-model | default-margin-calculator | 1 | default-none | default-none | default-eth-for-future | 0.5 | 0 | default-basic | 2 | 10 | + And the parties deposit on asset's general account the following amount: + | party | asset | amount | + | aux1 | ETH | 1000000000000 | + | aux2 | ETH | 1000000000000 | + | party1 | ETH | 1000000000000 | + | party2 | ETH | 1000000000000 | + + Scenario: + + Given the parties place the following pegged iceberg orders: + | party | market id | peak size | minimum visible size | side | pegged reference | volume | offset | reference | error | + | party1 | ETH/DEC21 | 10 | 5 | buy | MID | 10 | 10 | peg-buy-1 | | + | party2 | ETH/DEC21 | 10 | 5 | sell | MID | 10 | 10 | peg-buy-2 | | + And the parties place the following orders: + | party | market id | side | volume | price | resulting trades | type | tif | reference | + | aux1 | ETH/DEC21 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux1 | ETH/DEC21 | buy | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b1-1 | + | aux2 | ETH/DEC21 | sell | 1 | 1000 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + | aux2 | ETH/DEC21 | sell | 1 | 1010 | 0 | TYPE_LIMIT | TIF_GTC | p3b2-1 | + When the opening auction period ends for market "ETH/DEC21" + Then the trading mode should be "TRADING_MODE_CONTINUOUS" for the market "ETH/DEC21" \ No newline at end of file diff --git a/core/integration/main_test.go b/core/integration/main_test.go index fa686c0844a..177c86348e1 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" @@ -344,6 +345,13 @@ func InitializeScenario(s *godog.ScenarioContext) { return steps.PartiesUndelegateTheFollowingStake(execsetup.delegationEngine, table) }) + s.Step(`^the starting auction time for market "([^"]+)" is "([^"]+)"`, func(marketID, startTime string) error { + return steps.MarketAuctionStartTime(execsetup.executionEngine, marketID, startTime) + }) + s.Step(`^the ending auction time for market "([^"]+)" is "([^"]+)"`, func(marketID, endTime string) error { + return steps.MarketAuctionEndTime(execsetup.executionEngine, marketID, endTime) + }) + s.Step(`^the opening auction period ends for market "([^"]+)"$`, func(marketID string) error { return steps.MarketOpeningAuctionPeriodEnds(execsetup.executionEngine, execsetup.timeService, execsetup.markets, marketID) }) @@ -400,13 +408,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 +474,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 +501,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 +595,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.SetAMMPartyAlias(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 +760,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) }) @@ -733,6 +783,15 @@ func InitializeScenario(s *godog.ScenarioContext) { s.Step(`^clear trade events$`, func() error { return steps.ClearTradeEvents(execsetup.broker) }) + + // Long block auction steps + s.Step(`^the long block duration table is:$`, func(table *godog.Table) error { + return steps.TheLongBlockDurationTableIsUploaded(context.Background(), execsetup.executionEngine, table) + }) + + s.Step(`^the previous block duration was "([^"]+)"$`, func(duration string) error { + return steps.ThePreviousBlockDurationWas(context.Background(), execsetup.executionEngine, duration) + }) } func reconcileAccounts() error { diff --git a/core/integration/setup_test.go b/core/integration/setup_test.go index 89ab69ca32f..d6cf1248ed0 100644 --- a/core/integration/setup_test.go +++ b/core/integration/setup_test.go @@ -28,7 +28,6 @@ import ( "code.vegaprotocol.io/vega/core/delegation" "code.vegaprotocol.io/vega/core/epochtime" "code.vegaprotocol.io/vega/core/evtforward" - "code.vegaprotocol.io/vega/core/evtforward/ethereum" "code.vegaprotocol.io/vega/core/execution" "code.vegaprotocol.io/vega/core/execution/common" "code.vegaprotocol.io/vega/core/integration/helpers" @@ -71,6 +70,10 @@ func (t tstReporter) Fatalf(format string, args ...interface{}) { os.Exit(1) } +type DummyDelayTarget struct{} + +func (*DummyDelayTarget) MarketDelayRequiredUpdated(marketID string, required bool) {} + type DummyASVM struct{} func (DummyASVM) GetRewardsVestingMultiplier(_ string) num.Decimal { @@ -168,7 +171,7 @@ func newExecutionTestSetup() *executionTestSetup { execsetup.witness = validators.NewWitness(ctx, execsetup.log, validators.NewDefaultConfig(), execsetup.topology, commander, execsetup.timeService) - eventForwarder := evtforward.NewNoopEngine(execsetup.log, ethereum.Config{}) + eventHeartbeat := evtforward.NewTracker(execsetup.log, execsetup.witness, execsetup.timeService) execsetup.oracleEngine = spec.NewEngine(execsetup.log, spec.NewDefaultConfig(), execsetup.timeService, execsetup.broker) execsetup.builtinOracle = spec.NewBuiltin(execsetup.oracleEngine, execsetup.timeService) @@ -194,7 +197,7 @@ func newExecutionTestSetup() *executionTestSetup { execsetup.volumeDiscountProgram = volumediscount.New(execsetup.broker, execsetup.marketActivityTracker) execsetup.epochEngine.NotifyOnEpoch(execsetup.volumeDiscountProgram.OnEpoch, execsetup.volumeDiscountProgram.OnEpochRestore) - execsetup.banking = banking.New(execsetup.log, banking.NewDefaultConfig(), execsetup.collateralEngine, execsetup.witness, execsetup.timeService, execsetup.assetsEngine, execsetup.notary, execsetup.broker, execsetup.topology, execsetup.marketActivityTracker, stubs.NewBridgeViewStub(), stubs.NewBridgeViewStub(), eventForwarder, nil) + execsetup.banking = banking.New(execsetup.log, banking.NewDefaultConfig(), execsetup.collateralEngine, execsetup.witness, execsetup.timeService, execsetup.assetsEngine, execsetup.notary, execsetup.broker, execsetup.topology, execsetup.marketActivityTracker, stubs.NewBridgeViewStub(), stubs.NewBridgeViewStub(), eventHeartbeat, execsetup.profilesEngine) execsetup.executionEngine = newExEng( execution.NewEngine( @@ -210,6 +213,8 @@ func newExecutionTestSetup() *executionTestSetup { execsetup.referralProgram, execsetup.volumeDiscountProgram, execsetup.banking, + execsetup.profilesEngine, + &DummyDelayTarget{}, ), execsetup.broker, ) @@ -222,7 +227,7 @@ func newExecutionTestSetup() *executionTestSetup { execsetup.activityStreak = activitystreak.New(execsetup.log, execsetup.executionEngine, execsetup.broker) execsetup.epochEngine.NotifyOnEpoch(execsetup.activityStreak.OnEpochEvent, execsetup.activityStreak.OnEpochRestore) - execsetup.vesting = vesting.New(execsetup.log, execsetup.collateralEngine, execsetup.activityStreak, execsetup.broker, execsetup.assetsEngine) + execsetup.vesting = vesting.New(execsetup.log, execsetup.collateralEngine, execsetup.activityStreak, execsetup.broker, execsetup.assetsEngine, execsetup.profilesEngine) execsetup.rewardsEngine = rewards.New(execsetup.log, rewards.NewDefaultConfig(), execsetup.broker, execsetup.delegationEngine, execsetup.epochEngine, execsetup.collateralEngine, execsetup.timeService, execsetup.marketActivityTracker, execsetup.topology, execsetup.vesting, execsetup.banking, execsetup.activityStreak) // register this after the rewards engine is created to make sure the on epoch is called in the right order. @@ -527,5 +532,17 @@ 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, + }, + netparams.WatchParam{ + Param: netparams.MarketAMMMaxCalculationLevels, + Watcher: execsetup.executionEngine.OnMarketAMMMaxCalculationLevels, + }, ) } 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..ff0d4b6c953 --- /dev/null +++ b/core/integration/steps/amm_events.go @@ -0,0 +1,255 @@ +// 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/libs/ptr" + "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 SetAMMPartyAlias(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) + } + pid := pEvt.AMMPool().AmmPartyId + exec.SetAMMSubAccountIDAlias(row.alias(), pid) + } + 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 leverage", + "upper leverage", + }) +} + +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 + } + + var lowerLeverage, upperLeverage, lowerBound, upperBound string + if pool.Parameters.LeverageAtLowerBound != nil { + lowerLeverage = *pool.Parameters.LeverageAtLowerBound + } + if pool.Parameters.LeverageAtUpperBound != nil { + upperLeverage = *pool.Parameters.LeverageAtUpperBound + } + + if pool.Parameters.UpperBound != nil { + upperBound = *pool.Parameters.UpperBound + } + if pool.Parameters.LowerBound != nil { + lowerBound = *pool.Parameters.LowerBound + } + + log.Info(fmt.Sprintf( + "AMM Party: %s on Market: %s - Amount: %s\nStatus: %s, Reason: %s\n Base: %s, Bounds: %s-%s, Leverages: %s-%s", + pool.PartyId, pool.MarketId, pool.Commitment, + pool.Status.String(), pool.StatusReason.String(), + pool.Parameters.Base, lowerBound, upperBound, + lowerLeverage, upperLeverage, + )) + } +} + +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": ptr.UnBox(pool.Parameters.LowerBound), + "upper bound": ptr.UnBox(pool.Parameters.UpperBound), + "lower leverage": ptr.UnBox(pool.Parameters.LeverageAtLowerBound), + "upper leverage": ptr.UnBox(pool.Parameters.LeverageAtUpperBound), + } + + for name, val := range checks { + if !a.r.HasColumn(name) { + if val != "" { + got = append(got, name, "", val) + return fmt.Errorf(eFmt+" expected %s %s - instead got %s", got...) + } + 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.AMMStatusReason, bool) { + if !a.r.HasColumn("reason") { + return types.AMMStatusReasonUnspecified, 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..1086fceb0eb --- /dev/null +++ b/core/integration/steps/amm_submission.go @@ -0,0 +1,279 @@ +// 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 leverage", // dec + "upper leverage", // 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 leverage", // dec + "upper leverage", // 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 { + if !a.r.HasColumn("lower bound") && !a.r.HasColumn("upper bound") { + panic("required at least one upper bound and lower bound") + } + + 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(), + LeverageAtLowerBound: a.lowerLeverage(), + LeverageAtUpperBound: a.upperLeverage(), + }, + } +} + +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 leverage") { + params.LeverageAtLowerBound = a.lowerLeverage() + paramSet = true + } + if a.r.HasColumn("upper leverage") { + params.LeverageAtUpperBound = a.upperLeverage() + 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) lowerLeverage() *num.Decimal { + if !a.r.HasColumn("lower leverage") { + return nil + } + return ptr.From(a.r.MustDecimal("lower leverage")) +} + +func (a ammRow) upperLeverage() *num.Decimal { + if !a.r.HasColumn("upper leverage") { + return nil + } + return ptr.From(a.r.MustDecimal("upper leverage")) +} + +func (a ammRow) method() types.AMMCancellationMethod { + if !a.r.HasColumn("method") { + return types.AMMCancellationMethodUnspecified + } + 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..9762d5a6cb9 100644 --- a/core/integration/steps/execution.go +++ b/core/integration/steps/execution.go @@ -57,4 +57,15 @@ 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) + + // Long block auction callback + OnNetworkWideAuctionDurationUpdated(ctx context.Context, v interface{}) error + BeginBlock(ctx context.Context, prevBlockDuration time.Duration) } diff --git a/core/integration/steps/long_block_auction.go b/core/integration/steps/long_block_auction.go new file mode 100644 index 00000000000..7b2ee4b5dc6 --- /dev/null +++ b/core/integration/steps/long_block_auction.go @@ -0,0 +1,74 @@ +// 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" + "time" + + "code.vegaprotocol.io/vega/protos/vega" + + "github.com/cucumber/godog" +) + +func TheLongBlockDurationTableIsUploaded(ctx context.Context, exec Execution, data *godog.Table) error { + rows := parseLongBlockAuctionTable(data) + tbl := &vega.LongBlockAuctionDurationTable{ + ThresholdAndDuration: make([]*vega.LongBlockAuction, 0, len(rows)), + } + for _, row := range rows { + d := lbDuration{ + r: row, + } + d.validate() + tbl.ThresholdAndDuration = append(tbl.ThresholdAndDuration, d.ToRow()) + } + return exec.OnNetworkWideAuctionDurationUpdated(ctx, tbl) +} + +func ThePreviousBlockDurationWas(ctx context.Context, exec Execution, duration string) error { + prevDuration, err := time.ParseDuration(duration) + if err != nil { + return err + } + exec.BeginBlock(ctx, prevDuration) + return nil +} + +func parseLongBlockAuctionTable(table *godog.Table) []RowWrapper { + return StrictParseTable(table, []string{ + "threshold", + "duration", + }, []string{}) +} + +type lbDuration struct { + r RowWrapper + Threshold time.Duration + Duration time.Duration +} + +func (l *lbDuration) validate() { + l.Threshold = l.r.MustDurationStr("threshold") + l.Duration = l.r.MustDurationStr("duration") +} + +func (l lbDuration) ToRow() *vega.LongBlockAuction { + return &vega.LongBlockAuction{ + Threshold: l.Threshold.String(), + Duration: l.Duration.String(), + } +} diff --git a/core/integration/steps/market/defaults/margin-calculator/default-capped-margin-calculator.json b/core/integration/steps/market/defaults/margin-calculator/default-capped-margin-calculator.json new file mode 100644 index 00000000000..456b359e776 --- /dev/null +++ b/core/integration/steps/market/defaults/margin-calculator/default-capped-margin-calculator.json @@ -0,0 +1,7 @@ +{ + "scalingFactors": { + "searchLevel": 1, + "initialMargin": 1, + "collateralRelease": 1 + } +} diff --git a/core/integration/steps/market/margin_calculators.go b/core/integration/steps/market/margin_calculators.go index e29e49dd118..faabcb6798b 100644 --- a/core/integration/steps/market/margin_calculators.go +++ b/core/integration/steps/market/margin_calculators.go @@ -31,6 +31,7 @@ var ( defaultMarginCalculators embed.FS defaultMarginCalculatorFileNames = []string{ "defaults/margin-calculator/default-margin-calculator.json", + "defaults/margin-calculator/default-capped-margin-calculator.json", "defaults/margin-calculator/default-overkill-margin-calculator.json", } ) diff --git a/core/integration/steps/market_opening_auction_period_ends.go b/core/integration/steps/market_opening_auction_period_ends.go index 97546895c9a..e980b25f571 100644 --- a/core/integration/steps/market_opening_auction_period_ends.go +++ b/core/integration/steps/market_opening_auction_period_ends.go @@ -18,6 +18,7 @@ package steps import ( "context" "fmt" + "strconv" "time" "code.vegaprotocol.io/vega/core/integration/stubs" @@ -63,3 +64,37 @@ func MarketOpeningAuctionPeriodEnds(execEngine Execution, timeStub *stubs.TimeSt func errMarketNotFound(marketID string) error { return fmt.Errorf("market %s not found", marketID) } + +func MarketAuctionStartTime(execEngine Execution, marketID, startTime string) error { + data, err := execEngine.GetMarketData(marketID) + if err != nil { + return errMarketDataNotFound(marketID, err) + } + + st, err := strconv.ParseInt(startTime, 10, 64) + if err != nil { + return fmt.Errorf("failed to convert time to int64: %s", startTime) + } + + if data.AuctionStart == st { + return nil + } + return fmt.Errorf("start auction time did not match %d != %d", data.AuctionStart, st) +} + +func MarketAuctionEndTime(execEngine Execution, marketID, endTime string) error { + data, err := execEngine.GetMarketData(marketID) + if err != nil { + return errMarketDataNotFound(marketID, err) + } + + et, err := strconv.ParseInt(endTime, 10, 64) + if err != nil { + return fmt.Errorf("failed to convert time to int64: %s", endTime) + } + + if data.AuctionEnd == et { + return nil + } + return fmt.Errorf("end auction time did not match %d != %d", data.AuctionEnd, et) +} 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 57a591c2263..d2e202c5a7d 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" @@ -286,7 +288,7 @@ func (r RowWrapper) U64(name string) uint64 { } func U64(value string) (uint64, error) { - return strconv.ParseUint(value, 10, 0) + return strconv.ParseUint(value, 10, 64) } func (r RowWrapper) MustU32(name string) uint32 { @@ -440,7 +442,11 @@ func (r RowWrapper) MustBool(name string) bool { } func (r RowWrapper) Bool(name string) bool { - b, err := Bool(r.values[name]) + v, ok := r.values[name] + if !ok { + return false + } + b, err := Bool(v) panicW(name, err) return b } @@ -779,11 +785,11 @@ func AccountID(marketID, partyID, asset string, ty types.AccountType) string { } func (r RowWrapper) MustDuration(name string) time.Duration { - return time.Duration(r.MustU64(name)) + return time.Duration(r.MustI64(name)) } func (r RowWrapper) Duration(name string) time.Duration { - return time.Duration(r.U64(name)) + return time.Duration(r.I64(name)) } func (r RowWrapper) MustDurationStr(name string) time.Duration { @@ -794,7 +800,7 @@ func (r RowWrapper) MustDurationStr(name string) time.Duration { } func (r RowWrapper) MustDurationSec(name string) time.Duration { - n := r.MustU64(name) + n := r.MustI64(name) if n == 0 { return 0 } @@ -810,13 +816,55 @@ func (r RowWrapper) MustDurationSec2(name string) time.Duration { } func (r RowWrapper) DurationSec(name string) time.Duration { - n := r.U64(name) + n := r.I64(name) if n == 0 { return 0 } return time.Duration(n) * time.Second } +func (r RowWrapper) MustAMMCancelationMethod(name string) types.AMMCancellationMethod { + 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.AMMStatusReason { + pr, err := AMMPoolStatusReason(r.MustStr(name)) + panicW(name, err) + return pr +} + +func AMMCancelMethod(rawValue string) (types.AMMCancellationMethod, error) { + ty, ok := commandspb.CancelAMM_Method_value[rawValue] + if !ok { + return types.AMMCancellationMethod(ty), fmt.Errorf("invalid cancelation method: %v", rawValue) + } + return types.AMMCancellationMethod(ty), nil +} + +func AMMPoolStatus(rawValue string) (types.AMMPoolStatus, error) { + ps, ok := eventspb.AMM_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.AMMStatusReason, error) { + pr, ok := eventspb.AMM_StatusReason_value[rawValue] + if !ok { + return types.AMMStatusReasonUnspecified, fmt.Errorf("invalid AMM pool status reason: %s", rawValue) + } + return types.AMMStatusReason(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/the_market_state_should_be_for_market.go b/core/integration/steps/the_market_state_should_be_for_market.go index e96825f02a0..aeef7f60982 100644 --- a/core/integration/steps/the_market_state_should_be_for_market.go +++ b/core/integration/steps/the_market_state_should_be_for_market.go @@ -17,6 +17,7 @@ package steps import ( "context" + "errors" "fmt" "code.vegaprotocol.io/vega/core/integration/stubs" @@ -78,8 +79,13 @@ func TheMarketStateIsUpdatedTo(exec Execution, data *godog.Table) error { if r.HasColumn("settlement price") { changes.SettlementPrice = mu.SettlementPrice() } + expErr := mu.Err() if err := exec.UpdateMarketState(ctx, changes); err != nil { - return err + if expErr != nil && err.Error() != expErr.Error() { + return err + } + } else if expErr != nil { + return fmt.Errorf("expected error %s, instead got no error", expErr.Error()) } } return nil @@ -93,7 +99,10 @@ func parseStateUpdate(data *godog.Table) []RowWrapper { return StrictParseTable(data, []string{ "market id", "state", - }, []string{"settlement price"}) + }, []string{ + "settlement price", + "error", + }) } func errMismatchedMarketState(market string, expectedMarketState, marketState types.Market_State) error { @@ -119,3 +128,10 @@ func (m marketUpdateGov) MarketStateUpdate() vtypes.MarketStateUpdateType { func (m marketUpdateGov) SettlementPrice() *num.Uint { return m.row.MustUint("settlement price") } + +func (m marketUpdateGov) Err() error { + if m.row.HasColumn("error") { + return errors.New(m.row.MustStr("error")) + } + return nil +} diff --git a/core/integration/steps/the_markets.go b/core/integration/steps/the_markets.go index a28fc9c95cf..2596c445007 100644 --- a/core/integration/steps/the_markets.go +++ b/core/integration/steps/the_markets.go @@ -28,6 +28,7 @@ import ( "code.vegaprotocol.io/vega/core/netparams" "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" proto "code.vegaprotocol.io/vega/protos/vega" "github.com/cucumber/godog" @@ -599,6 +600,7 @@ func newMarket(config *market.Config, row marketRow) types.Market { SpecBindingForCompositePrice: bindings, } + pCap := row.getCapped() m := types.Market{ TradingMode: types.MarketTradingModeContinuous, State: types.MarketStateActive, @@ -625,6 +627,7 @@ func newMarket(config *market.Config, row marketRow) types.Market { DataSourceSpecForSettlementData: datasource.SpecFromDefinition(*settlSpec.Data.SetFilterDecimals(uint64(settlementDataDecimals))), DataSourceSpecForTradingTermination: datasource.SpecFromProto(oracleConfigForTradingTermination.Spec.ExternalDataSourceSpec.Spec), DataSourceSpecBinding: datasource.SpecBindingForFutureFromProto(&binding), + Cap: pCap, }, }, }, @@ -648,6 +651,9 @@ func newMarket(config *market.Config, row marketRow) types.Market { } tip := m.TradableInstrument.IntoProto() + if row.IsCapped() { + tip.MarginCalculator.FullyCollateralised = ptr.From(pCap.FullyCollateralised) + } err = config.RiskModels.LoadModel(row.riskModel(), tip) m.TradableInstrument = types.TradableInstrumentFromProto(tip) if err != nil { @@ -704,6 +710,9 @@ func parseMarketsTable(table *godog.Table) []RowWrapper { "oracle4", "oracle5", "tick size", + "max price cap", + "binary", + "fully collateralised", }) } @@ -1114,6 +1123,21 @@ func (r marketRow) isSuccessor() bool { return true } +func (r marketRow) IsCapped() bool { + return r.row.HasColumn("max price cap") +} + +func (r marketRow) getCapped() *types.FutureCap { + if !r.IsCapped() { + return nil + } + return &types.FutureCap{ + MaxPrice: r.row.MustUint("max price cap"), + Binary: r.row.Bool("binary"), + FullyCollateralised: r.row.Bool("fully collateralised"), + } +} + func (r marketRow) isPerp() bool { if mt, ok := r.row.StrB("market type"); !ok || mt != "perp" { return false diff --git a/core/integration/steps/transfers.go b/core/integration/steps/transfers.go index 909bf9051e0..5e2d93463cb 100644 --- a/core/integration/steps/transfers.go +++ b/core/integration/steps/transfers.go @@ -238,6 +238,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..4e8ece64bd8 100644 --- a/core/integration/steps/volume_discount_program.go +++ b/core/integration/steps/volume_discount_program.go @@ -80,7 +80,7 @@ func VolumeDiscountProgram( if row.closingTimestamp() == 0 { vdp.EndOfProgramTimestamp = time.Time{} } else { - vdp.EndOfProgramTimestamp = time.Unix(int64(row.closingTimestamp()), 0) + vdp.EndOfProgramTimestamp = time.Unix(row.closingTimestamp(), 0) } tierName := row.tiers() if tier := tiers[tierName]; tier != nil { @@ -112,8 +112,8 @@ func (r volumeDiscountRow) tiers() string { return r.row.MustStr("tiers") } -func (r volumeDiscountRow) closingTimestamp() uint64 { - return r.row.MustU64("closing timestamp") +func (r volumeDiscountRow) closingTimestamp() int64 { + return r.row.MustI64("closing timestamp") } func (r volumeDiscountRow) windowLength() uint64 { @@ -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/bridge_view_stub.go b/core/integration/stubs/bridge_view_stub.go index 411bbb3caab..4ad409c4d1f 100644 --- a/core/integration/stubs/bridge_view_stub.go +++ b/core/integration/stubs/bridge_view_stub.go @@ -44,3 +44,7 @@ func (*BridgeViewStub) FindDeposit(d *types.ERC20Deposit, blockNumber, logIndex func (*BridgeViewStub) FindAssetLimitsUpdated(w *types.ERC20AssetLimitsUpdated, blockNumber, logIndex uint64, ethAssetAddress string, txHash string) error { return nil } + +func (*BridgeViewStub) CollateralBridgeAddress() string { + return "" +} 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/integration/stubs/time_stub.go b/core/integration/stubs/time_stub.go index 964f5869f3f..30544c00b22 100644 --- a/core/integration/stubs/time_stub.go +++ b/core/integration/stubs/time_stub.go @@ -43,6 +43,13 @@ func (t *TimeStub) SetTimeNow(_ context.Context, newNow time.Time) { t.SetTime(newNow) } +func (t *TimeStub) SetPrevTime(newNow time.Time) { +} + +func (t *TimeStub) GetTimeLastBatch() time.Time { + return time.Time{} +} + func (t *TimeStub) SetTime(newNow time.Time) { t.now = newNow ctx := vegacontext.WithTraceID(context.Background(), vgcrypto.RandomHash()) 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..c8a0dc5dddf 100644 --- a/core/matching/cached_orderbook.go +++ b/core/matching/cached_orderbook.go @@ -39,17 +39,22 @@ 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 { return providers, err } - // when a market is restored we call `GetMarketData` which fills this cache based on an unrestored orderbook, - // now we have restored we need to recalculate. - b.log.Info("restoring orderbook cache for", logging.String("marketID", b.marketID)) - b.cache.Invalidate() - b.GetIndicativePriceAndVolume() + if b.auction { + b.cache.Invalidate() + b.log.Info("restoring orderbook cache for", logging.String("marketID", b.marketID)) + b.GetIndicativePriceAndVolume() + } + return providers, err } @@ -212,3 +217,12 @@ func (b *CachedOrderBook) GetIndicativePrice() *num.Uint { } return price } + +func (b *CachedOrderBook) UpdateAMM(party string) { + if !b.auction { + return + } + + b.cache.Invalidate() + b.OrderBook.UpdateAMM(party) +} 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/indicative_price_and_volume.go b/core/matching/indicative_price_and_volume.go index 253dbe04ea7..6bba28205a3 100644 --- a/core/matching/indicative_price_and_volume.go +++ b/core/matching/indicative_price_and_volume.go @@ -16,11 +16,14 @@ package matching import ( + "slices" "sort" "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/logging" + + "golang.org/x/exp/maps" ) type IndicativePriceAndVolume struct { @@ -37,6 +40,10 @@ type IndicativePriceAndVolume struct { lastMaxTradable uint64 lastCumulativeVolumes []CumulativeVolumeLevel needsUpdate bool + + // keep track of expanded off book orders + offbook OffbookSource + generated map[string]*ipvGeneratedOffbook } type ipvPriceLevel struct { @@ -49,6 +56,19 @@ type ipvVolume struct { volume uint64 } +type ipvGeneratedOffbook struct { + buy []*types.Order + sell []*types.Order +} + +func (g *ipvGeneratedOffbook) add(order *types.Order) { + if order.Side == types.SideSell { + g.sell = append(g.sell, order) + return + } + g.buy = append(g.buy, order) +} + func NewIndicativePriceAndVolume(log *logging.Logger, buy, sell *OrderBookSide) *IndicativePriceAndVolume { bestBid, _, err := buy.BestPriceAndVolume() if err != nil { @@ -59,12 +79,38 @@ func NewIndicativePriceAndVolume(log *logging.Logger, buy, sell *OrderBookSide) bestAsk = num.UintZero() } + if buy.offbook != nil { + bid, _, ask, _ := buy.offbook.BestPricesAndVolumes() + if bid != nil { + if bestBid.IsZero() { + bestBid = bid + } else { + bestBid = num.Max(bestBid, bid) + } + } + if ask != nil { + if bestAsk.IsZero() { + bestAsk = ask + } else { + bestAsk = num.Min(bestAsk, ask) + } + } + } + ipv := IndicativePriceAndVolume{ levels: []ipvPriceLevel{}, log: log, - lastMinPrice: bestBid, - lastMaxPrice: bestAsk, + lastMinPrice: num.UintZero(), + lastMaxPrice: num.UintZero(), needsUpdate: true, + offbook: buy.offbook, + generated: map[string]*ipvGeneratedOffbook{}, + } + + // if they are crossed set the last min/max values otherwise leave as zero + if bestAsk.LTE(bestBid) { + ipv.lastMinPrice = bestAsk + ipv.lastMaxPrice = bestBid } ipv.buildInitialCumulativeLevels(buy, sell) @@ -75,6 +121,102 @@ func NewIndicativePriceAndVolume(log *logging.Logger, buy, sell *OrderBookSide) return &ipv } +func (ipv *IndicativePriceAndVolume) buildInitialOffbookShape(offbook OffbookSource, mplm map[num.Uint]ipvPriceLevel) { + min, max := ipv.lastMinPrice, ipv.lastMaxPrice + if min.IsZero() || max.IsZero() || min.GT(max) { + // region is not crossed so we won't expand just yet + return + } + + // expand all AMM's into orders within the crossed region and add them to the price-level cache + buys, sells := offbook.OrderbookShape(min, max, nil) + + for _, o := range buys { + mpl, ok := mplm[*o.Price] + if !ok { + mpl = ipvPriceLevel{price: o.Price, buypl: ipvVolume{0}, sellpl: ipvVolume{0}} + } + // increment the volume at this level + mpl.buypl.volume += o.Size + mplm[*o.Price] = mpl + + if ipv.generated[o.Party] == nil { + ipv.generated[o.Party] = &ipvGeneratedOffbook{} + } + ipv.generated[o.Party].add(o) + } + + for _, o := range sells { + mpl, ok := mplm[*o.Price] + if !ok { + mpl = ipvPriceLevel{price: o.Price, buypl: ipvVolume{0}, sellpl: ipvVolume{0}} + } + + mpl.sellpl.volume += o.Size + mplm[*o.Price] = mpl + + if ipv.generated[o.Party] == nil { + ipv.generated[o.Party] = &ipvGeneratedOffbook{} + } + ipv.generated[o.Party].add(o) + } +} + +func (ipv *IndicativePriceAndVolume) removeOffbookShape(party string) { + orders, ok := ipv.generated[party] + if !ok { + return + } + + // remove all the old volume for the AMM's + for _, o := range orders.buy { + ipv.RemoveVolumeAtPrice(o.Price, o.Size, o.Side) + } + for _, o := range orders.sell { + ipv.RemoveVolumeAtPrice(o.Price, o.Size, o.Side) + } + + // clear it out the saved generated orders for the offbook shape + delete(ipv.generated, party) +} + +func (ipv *IndicativePriceAndVolume) addOffbookShape(party *string, minPrice, maxPrice *num.Uint) { + // recalculate new orders for the shape and add the volume in + buys, sells := ipv.offbook.OrderbookShape(minPrice, maxPrice, party) + + for _, o := range buys { + ipv.AddVolumeAtPrice(o.Price, o.Size, o.Side) + + if ipv.generated[o.Party] == nil { + ipv.generated[o.Party] = &ipvGeneratedOffbook{} + } + ipv.generated[o.Party].add(o) + } + + for _, o := range sells { + ipv.AddVolumeAtPrice(o.Price, o.Size, o.Side) + + if ipv.generated[o.Party] == nil { + ipv.generated[o.Party] = &ipvGeneratedOffbook{} + } + ipv.generated[o.Party].add(o) + } +} + +func (ipv *IndicativePriceAndVolume) updateOffbookState(minPrice, maxPrice *num.Uint) { + parties := maps.Keys(ipv.generated) + for _, p := range parties { + ipv.removeOffbookShape(p) + } + + if minPrice.GT(maxPrice) { + // region is not crossed so we won't expand just yet + return + } + + ipv.addOffbookShape(nil, minPrice, maxPrice) +} + // this will be used to build the initial set of price levels, when the auction is being started. func (ipv *IndicativePriceAndVolume) buildInitialCumulativeLevels(buy, sell *OrderBookSide) { // we'll keep track of all the pl we encounter @@ -97,6 +239,10 @@ func (ipv *IndicativePriceAndVolume) buildInitialCumulativeLevels(buy, sell *Ord } } + if buy.offbook != nil { + ipv.buildInitialOffbookShape(buy.offbook, mplm) + } + // now we insert them all in the slice. // so we can sort them ipv.levels = make([]ipvPriceLevel, 0, len(mplm)) @@ -191,21 +337,40 @@ func (ipv *IndicativePriceAndVolume) getLevelsWithinRange(maxPrice, minPrice *nu return ipv.levels[maxPricePos : minPricePos+1] } +func (ipv *IndicativePriceAndVolume) GetCrossedRegion() (*num.Uint, *num.Uint) { + min := ipv.lastMinPrice + if min != nil { + min = min.Clone() + } + + max := ipv.lastMaxPrice + if max != nil { + max = max.Clone() + } + return min, max +} + func (ipv *IndicativePriceAndVolume) GetCumulativePriceLevels(maxPrice, minPrice *num.Uint) ([]CumulativeVolumeLevel, uint64) { - needsUpdate := ipv.needsUpdate + var crossedRegionChanged bool if maxPrice.NEQ(ipv.lastMaxPrice) { maxPrice = maxPrice.Clone() - needsUpdate = true + crossedRegionChanged = true } if minPrice.NEQ(ipv.lastMinPrice) { minPrice = minPrice.Clone() - needsUpdate = true + crossedRegionChanged = true } - if !needsUpdate { + // if the crossed region hasn't changed and no new orders were added/removed from the crossed region then we do not need + // to recalculate + if !ipv.needsUpdate && !crossedRegionChanged { return ipv.lastCumulativeVolumes, ipv.lastMaxTradable } + if crossedRegionChanged && ipv.offbook != nil { + ipv.updateOffbookState(minPrice, maxPrice) + } + rangedLevels := ipv.getLevelsWithinRange(maxPrice, minPrice) // now re-allocate the slice only if needed if ipv.buf == nil || cap(ipv.buf) < len(rangedLevels) { @@ -280,3 +445,31 @@ func (ipv *IndicativePriceAndVolume) GetCumulativePriceLevels(maxPrice, minPrice ipv.lastCumulativeVolumes = cumulativeVolumes return cumulativeVolumes, maxTradable } + +// ExtractOffbookOrders returns the cached expanded orders of AMM's in the crossed region of the given side. These +// are the order that we will send in aggressively to uncrossed the book. +func (ipv *IndicativePriceAndVolume) ExtractOffbookOrders(price *num.Uint, side types.Side) ([]*types.Order, uint64) { + var volume uint64 + orders := []*types.Order{} + // the ipv keeps track of all the expand AMM orders in the crossed region + parties := maps.Keys(ipv.generated) + slices.Sort(parties) + + for _, p := range parties { + cpm := func(p *num.Uint) bool { return p.LT(price) } + oo := ipv.generated[p].buy + if side == types.SideSell { + oo = ipv.generated[p].sell + cpm = func(p *num.Uint) bool { return p.GT(price) } + } + + for _, o := range oo { + if cpm(o.Price) { + continue + } + orders = append(orders, o) + volume += o.Size + } + } + return orders, volume +} diff --git a/core/matching/mocks/mocks.go b/core/matching/mocks/mocks.go new file mode 100644 index 00000000000..0f854d39684 --- /dev/null +++ b/core/matching/mocks/mocks.go @@ -0,0 +1,94 @@ +// 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)) +} + +// OrderbookShape mocks base method. +func (m *MockOffbookSource) OrderbookShape(arg0, arg1 *num.Uint, arg2 *string) ([]*types.Order, []*types.Order) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "OrderbookShape", arg0, arg1, arg2) + ret0, _ := ret[0].([]*types.Order) + ret1, _ := ret[1].([]*types.Order) + return ret0, ret1 +} + +// OrderbookShape indicates an expected call of OrderbookShape. +func (mr *MockOffbookSourceMockRecorder) OrderbookShape(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OrderbookShape", reflect.TypeOf((*MockOffbookSource)(nil).OrderbookShape), arg0, arg1, arg2) +} + +// 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..0aa42e06788 100644 --- a/core/matching/orderbook.go +++ b/core/matching/orderbook.go @@ -25,6 +25,7 @@ import ( "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/libs/crypto" "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" "code.vegaprotocol.io/vega/logging" "code.vegaprotocol.io/vega/protos/vega" @@ -42,6 +43,14 @@ 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() + OrderbookShape(st, nd *num.Uint, id *string) ([]*types.Order, []*types.Order) +} + // OrderBook represents the book holding all orders in the system. type OrderBook struct { log *logging.Logger @@ -129,6 +138,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)) @@ -222,6 +236,10 @@ func (b *OrderBook) LeaveAuction(at time.Time) ([]*types.OrderConfirmation, []*t b.remove(uo.Order) } + if uo.Order.GeneratedOffbook { + uo.Order.CreatedAt = ts + } + uo.Order.UpdatedAt = ts for idx, po := range uo.PassiveOrdersAffected { po.UpdatedAt = ts @@ -466,19 +484,30 @@ func (b *OrderBook) GetIndicativeTrades() ([]*types.Trade, error) { var ( uncrossOrders []*types.Order uncrossingSide *OrderBookSide + uncrossBound *num.Uint ) + min, max := b.indicativePriceAndVolume.GetCrossedRegion() if uncrossSide == types.SideBuy { uncrossingSide = b.buy + uncrossBound = min } else { uncrossingSide = b.sell + uncrossBound = max } + // extract uncrossing orders from all AMMs + var offbookVolume uint64 + uncrossOrders, offbookVolume = b.indicativePriceAndVolume.ExtractOffbookOrders(price, uncrossSide) + + // the remaining volume should now come from the orderbook + volume -= offbookVolume + // Remove all the orders from that side of the book up to the given volume - uncrossOrders = uncrossingSide.ExtractOrders(price, volume, false) + uncrossOrders = append(uncrossOrders, uncrossingSide.ExtractOrders(price, volume, false)...) opSide := b.getOppositeSide(uncrossSide) output := make([]*types.Trade, 0, len(uncrossOrders)) - trades, err := opSide.fakeUncrossAuction(uncrossOrders) + trades, err := opSide.fakeUncrossAuction(uncrossOrders, uncrossBound) if err != nil { return nil, err } @@ -524,19 +553,29 @@ func (b *OrderBook) uncrossBook() ([]*types.OrderConfirmation, error) { } var ( - uncrossOrders []*types.Order uncrossingSide *OrderBookSide + uncrossBound *num.Uint ) + min, max := b.indicativePriceAndVolume.GetCrossedRegion() if uncrossSide == types.SideBuy { uncrossingSide = b.buy + uncrossBound = min } else { uncrossingSide = b.sell + uncrossBound = max } + // extract uncrossing orders from all AMMs + var offbookVolume uint64 + uncrossOrders, offbookVolume := b.indicativePriceAndVolume.ExtractOffbookOrders(price, uncrossSide) + + // the remaining volume should now come from the orderbook + volume -= offbookVolume + // Remove all the orders from that side of the book up to the given volume - uncrossOrders = uncrossingSide.ExtractOrders(price, volume, true) - return b.uncrossBookSide(uncrossOrders, b.getOppositeSide(uncrossSide), price.Clone()) + uncrossOrders = append(uncrossOrders, uncrossingSide.ExtractOrders(price, volume, true)...) + return b.uncrossBookSide(uncrossOrders, b.getOppositeSide(uncrossSide), price.Clone(), uncrossBound) } // Takes extracted order from a side of the book, and uncross them @@ -544,7 +583,7 @@ func (b *OrderBook) uncrossBook() ([]*types.OrderConfirmation, error) { func (b *OrderBook) uncrossBookSide( uncrossOrders []*types.Order, opSide *OrderBookSide, - price *num.Uint, + price, uncrossBound *num.Uint, ) ([]*types.OrderConfirmation, error) { var ( uncrossedOrder *types.OrderConfirmation @@ -555,8 +594,8 @@ func (b *OrderBook) uncrossBookSide( } // get price factor, if price is 10,000, but market price is 100, this is 10,000/100 -> 100 // so we can get the market price simply by doing price / (order.Price/ order.OriginalPrice) - mPrice := num.UintZero().Div(uncrossOrders[0].Price, uncrossOrders[0].OriginalPrice) - mPrice.Div(price, mPrice) + // as the asset decimals may be < market decimals, the calculation must be done in decimals. + mPrice, _ := num.UintFromDecimal(price.ToDecimal().Div(uncrossOrders[0].Price.ToDecimal().Div(uncrossOrders[0].OriginalPrice.ToDecimal()))) // Uncross each one for _, order := range uncrossOrders { // since all of uncrossOrders will be traded away and at the same uncrossing price @@ -567,7 +606,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, uncrossBound) if err != nil { return nil, err } @@ -609,12 +648,56 @@ 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 + } + + // no orderbook volume or AMM price is better + if err != nil || oPrice.GT(price) { + //nolint: nilerr + return oPrice, oVolume, nil + } + + // AMM price equals orderbook price, combined volumes + 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.buy.offbook.BestPricesAndVolumes() + + // no off source volume, return the orderbook + if oVolume == 0 { + return price, volume, err + } + + // no orderbook volume or AMM price is better + if err != nil || oPrice.LT(price) { + //nolint: nilerr + return oPrice, oVolume, nil + } + + // AMM price equals orderbook price, combined volumes + 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) { @@ -779,6 +862,24 @@ func (b *OrderBook) AmendOrder(originalOrder, amendedOrder *types.Order) error { return nil } +func (b *OrderBook) UpdateAMM(party string) { + if !b.auction { + return + } + + ipv := b.indicativePriceAndVolume + ipv.removeOffbookShape(party) + + min, max := ipv.lastMinPrice, ipv.lastMaxPrice + if min.IsZero() || max.IsZero() || min.GT(max) { + // region is not crossed so we won't expand just yet + return + } + + ipv.addOffbookShape(ptr.From(party), ipv.lastMinPrice, ipv.lastMaxPrice) + ipv.needsUpdate = true +} + // GetTrades returns the trades a given order generates if we were to submit it now // this is used to calculate fees, perform price monitoring, etc... func (b *OrderBook) GetTrades(order *types.Order) ([]*types.Trade, error) { @@ -794,7 +895,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 +945,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 +988,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 } @@ -1052,28 +1174,120 @@ func makeResponse(order *types.Order, trades []*types.Trade, impactedOrders []*t func (b *OrderBook) GetBestBidPrice() (*num.Uint, error) { price, _, err := b.buy.BestPriceAndVolume() + + if b.buy.offbook != nil { + offbook, volume, _, _ := b.buy.offbook.BestPricesAndVolumes() + if volume == 0 { + return price, err + } + + if err != nil || offbook.GT(price) { + //nolint: nilerr + return offbook, nil + } + } return price, err } func (b *OrderBook) GetBestStaticBidPrice() (*num.Uint, error) { - return b.buy.BestStaticPrice() + price, err := b.buy.BestStaticPrice() + if b.buy.offbook != nil { + offbook, volume, _, _ := b.buy.offbook.BestPricesAndVolumes() + if volume == 0 { + return price, err + } + + if err != nil || offbook.GT(price) { + //nolint: nilerr + return offbook, nil + } + } + return price, err } 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 + } + + // no orderbook volume or AMM price is better + if err != nil || oPrice.GT(price) { + //nolint: nilerr + return oPrice, oVolume, nil + } + + // AMM price equals orderbook price, combined volumes + if err == nil && oPrice.EQ(price) { + oVolume += volume + return oPrice, oVolume, nil + } + } + return price, volume, err } func (b *OrderBook) GetBestAskPrice() (*num.Uint, error) { price, _, err := b.sell.BestPriceAndVolume() + + if b.sell.offbook != nil { + _, _, offbook, volume := b.sell.offbook.BestPricesAndVolumes() + if volume == 0 { + return price, err + } + + if err != nil || offbook.LT(price) { + //nolint: nilerr + return offbook, nil + } + } return price, err } func (b *OrderBook) GetBestStaticAskPrice() (*num.Uint, error) { - return b.sell.BestStaticPrice() + price, err := b.sell.BestStaticPrice() + if b.sell.offbook != nil { + _, _, offbook, volume := b.sell.offbook.BestPricesAndVolumes() + if volume == 0 { + return price, err + } + + if err != nil || offbook.LT(price) { + //nolint: nilerr + return offbook, nil + } + } + return price, err } 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 + } + + // no orderbook volume or AMM price is better + if err != nil || oPrice.LT(price) { + //nolint: nilerr + return oPrice, oVolume, nil + } + + // AMM price equals orderbook price, combined volumes + if err == nil && oPrice.EQ(price) { + oVolume += volume + return oPrice, oVolume, nil + } + } + return price, volume, err } func (b *OrderBook) GetLastTradedPrice() *num.Uint { @@ -1191,6 +1405,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..167145c7be0 --- /dev/null +++ b/core/matching/orderbook_amm_test.go @@ -0,0 +1,463 @@ +// 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 TestIndicativeTradesAMMOnly(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + tst.obs.EXPECT().NotifyFinished().Times(1) + + expectCrossedAMMs(t, tst, 100, 150) + tst.book.EnterAuction() + + ret := []*types.Order{createOrder(t, tst, 100, num.NewUint(100))} + tst.obs.EXPECT().SubmitOrder(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().DoAndReturn( + func(o *types.Order, _, _ *num.Uint) []*types.Order { + o.Remaining = 0 + return ret + }, + ) + + trades, err := tst.book.GetIndicativeTrades() + require.NoError(t, err) + assert.Equal(t, 26, len(trades)) +} + +func TestIndicativeTradesAMMOrderbookNotCrosses(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + tst.obs.EXPECT().NotifyFinished().Times(1) + + expectCrossedAMMs(t, tst, 100, 150) + tst.book.EnterAuction() + + // submit an order each side outside of the crossed region + o := createOrder(t, tst, 10, num.NewUint(90)) + o.Side = types.SideBuy + _, err := tst.book.SubmitOrder(o) + require.NoError(t, err) + + o = createOrder(t, tst, 10, num.NewUint(160)) + o.Side = types.SideSell + _, err = tst.book.SubmitOrder(o) + require.NoError(t, err) + + ret := []*types.Order{createOrder(t, tst, 100, num.NewUint(100))} + tst.obs.EXPECT().SubmitOrder(gomock.Any(), gomock.Any(), gomock.Any()).Times(26).DoAndReturn( + func(o *types.Order, _, _ *num.Uint) []*types.Order { + o.Remaining = 0 + return ret + }, + ) + + trades, err := tst.book.GetIndicativeTrades() + require.NoError(t, err) + assert.Equal(t, 26, len(trades)) +} + +func TestIndicativeTradesAMMCrossedOrders(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + tst.obs.EXPECT().NotifyFinished().Times(1) + + expectCrossedAMMs(t, tst, 100, 150) + tst.book.EnterAuction() + + // submit an order each side outside of the crossed region + o := createOrder(t, tst, 10, num.NewUint(110)) + o.Side = types.SideBuy + _, err := tst.book.SubmitOrder(o) + require.NoError(t, err) + + o = createOrder(t, tst, 5, num.NewUint(125)) + o.Side = types.SideSell + _, err = tst.book.SubmitOrder(o) + require.NoError(t, err) + + o = createOrder(t, tst, 5, num.NewUint(126)) + o.Side = types.SideSell + _, err = tst.book.SubmitOrder(o) + require.NoError(t, err) + + ret := []*types.Order{createOrder(t, tst, 100, num.NewUint(100))} + tst.obs.EXPECT().SubmitOrder(gomock.Any(), gomock.Any(), gomock.Any()).Times(2).Return(ret) + + ret = []*types.Order{createOrder(t, tst, 5, num.NewUint(100))} + tst.obs.EXPECT().SubmitOrder(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(ret) + + ret = []*types.Order{createOrder(t, tst, 100, num.NewUint(100))} + tst.obs.EXPECT().SubmitOrder(gomock.Any(), gomock.Any(), gomock.Any()).Times(23).Return(ret) + + trades, err := tst.book.GetIndicativeTrades() + require.NoError(t, err) + assert.Equal(t, 27, len(trades)) +} + +func TestUncrossedBookDoesNotExpandAMMs(t *testing.T) { + tst := getTestOrderBookWithAMM(t) + defer tst.ctrl.Finish() + + // AMM with buy at 99 and SELL at 101 + tst.obs.EXPECT().BestPricesAndVolumes().Return(num.NewUint(uint64(99)), uint64(10), num.NewUint(uint64(101)), uint64(10)).AnyTimes() + + // enter auction when not crossed we should not try to expand AMM's + tst.book.EnterAuction() + assert.Equal(t, "0", tst.book.GetIndicativePrice().String()) +} + +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) +} + +func expectCrossedAMMs(t *testing.T, tst *tstOrderbook, min, max int) { + t.Helper() + tst.obs.EXPECT().BestPricesAndVolumes().Return(num.NewUint(uint64(max)), uint64(10), num.NewUint(uint64(min)), uint64(10)).AnyTimes() + + orders1 := createOrderbookShape(t, tst, min, max, types.SideBuy, "A") + orders2 := createOrderbookShape(t, tst, min, max, types.SideSell, "B") + + tst.obs.EXPECT().OrderbookShape(gomock.Any(), gomock.Any(), gomock.Any()).Return(orders1, orders2) +} + +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 createOrderbookShape(t *testing.T, tst *tstOrderbook, from, to int, side types.Side, party string) []*types.Order { + t.Helper() + + orders := []*types.Order{} + for i := from; i <= to; i++ { + o := createOrder(t, tst, 10, num.NewUint(uint64(i))) + o.GeneratedOffbook = true + o.Side = side + o.Party = party + orders = append(orders, o) + } + return orders +} + +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..15265e25a0c 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 { @@ -219,6 +220,10 @@ func (s *OrderBookSide) amendOrder(orderAmend *types.Order) (int64, error) { // if removeOrders is set to True then the relevant orders also get removed. func (s *OrderBookSide) ExtractOrders(price *num.Uint, volume uint64, removeOrders bool) []*types.Order { extractedOrders := []*types.Order{} + if volume == 0 { + return extractedOrders + } + var ( totalVolume uint64 checkPrice func(*num.Uint) bool @@ -276,7 +281,10 @@ func (s *OrderBookSide) ExtractOrders(price *num.Uint, volume uint64, removeOrde // something has gone wrong if totalVolume != volume { s.log.Panic("Failed to extract orders as not enough volume on the book", - logging.BigUint("Price", price), logging.Uint64("volume", volume)) + logging.BigUint("price", price), + logging.Uint64("volume", volume), + logging.Uint64("total-volume", totalVolume), + ) } return extractedOrders @@ -400,9 +408,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 +427,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 +447,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 +463,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 +483,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 +500,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-- } @@ -478,7 +514,8 @@ func (s *OrderBookSide) fakeUncross(agg *types.Order, checkWashTrades bool) ([]* } // fakeUncrossAuction returns hypothetical trades if the order book side were to be uncrossed with the agg orders supplied, wash trades are allowed. -func (s *OrderBookSide) fakeUncrossAuction(orders []*types.Order) ([]*types.Trade, error) { +func (s *OrderBookSide) fakeUncrossAuction(orders []*types.Order, bound *num.Uint) ([]*types.Trade, error) { + defer s.uncrossFinished() // 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 @@ -500,9 +537,24 @@ func (s *OrderBookSide) fakeUncrossAuction(orders []*types.Order) ([]*types.Trad trades []*types.Trade lvl *PriceLevel err error + fake *types.Order ) - fake := orders[iOrder].Clone() + for ; iOrder < len(orders); iOrder++ { + fake = orders[iOrder].Clone() + ntrades, _ = s.uncrossOffbook(len(s.levels), fake, bound, false) + trades = append(trades, ntrades...) + + // no more to trade in this pre-orderbook region for AMM's, we now need to move to orderbook + if fake.Remaining != 0 { + break + } + } + + if iOrder >= nOrders { + return trades, nil + } + for idx := len(s.levels) - 1; idx >= 0; idx-- { // since all of uncrossOrders will be traded away and at the same uncrossing price // iceberg orders are sent in as their full value instead of refreshing at each step @@ -511,12 +563,14 @@ func (s *OrderBookSide) fakeUncrossAuction(orders []*types.Order) ([]*types.Trad fake.IcebergOrder.ReservedRemaining = 0 } + haveOffbookVolume := true + // clone price level lvl = clonePriceLevel(s.levels[idx]) - for lvl.volume > 0 { + for lvl.volume > 0 || haveOffbookVolume { // not a market order && buy side price is too low => continue if fake.Type != types.OrderTypeMarket && checkPrice(lvl.price, fake) { - continue + break } _, ntrades, _, err = lvl.uncross(fake, false) @@ -524,6 +578,18 @@ func (s *OrderBookSide) fakeUncrossAuction(orders []*types.Order) ([]*types.Trad return nil, err } trades = append(trades, ntrades...) + + if fake.Remaining != 0 { + ntrades, _ := s.uncrossOffbook(idx, fake, bound, true) + trades = append(trades, ntrades...) + + // if we couldn't consume the whole order with this AMM volume in this region + // we need to move onto the next orderbook price level + if fake.Remaining != 0 { + haveOffbookVolume = false + } + } + if fake.Remaining == 0 { iOrder++ if iOrder >= nOrders { @@ -548,9 +614,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 +678,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 +687,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 +707,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 +729,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 +742,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 +758,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..3cdfa7f7e80 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) } @@ -347,6 +347,12 @@ func TestExtractOrdersWrongVolume(t *testing.T) { assert.Panics(t, func() { side.ExtractOrders(num.NewUint(100), 4, true) }) } +func TestExtractOrdersZeroVolume(t *testing.T) { + // Attempt to extract 0 volume of orders + side := getPopulatedTestSide(types.SideSell) + assert.Len(t, side.ExtractOrders(num.NewUint(101), 0, true), 0) +} + func TestBestStatic(t *testing.T) { // Empty book emptySide := getEmptyTestSide() @@ -439,11 +445,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 +474,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 +501,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 +529,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 +556,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) } @@ -588,13 +594,13 @@ func TestFakeUncrossAuction(t *testing.T) { orders := []*types.Order{order1, order2} - fakeTrades, err := buySide.fakeUncrossAuction(orders) + fakeTrades, err := buySide.fakeUncrossAuction(orders, nil) assert.Len(t, fakeTrades, 6) assert.NoError(t, err) 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/matching/snapshot.go b/core/matching/snapshot.go index 6a690844673..b588d9c0a44 100644 --- a/core/matching/snapshot.go +++ b/core/matching/snapshot.go @@ -130,10 +130,10 @@ func (b *OrderBook) LoadState(_ context.Context, payload *types.Payload) ([]type } } - // If we are in an auction we need to build the IP&V structure if b.auction { b.indicativePriceAndVolume = NewIndicativePriceAndVolume(b.log, b.buy, b.sell) } + return nil, nil } diff --git a/core/monitor/auction.go b/core/monitor/auction.go index 090822d4dc2..3f0750932c3 100644 --- a/core/monitor/auction.go +++ b/core/monitor/auction.go @@ -105,6 +105,15 @@ func (a *AuctionState) StartPriceAuction(t time.Time, d *types.AuctionDuration) a.end = d } +func (a *AuctionState) StartLongBlockAuction(t time.Time, d int64) { + a.mode = types.MarketTradingModelLongBlockAuction + a.trigger = types.AuctionTriggerLongBlock + a.start = true + a.stop = false + a.begin = &t + a.end = &types.AuctionDuration{Duration: d} +} + func (a *AuctionState) StartGovernanceSuspensionAuction(t time.Time) { a.mode = types.MarketTradingModeSuspendedViaGovernance a.trigger = types.AuctionTriggerGovernanceSuspension @@ -156,6 +165,14 @@ func (a *AuctionState) ExtendAuctionPrice(delta types.AuctionDuration) { a.ExtendAuction(delta) } +func (a *AuctionState) ExtendAuctionLongBlock(delta types.AuctionDuration) { + t := types.AuctionTriggerLongBlock + if a.trigger != t { + a.extension = &t + } + a.ExtendAuction(delta) +} + func (a *AuctionState) ExtendAuctionSuspension(delta types.AuctionDuration) { t := types.AuctionTriggerGovernanceSuspension a.extension = &t diff --git a/core/monitor/price/pricemonitoring.go b/core/monitor/price/pricemonitoring.go index 7bd1d9b682b..baa9679075d 100644 --- a/core/monitor/price/pricemonitoring.go +++ b/core/monitor/price/pricemonitoring.go @@ -142,9 +142,9 @@ type Engine struct { asset string } -func (e *Engine) UpdateSettings(riskModel risk.Model, settings *types.PriceMonitoringSettings) { +func (e *Engine) UpdateSettings(riskModel risk.Model, settings *types.PriceMonitoringSettings, as AuctionState) { e.riskModel = riskModel - e.fpHorizons, e.bounds = computeBoundsAndHorizons(settings) + e.fpHorizons, e.bounds = computeBoundsAndHorizons(settings, as) e.initialised = false e.boundFactorsInitialised = false e.priceRangesCache = make(map[int]priceRange, len(e.bounds)) // clear the cache @@ -169,7 +169,7 @@ func NewMonitor(asset, mktID string, riskModel RangeProvider, auctionState Aucti } // Other functions depend on this sorting - horizons, bounds := computeBoundsAndHorizons(settings) + horizons, bounds := computeBoundsAndHorizons(settings, auctionState) e := &Engine{ riskModel: riskModel, @@ -251,6 +251,32 @@ func (e *Engine) GetCurrentBounds() []*types.PriceMonitoringBounds { return ret } +// GetBounds returns a list of valid price ranges per price monitoring trigger. Note these are subject to change as the time progresses. +func (e *Engine) GetBounds() []*types.PriceMonitoringBounds { + priceRanges := e.getCurrentPriceRanges(false) + ret := make([]*types.PriceMonitoringBounds, 0, len(priceRanges)) + for ind, pr := range priceRanges { + ret = append(ret, + &types.PriceMonitoringBounds{ + MinValidPrice: pr.MinPrice.Representation(), + MaxValidPrice: pr.MaxPrice.Representation(), + Trigger: e.bounds[ind].Trigger, + ReferencePrice: pr.ReferencePrice, + Active: e.bounds[ind].Active, + }) + } + + sort.SliceStable(ret, + func(i, j int) bool { + if ret[i].Trigger.Horizon == ret[j].Trigger.Horizon { + return ret[i].Trigger.Probability.LessThan(ret[j].Trigger.Probability) + } + return ret[i].Trigger.Horizon < ret[j].Trigger.Horizon + }) + + return ret +} + func (e *Engine) OnTimeUpdate(now time.Time) { e.recordTimeChange(now) } @@ -525,7 +551,9 @@ func (e *Engine) noHistory() bool { return len(e.pricesPast) == 0 && len(e.pricesNow) == 0 } -func computeBoundsAndHorizons(settings *types.PriceMonitoringSettings) (map[int64]num.Decimal, []*bound) { +func computeBoundsAndHorizons(settings *types.PriceMonitoringSettings, as AuctionState) (map[int64]num.Decimal, []*bound) { + // set bounds to inactive if we're in price monitoring auction + active := !as.IsPriceAuction() parameters := make([]*types.PriceMonitoringTrigger, 0, len(settings.Parameters.Triggers)) for _, p := range settings.Parameters.Triggers { p := *p @@ -541,7 +569,7 @@ func computeBoundsAndHorizons(settings *types.PriceMonitoringSettings) (map[int6 bounds := make([]*bound, 0, len(parameters)) for _, p := range parameters { bounds = append(bounds, &bound{ - Active: true, + Active: active, Trigger: p, }) if _, ok := horizons[p.Horizon]; !ok { diff --git a/core/monitor/price/pricemonitoring_test.go b/core/monitor/price/pricemonitoring_test.go index 4086aa600b7..e4956f0c4c0 100644 --- a/core/monitor/price/pricemonitoring_test.go +++ b/core/monitor/price/pricemonitoring_test.go @@ -48,6 +48,7 @@ func TestEmptyParametersList(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(4) auctionStateMock.EXPECT().InAuction().Return(false).Times(4) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -87,6 +88,7 @@ func TestErrorWithNilRiskModel(t *testing.T) { settings := types.PriceMonitoringSettingsFromProto(pSet) statevar := mocks.NewMockStateVarEngine(ctrl) // statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) + // auctionStateMock.EXPECT().IsPriceAuction().Times(1).Return(false) pm, err := price.NewMonitor("asset", "market", nil, auctionStateMock, settings, statevar, logging.NewTestLogger()) require.Error(t, err) require.Nil(t, pm) @@ -107,6 +109,7 @@ func TestGetHorizonYearFractions(t *testing.T) { settings := types.PriceMonitoringSettingsFromProto(pSet) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) + auctionStateMock.EXPECT().IsPriceAuction().Times(1).Return(false) pm, err := price.NewMonitor("asset", "market", riskModel, auctionStateMock, settings, statevar, logging.NewTestLogger()) require.NoError(t, err) require.NotNil(t, pm) @@ -136,6 +139,7 @@ func TestRecordPriceChange(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(4) auctionStateMock.EXPECT().InAuction().Return(false).Times(4) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -190,6 +194,7 @@ func TestCheckBoundViolationsWithinCurrentTimeWith2HorizonProbabilityPairs(t *te upFactors := []num.Decimal{pMax1.Div(cpDec), pMax2.Div(cpDec)} auctionStateMock.EXPECT().IsFBA().Return(false).AnyTimes() + auctionStateMock.EXPECT().IsPriceAuction().Return(false).AnyTimes() auctionStateMock.EXPECT().InAuction().Return(false).Times(14) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() @@ -359,6 +364,7 @@ func TestAuctionStartedAndEndendBy1Trigger(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).AnyTimes() auctionStateMock.EXPECT().InAuction().Return(false).Times(2) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -413,6 +419,7 @@ func TestAuctionStartedAndEndendBy2Triggers(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(2) auctionStateMock.EXPECT().InAuction().Return(false).Times(2) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -475,6 +482,7 @@ func TestAuctionStartedAndEndendBy1TriggerAndExtendedBy2nd(t *testing.T) { t2ub1, _ := num.UintFromDecimal(pMax2) auctionStateMock.EXPECT().IsFBA().Return(false).Times(2) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(false).Times(2) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -594,6 +602,7 @@ func TestAuctionStartedBy1TriggerAndNotExtendedBy2ndStaleTrigger(t *testing.T) { t2ub1, _ := num.UintFromDecimal(pMax2) auctionStateMock.EXPECT().IsFBA().Return(false).Times(2) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(false).Times(2) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -673,6 +682,7 @@ func TestMarketInOpeningAuction(t *testing.T) { ctx := context.Background() auctionStateMock.EXPECT().IsFBA().Return(false).Times(1) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(true).Times(1) end := now.Add(time.Second) auctionStateMock.EXPECT().ExpiresAt().Return(&end).Times(1) @@ -711,6 +721,7 @@ func TestMarketInGenericAuction(t *testing.T) { // price monitoring starts with auction, not initialised, so there's no fixed price level it'll check auctionStateMock.EXPECT().IsFBA().Return(false).AnyTimes() auctionStateMock.EXPECT().InAuction().Return(true).Times(4) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) auctionStateMock.EXPECT().CanLeave().Return(false).AnyTimes() statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -764,6 +775,7 @@ func TestGetValidPriceRange_NoTriggers(t *testing.T) { auctionStateMock.EXPECT().IsFBA().Return(false).Times(1) auctionStateMock.EXPECT().InAuction().Return(false).Times(1) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) @@ -810,6 +822,7 @@ func TestGetValidPriceRange_2triggers(t *testing.T) { currentPriceD := currentPrice.ToDecimal() auctionStateMock.EXPECT().IsFBA().Return(false).Times(12) auctionStateMock.EXPECT().InAuction().Return(false).Times(12) + auctionStateMock.EXPECT().IsPriceAuction().Return(false).Times(1) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) diff --git a/core/monitor/price/snapshot_test.go b/core/monitor/price/snapshot_test.go index 9c085b80f13..c7d30e120b6 100644 --- a/core/monitor/price/snapshot_test.go +++ b/core/monitor/price/snapshot_test.go @@ -40,6 +40,7 @@ func createPriceMonitor(t *testing.T, ctrl *gomock.Controller) *price.Engine { riskModel, auctionState, settings := createPriceMonitorDeps(t, ctrl) statevar := mocks.NewMockStateVarEngine(ctrl) statevar.EXPECT().RegisterStateVariable(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) + auctionState.EXPECT().IsPriceAuction().Times(1).Return(false) pm, err := price.NewMonitor("asset", "market", riskModel, auctionState, settings, statevar, logging.NewTestLogger()) require.NoError(t, err) diff --git a/core/monitor/price/statevar.go b/core/monitor/price/statevar.go index 13421f972e4..ee181f03abe 100644 --- a/core/monitor/price/statevar.go +++ b/core/monitor/price/statevar.go @@ -92,10 +92,6 @@ func (e *Engine) updatePriceBounds(ctx context.Context, res statevar.StateVariab func (e *Engine) updateFactors(down, up []num.Decimal) { for i, b := range e.bounds { - if !b.Active { - continue - } - b.DownFactor = down[i] b.UpFactor = up[i] } diff --git a/core/netparams/bridge_mapping.go b/core/netparams/bridge_mapping.go deleted file mode 100644 index d7b7c99f108..00000000000 --- a/core/netparams/bridge_mapping.go +++ /dev/null @@ -1,62 +0,0 @@ -// 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 netparams - -var stagnet1 = `{ - "configs": [ - { - "network_id": "421614", - "chain_id": "421614", - "collateral_bridge_contract": { - "address": "0xC873176F0fbEB036d156C9Bdb4F8288cA9D80C8b" - }, - "confirmations": 3, - "multisig_control_contract": { - "address": "0xf3fb67707ee4c2c4afd156640268dc63852F9b85", - "deployment_block_height": 37323267 - }, - "block_time": "250ms", - "name": "Arbitrum (Sepolia)" - } - ] -}` - -var testnet = `{ - "configs": [ - { - "network_id": "421614", - "chain_id": "421614", - "collateral_bridge_contract": { - "address": "0xf7989D2902376cad63D0e5B7015efD0CFAd48eB5" - }, - "confirmations": 3, - "multisig_control_contract": { - "address": "0x18E2298DC3B8F1BAa505ce27f07Dba743e205415", - "deployment_block_height": 37322191 - }, - "block_time": "250ms", - "name": "Arbitrum (Sepolia)" - } - ] -}` - -var bridgeMapping = map[string]string{ - "vega-stagnet1-202307191148": stagnet1, - "vega-fairground-202305051805": testnet, - "vega-mainnet-mirror-202306231148": "{}", - "vega-testnet-0002-v4": "{}", - "vega-mainnet-0011": "{}", -} diff --git a/core/netparams/checks/checks.go b/core/netparams/checks/checks.go index 8443ddb91d4..b28be2803df 100644 --- a/core/netparams/checks/checks.go +++ b/core/netparams/checks/checks.go @@ -44,6 +44,40 @@ func SpamPoWHashFunction(supportedFunctions []string) func(string) error { } } +func LongBlockAuctionDurationTable() func(interface{}, interface{}) error { + return func(v interface{}, _ interface{}) error { + lbadTable, ok := v.(*types.LongBlockAuctionDurationTable) + if !ok { + return fmt.Errorf("invalid long block auction duration table") + } + seenThresholds := map[string]struct{}{} + for i, tad := range lbadTable.ThresholdAndDuration { + thr, err := time.ParseDuration(tad.Threshold) + if err != nil { + return fmt.Errorf("invalid long block auction duration table - threshold at index %d is not a valid duration", i) + } + if thr.Nanoseconds() <= 0 { + return fmt.Errorf("invalid long block auction duration table - threshold at index %d is not a positive duration", i) + } + dur, err := time.ParseDuration(tad.Duration) + if err != nil { + return fmt.Errorf("invalid long block auction duration table - duration at index %d is not a valid duration", i) + } + if dur.Nanoseconds() <= 0 { + return fmt.Errorf("invalid long block auction duration table - duration at index %d is not a positive duration", i) + } + if dur.Seconds() < 1 { + return fmt.Errorf("invalid long block auction duration table - duration at index %d is less than one second", i) + } + if _, ok := seenThresholds[tad.Threshold]; ok { + return fmt.Errorf("invalid long block auction duration table - duplicate threshold") + } + seenThresholds[tad.Threshold] = struct{}{} + } + return nil + } +} + func MarginScalingFactor() func(interface{}, interface{}) error { return func(v interface{}, _ interface{}) error { sf := v.(*types.ScalingFactors) diff --git a/core/netparams/checks/checks_test.go b/core/netparams/checks/checks_test.go new file mode 100644 index 00000000000..d2acf004efd --- /dev/null +++ b/core/netparams/checks/checks_test.go @@ -0,0 +1,94 @@ +// 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 checks_test + +import ( + "testing" + + "code.vegaprotocol.io/vega/core/netparams/checks" + types "code.vegaprotocol.io/vega/protos/vega" + + "github.com/stretchr/testify/require" +) + +func TestLongBlockChecks(t *testing.T) { + // wrong type - error + type Junk struct{} + require.Equal(t, "invalid long block auction duration table", checks.LongBlockAuctionDurationTable()(&Junk{}, &Junk{}).Error()) + + // empty - is fine + table := &types.LongBlockAuctionDurationTable{} + require.NoError(t, checks.LongBlockAuctionDurationTable()(table, nil)) + + // invalid threshold at index 0 - error + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "banana", Duration: "1s"}} + require.Equal(t, "invalid long block auction duration table - threshold at index 0 is not a valid duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "-1", Duration: "1s"}} + require.Equal(t, "invalid long block auction duration table - threshold at index 0 is not a valid duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "-1s", Duration: "1s"}} + require.Equal(t, "invalid long block auction duration table - threshold at index 0 is not a positive duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "0s", Duration: "1s"}} + require.Equal(t, "invalid long block auction duration table - threshold at index 0 is not a positive duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + // invalid duration a index 0 - error + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "banana"}} + require.Equal(t, "invalid long block auction duration table - duration at index 0 is not a valid duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "-1"}} + require.Equal(t, "invalid long block auction duration table - duration at index 0 is not a valid duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "-1s"}} + require.Equal(t, "invalid long block auction duration table - duration at index 0 is not a positive duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "0s"}} + require.Equal(t, "invalid long block auction duration table - duration at index 0 is not a positive duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "0.5s"}} + require.Equal(t, "invalid long block auction duration table - duration at index 0 is less than one second", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + // invalid threshold at index 1 - error + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "1s"}, {Threshold: "banana", Duration: "1s"}} + require.Equal(t, "invalid long block auction duration table - threshold at index 1 is not a valid duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "1s"}, {Threshold: "-1", Duration: "1s"}} + require.Equal(t, "invalid long block auction duration table - threshold at index 1 is not a valid duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "1s"}, {Threshold: "-1s", Duration: "1s"}} + require.Equal(t, "invalid long block auction duration table - threshold at index 1 is not a positive duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "1s"}, {Threshold: "0s", Duration: "1s"}} + require.Equal(t, "invalid long block auction duration table - threshold at index 1 is not a positive duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + // invalid duration a index 1 - error + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "1s"}, {Threshold: "1s", Duration: "banana"}} + require.Equal(t, "invalid long block auction duration table - duration at index 1 is not a valid duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "1s"}, {Threshold: "1s", Duration: "-1"}} + require.Equal(t, "invalid long block auction duration table - duration at index 1 is not a valid duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "1s"}, {Threshold: "1s", Duration: "-1s"}} + require.Equal(t, "invalid long block auction duration table - duration at index 1 is not a positive duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "1s"}, {Threshold: "1s", Duration: "0s"}} + require.Equal(t, "invalid long block auction duration table - duration at index 1 is not a positive duration", checks.LongBlockAuctionDurationTable()(table, nil).Error()) + + // duplicate threshold - error + table.ThresholdAndDuration = []*types.LongBlockAuction{{Threshold: "1s", Duration: "1s"}, {Threshold: "1s", Duration: "100s"}} + require.Equal(t, "invalid long block auction duration table - duplicate threshold", checks.LongBlockAuctionDurationTable()(table, nil).Error()) +} diff --git a/core/netparams/defaults.go b/core/netparams/defaults.go index cef5923ac03..b2f6e4009c0 100644 --- a/core/netparams/defaults.go +++ b/core/netparams/defaults.go @@ -67,16 +67,27 @@ var ( func defaultNetParams() map[string]value { m := map[string]value{ + NetworkWideAuctionDuration: NewJSON(&proto.LongBlockAuctionDurationTable{}, checks.LongBlockAuctionDurationTable()).Mutable(true).MustUpdate(`{"threshold_and_duration": [{"threshold":"10s","duration":"1m"},{"threshold":"1m","duration":"5m"},{"threshold":"10m","duration":"1h"},{"threshold":"1h","duration":"1h"},{"threshold":"6h","duration":"3h"},{"threshold":"24h","duration":"6h"}]}`), + MinimalMarginQuantumMultiple: NewDecimal(gteD0).Mutable(true).MustUpdate("0"), + MinimalHoldingQuantumMultiple: NewDecimal(gteD0).Mutable(true).MustUpdate("0"), + // spots SpotMarketTradingEnabled: NewInt(gteI0, lteI1).Mutable(true).MustUpdate("1"), // 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(gteU0).Mutable(true).MustUpdate("100"), + MarketAMMMaxCalculationLevels: NewUint(gteU1).Mutable(true).MustUpdate("1000"), + // markets + MarketAggressiveOrderBlockDelay: NewUint(gteU0).Mutable(true).MustUpdate("1"), 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"), MarketFeeFactorsInfrastructureFee: NewDecimal(gteD0, lteD1).Mutable(true).MustUpdate("0.0005"), @@ -100,6 +111,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"), @@ -295,6 +307,7 @@ func defaultNetParams() map[string]value { RewardsVestingBaseRate: NewDecimal(gtD0, lteD1).Mutable(true).MustUpdate("0.25"), RewardsVestingMinimumTransfer: NewDecimal(gtD0).Mutable(true).MustUpdate("10"), RewardsVestingBenefitTiers: NewJSON(&proto.VestingBenefitTiers{}, types.CheckUntypedVestingBenefitTier).Mutable(true).MustUpdate(`{"tiers": []}`), + RewardsUpdateFrequency: NewDuration(gte1s).Mutable(true).MustUpdate("10m"), // Referral program ReferralProgramMaxReferralTiers: NewUint(UintGTE(num.NewUint(0)), UintLTE(num.NewUint(100))).Mutable(true).MustUpdate("10"), diff --git a/core/netparams/keys.go b/core/netparams/keys.go index 46a3ccbcc53..1800fb97a0a 100644 --- a/core/netparams/keys.go +++ b/core/netparams/keys.go @@ -18,14 +18,20 @@ package netparams const ( SpotMarketTradingEnabled = "limits.markets.proposeSpotEnabled" PerpsMarketTradingEnabled = "limits.markets.proposePerpetualEnabled" + AMMMarketTradingEnabled = "limits.markets.ammPoolEnabled" EthereumOraclesEnabled = "ethereum.oracles.enabled" + NetworkWideAuctionDuration = "auction.LongBlock" + MarketMarginScalingFactors = "market.margin.scalingFactors" MarketFeeFactorsMakerFee = "market.fee.factors.makerFee" MarketFeeFactorsInfrastructureFee = "market.fee.factors.infrastructureFee" MarketAuctionMinimumDuration = "market.auction.minimumDuration" MarketAuctionMaximumDuration = "market.auction.maximumDuration" + MinimalMarginQuantumMultiple = "spam.order.minimalMarginQuantumMultiple" + MinimalHoldingQuantumMultiple = "spam.order.minimalHoldingQuantumMultiple" + MarketTargetStakeTimeWindow = "market.stake.target.timeWindow" MarketTargetStakeScalingFactor = "market.stake.target.scalingFactor" MarketLiquidityTargetStakeTriggeringRatio = "market.liquidity.targetstake.triggering.ratio" @@ -46,6 +52,9 @@ const ( MarketLiquiditySLANonPerformanceBondPenaltySlope = "market.liquidity.sla.nonPerformanceBondPenaltySlope" MarketLiquidityStakeToCCYVolume = "market.liquidity.stakeToCcyVolume" MarketLiquidityProvidersFeeCalculationTimeStep = "market.liquidity.providersFeeCalculationTimeStep" + MarketLiquidityEquityLikeShareFeeFraction = "market.liquidity.equityLikeShareFeeFraction" + + MarketAggressiveOrderBlockDelay = "market.aggressiveOrderBlockDelay" RewardAsset = "reward.asset" @@ -155,6 +164,7 @@ const ( RewardMarketCreationQuantumMultiple = "rewards.marketCreationQuantumMultiple" MinEpochsInTeamForMetricRewardEligibility = "rewards.team.minEpochsInTeam" + RewardsUpdateFrequency = "rewards.updateFrequency" // spam policies params. SpamProtectionMaxVotes = "spam.protection.max.votes" @@ -259,6 +269,9 @@ const ( RewardsActivityStreakInactivityLimit = "rewards.activityStreak.inactivityLimit" RewardsActivityStreakMinQuantumOpenVolume = "rewards.activityStreak.minQuantumOpenVolume" RewardsActivityStreakMinQuantumTradeVolume = "rewards.activityStreak.minQuantumTradeVolume" + + MarketAMMMinCommitmentQuantum = "market.amm.minCommitmentQuantum" + MarketAMMMaxCalculationLevels = "market.liquidity.maxAmmCalculationLevels" ) var Deprecated = map[string]struct{}{ @@ -271,8 +284,12 @@ var Deprecated = map[string]struct{}{ } var AllKeys = map[string]struct{}{ + NetworkWideAuctionDuration: {}, + RewardsUpdateFrequency: {}, SpamProtectionMaxUpdatePartyProfile: {}, SpamProtectionUpdateProfileMinFunds: {}, + MarketAMMMinCommitmentQuantum: {}, + MarketAMMMaxCalculationLevels: {}, GovernanceProposalVolumeDiscountProgramMinClose: {}, GovernanceProposalVolumeDiscountProgramMaxClose: {}, GovernanceProposalVolumeDiscountProgramMinEnact: {}, @@ -292,12 +309,14 @@ var AllKeys = map[string]struct{}{ RewardsVestingBaseRate: {}, SpotMarketTradingEnabled: {}, PerpsMarketTradingEnabled: {}, + AMMMarketTradingEnabled: {}, EthereumOraclesEnabled: {}, MaxPeggedOrders: {}, MaxGasPerBlock: {}, DefaultGas: {}, MinBlockCapacity: {}, RewardMarketCreationQuantumMultiple: {}, + MarketAggressiveOrderBlockDelay: {}, MarketMarginScalingFactors: {}, MarketFeeFactorsMakerFee: {}, MarketFeeFactorsInfrastructureFee: {}, @@ -311,6 +330,7 @@ var AllKeys = map[string]struct{}{ MarketLiquiditySLANonPerformanceBondPenaltyMax: {}, MarketLiquidityStakeToCCYVolume: {}, MarketLiquidityProvidersFeeCalculationTimeStep: {}, + MarketLiquidityEquityLikeShareFeeFraction: {}, MarketTargetStakeTimeWindow: {}, MarketTargetStakeScalingFactor: {}, MarketPriceMonitoringDefaultParameters: {}, @@ -452,4 +472,6 @@ var AllKeys = map[string]struct{}{ SpamProtectionApplyReferralMinFunds: {}, SpamProtectionReferralSetMinFunds: {}, BlockchainsEthereumL2Configs: {}, + MinimalMarginQuantumMultiple: {}, + MinimalHoldingQuantumMultiple: {}, } diff --git a/core/netparams/snapshot.go b/core/netparams/snapshot.go index 984a912d71e..ddf99fa6270 100644 --- a/core/netparams/snapshot.go +++ b/core/netparams/snapshot.go @@ -17,6 +17,7 @@ package netparams import ( "context" + "encoding/json" "fmt" "sort" @@ -144,33 +145,24 @@ func (s *Store) LoadState(ctx context.Context, pl *types.Payload) ([]types.State } } - // TODO use a UpgradeFrom tag when we know which versions we will upgrade from - if vgcontext.InProgressUpgrade(ctx) { - haveConfig := false - bridgeConfigs := &vegapb.EVMBridgeConfigs{} - if err := s.GetJSONStruct(BlockchainsEVMBridgeConfigs, bridgeConfigs); err == nil { - haveConfig = bridgeConfigs.Configs[0].ChainId != "XXX" + if vgcontext.InProgressUpgradeFrom(ctx, "v0.76.8") { + bridgeConfig := &vegapb.EthereumConfig{} + if err := s.GetJSONStruct(BlockchainsPrimaryEthereumConfig, bridgeConfig); err != nil { + s.log.Panic("expected ethereum block chain config", logging.Error(err)) } - // if the config hasn't been set, then initialise it from the bridge mapping - // this is to initially avoid having to know which version we are upgrading from on our test networks - if !haveConfig { - vgChainID, err := vgcontext.ChainIDFromContext(ctx) + // update ethereum config block-time to 12s + if bridgeConfig.BlockTime == "" { + bridgeConfig.BlockTime = "12s" + v, err := json.Marshal(bridgeConfig) if err != nil { - panic(fmt.Errorf("no vega chain ID found in context: %w", err)) + s.log.Panic("unable to update ethereum chain block time", logging.Error(err)) } - if secondaryEthConf, ok := bridgeMapping[vgChainID]; ok { - s.log.Info("setting second bridge config during upgrade", logging.String("cfg", secondaryEthConf)) - if err := s.UpdateOptionalValidation(ctx, BlockchainsEVMBridgeConfigs, secondaryEthConf, false, false); err != nil { - return nil, err - } + if err := s.UpdateOptionalValidation(ctx, BlockchainsPrimaryEthereumConfig, string(v), false, false); err != nil { + return nil, err } } - - if err := s.UpdateOptionalValidation(ctx, SpotMarketTradingEnabled, "1", false, false); err != nil { - return nil, err - } } // Now they have been loaded, dispatch the changes so that the other engines pick them up diff --git a/core/nodewallets/commander.go b/core/nodewallets/commander.go index b6927130722..f483e71e44f 100644 --- a/core/nodewallets/commander.go +++ b/core/nodewallets/commander.go @@ -70,6 +70,36 @@ func NewCommander(cfg Config, log *logging.Logger, bc Chain, w *vega.Wallet, bst }, nil } +func (c *Commander) NewTransaction(ctx context.Context, cmd txn.Command, payload proto.Message) ([]byte, error) { + chainID, err := c.bc.GetChainID(ctx) + if err != nil { + c.log.Error("couldn't retrieve chain ID", + logging.Error(err), + ) + return nil, err + } + inputData := commands.NewInputData(c.bstats.Height()) + wrapPayloadIntoInputData(inputData, cmd, payload) + marshalInputData, err := commands.MarshalInputData(inputData) + if err != nil { + // this should never be possible + c.log.Panic("could not marshal core transaction", logging.Error(err)) + } + + signature, err := c.sign(commands.BundleInputDataForSigning(marshalInputData, chainID)) + if err != nil { + // this should never be possible too + c.log.Panic("could not sign command", logging.Error(err)) + } + + tx := commands.NewTransaction(c.wallet.PubKey().Hex(), marshalInputData, signature) + marshalledTx, err := proto.Marshal(tx) + if err != nil { + return nil, err + } + return marshalledTx, nil +} + // Command - send command to chain. // Note: beware when passing in an exponential back off since the done function may be called many times. func (c *Commander) Command(ctx context.Context, cmd txn.Command, payload proto.Message, done func(string, error), bo *backoff.ExponentialBackOff) { @@ -165,6 +195,12 @@ func wrapPayloadIntoInputData(data *commandspb.InputData, cmd txn.Command, paylo switch cmd { case txn.SubmitOrderCommand, txn.CancelOrderCommand, txn.AmendOrderCommand, txn.VoteCommand, txn.WithdrawCommand, txn.LiquidityProvisionCommand, txn.ProposeCommand, txn.BatchProposeCommand, txn.SubmitOracleDataCommand, txn.StopOrdersCancellationCommand, txn.StopOrdersSubmissionCommand: panic("command is not supported to be sent by a node.") + case txn.DelayedTransactionsWrapper: + if underlyingCmd, ok := payload.(*commandspb.DelayedTransactionsWrapper); ok { + data.Command = &commandspb.InputData_DelayedTransactionsWrapper{ + DelayedTransactionsWrapper: underlyingCmd, + } + } case txn.ProtocolUpgradeCommand: if underlyingCmd, ok := payload.(*commandspb.ProtocolUpgradeProposal); ok { data.Command = &commandspb.InputData_ProtocolUpgradeProposal{ diff --git a/core/parties/engine.go b/core/parties/engine.go index cdd23adefa2..7ae5f6f2175 100644 --- a/core/parties/engine.go +++ b/core/parties/engine.go @@ -25,6 +25,8 @@ import ( "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/libs/num" commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" + + "golang.org/x/exp/maps" ) var ( @@ -45,6 +47,47 @@ func (e *Engine) OnMinBalanceForUpdatePartyProfileUpdated(_ context.Context, min return nil } +func (e *Engine) AssignDeriveKey(ctx context.Context, party types.PartyID, derivedKey string) { + if _, ok := e.profiles[party]; !ok { + e.profiles[party] = &types.PartyProfile{ + PartyID: party, + Metadata: map[string]string{}, + DerivedKeys: map[string]struct{}{}, + } + } + + e.profiles[party].DerivedKeys[derivedKey] = struct{}{} +} + +func (e *Engine) CheckDerivedKeyOwnership(party types.PartyID, derivedKey string) bool { + partyProfile, ok := e.profiles[party] + if !ok { + return false + } + + _, ok = partyProfile.DerivedKeys[derivedKey] + return ok +} + +// RelatedKeys returns all keys related to the specified key. +// If a derived key is provided, it returns all other derived keys and the party key. +// If a party key is provided, it returns all derived keys and the party key itself. +// The keys will be in an indeterminate order. +func (e *Engine) RelatedKeys(key string) (*types.PartyID, []string) { + profile, ok := e.profiles[types.PartyID(key)] + if ok { + return &profile.PartyID, maps.Keys(profile.DerivedKeys) + } + + for _, profile := range e.profiles { + if _, ok := profile.DerivedKeys[key]; ok { + return &profile.PartyID, maps.Keys(profile.DerivedKeys) + } + } + + return nil, nil +} + func (e *Engine) CheckSufficientBalanceToUpdateProfile(party types.PartyID, balance *num.Uint) error { if balance.LT(e.minBalanceToUpdateProfile) { return fmt.Errorf("party %q does not have sufficient balance to update profile code, required balance %s available balance %s", party, e.minBalanceToUpdateProfile.String(), balance.String()) @@ -60,7 +103,8 @@ func (e *Engine) UpdateProfile(ctx context.Context, partyID types.PartyID, cmd * profile, exists := e.profiles[partyID] if !exists { profile = &types.PartyProfile{ - PartyID: partyID, + PartyID: partyID, + DerivedKeys: map[string]struct{}{}, } e.profiles[partyID] = profile } @@ -89,6 +133,11 @@ func (e *Engine) loadPartiesFromSnapshot(partiesPayload *types.PayloadParties) { profile.Metadata[m.Key] = m.Value } + profile.DerivedKeys = map[string]struct{}{} + for _, val := range profilePayload.DerivedKeys { + profile.DerivedKeys[val] = struct{}{} + } + e.profiles[profile.PartyID] = profile } } diff --git a/core/parties/engine_test.go b/core/parties/engine_test.go index a772b6232c7..1d0326ddb7b 100644 --- a/core/parties/engine_test.go +++ b/core/parties/engine_test.go @@ -86,6 +86,7 @@ func TestUpdatingProfiles(t *testing.T) { "key2": "value2", "key3": "value3", }, + DerivedKeys: map[string]struct{}{}, }, { PartyID: party2, @@ -93,6 +94,7 @@ func TestUpdatingProfiles(t *testing.T) { Metadata: map[string]string{ "key1": "value1", }, + DerivedKeys: map[string]struct{}{}, }, }, te.engine.ListProfiles()) @@ -100,3 +102,90 @@ func TestUpdatingProfiles(t *testing.T) { Alias: "network", })) } + +func TestAssigningDerivedKeys(t *testing.T) { + ctx := vgtest.VegaContext(vgrand.RandomStr(5), vgtest.RandomI64()) + + te := newEngine(t) + + party1 := newPartyID(t) + + // Non-existing party + require.False(t, te.engine.CheckDerivedKeyOwnership(party1, "derivedKey1")) + + // Assigning derived keys create profile if it doesn't exist + te.engine.AssignDeriveKey(ctx, party1, "derivedKey1") + te.engine.AssignDeriveKey(ctx, party1, "derivedKey2") + + require.True(t, te.engine.CheckDerivedKeyOwnership(party1, "derivedKey1")) + require.True(t, te.engine.CheckDerivedKeyOwnership(party1, "derivedKey2")) + require.False(t, te.engine.CheckDerivedKeyOwnership(party1, "derivedKey3")) + + // Updating profile doesn't remove derived keys and still works + expectPartyProfileUpdatedEvent(t, te) + require.NoError(t, te.engine.UpdateProfile(ctx, party1, &commandspb.UpdatePartyProfile{ + Alias: "test1", + Metadata: []*vegapb.Metadata{ + { + Key: "key1", + Value: "value1", + }, + }, + })) + + party2 := newPartyID(t) + + expectPartyProfileUpdatedEvent(t, te) + require.NoError(t, te.engine.UpdateProfile(ctx, party2, &commandspb.UpdatePartyProfile{ + Alias: "test2", + Metadata: []*vegapb.Metadata{ + { + Key: "key1", + Value: "value1", + }, + }, + })) + + expectPartyProfileUpdatedEvent(t, te) + require.NoError(t, te.engine.UpdateProfile(ctx, party1, &commandspb.UpdatePartyProfile{ + Alias: "test1", + Metadata: []*vegapb.Metadata{ + { + Key: "key2", + Value: "value2", + }, + { + Key: "key3", + Value: "value3", + }, + }, + })) + + // Assign key for party 2 + te.engine.AssignDeriveKey(ctx, party2, "derivedKey3") + + // Attempt using alias from party 2. + require.Error(t, te.engine.UpdateProfile(ctx, party1, &commandspb.UpdatePartyProfile{ + Alias: "test2", + })) + + assertEqualProfiles(t, []types.PartyProfile{ + { + PartyID: party1, + Alias: "test1", + Metadata: map[string]string{ + "key2": "value2", + "key3": "value3", + }, + DerivedKeys: map[string]struct{}{"derivedKey1": {}, "derivedKey2": {}}, + }, + { + PartyID: party2, + Alias: "test2", + Metadata: map[string]string{ + "key1": "value1", + }, + DerivedKeys: map[string]struct{}{"derivedKey3": {}}, + }, + }, te.engine.ListProfiles()) +} diff --git a/core/parties/snapshot.go b/core/parties/snapshot.go index 05511030541..8a65f320dab 100644 --- a/core/parties/snapshot.go +++ b/core/parties/snapshot.go @@ -107,6 +107,13 @@ func (e *SnapshottedEngine) serialiseParties() ([]byte, error) { return strings.Compare(a.Key, b.Key) }) + for k := range profile.DerivedKeys { + profileSnapshot.DerivedKeys = append(profileSnapshot.DerivedKeys, k) + } + + // Ensure deterministic order among the derived keys. + slices.Sort(profileSnapshot.DerivedKeys) + profilesSnapshot = append(profilesSnapshot, profileSnapshot) } diff --git a/core/parties/snapshot_test.go b/core/parties/snapshot_test.go index 0e1b3910b4f..b46d3d246a9 100644 --- a/core/parties/snapshot_test.go +++ b/core/parties/snapshot_test.go @@ -93,6 +93,7 @@ func TestTakingAndRestoringSnapshotSucceeds(t *testing.T) { Metadata: map[string]string{ "key1": "value1", }, + DerivedKeys: map[string]struct{}{}, }, { PartyID: party2, @@ -100,6 +101,7 @@ func TestTakingAndRestoringSnapshotSucceeds(t *testing.T) { Metadata: map[string]string{ "key1": "value1", }, + DerivedKeys: map[string]struct{}{}, }, { PartyID: party3, @@ -107,6 +109,7 @@ func TestTakingAndRestoringSnapshotSucceeds(t *testing.T) { Metadata: map[string]string{ "key1": "value1", }, + DerivedKeys: map[string]struct{}{}, }, }, te.engine.ListProfiles()) } 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/pow/engine.go b/core/pow/engine.go index eb28c8cfdca..467b790520d 100644 --- a/core/pow/engine.go +++ b/core/pow/engine.go @@ -250,7 +250,7 @@ func (e *Engine) updatePowState(txs []abci.Tx) { } for i, p := range e.activeParams { - outOfScopeBlock := int64(e.currentBlock) + 1 - int64(p.spamPoWNumberOfPastBlocks) + outOfScopeBlock := int64(e.currentBlock) - int64(p.spamPoWNumberOfPastBlocks) if outOfScopeBlock < 0 { continue } diff --git a/core/pow/engine_test.go b/core/pow/engine_test.go index 68ba599d41e..7bd508aac81 100644 --- a/core/pow/engine_test.go +++ b/core/pow/engine_test.go @@ -232,7 +232,7 @@ func TestDeliverTxDuplciateNonce(t *testing.T) { require.Equal(t, 2, len(e.heightToNonceRef[100])) // check the maps are purged when we leave scope - e.BeginBlock(104, crypto.RandomHash(), []abci.Tx{}) + e.BeginBlock(105, crypto.RandomHash(), []abci.Tx{}) require.Equal(t, 0, len(e.seenTid)) require.Equal(t, 0, len(e.heightToTid)) require.Equal(t, 0, len(e.heightToNonceRef)) diff --git a/core/processor/abci.go b/core/processor/abci.go index a18547adf75..5e3b598ea0d 100644 --- a/core/processor/abci.go +++ b/core/processor/abci.go @@ -40,7 +40,6 @@ import ( "code.vegaprotocol.io/vega/core/idgeneration" "code.vegaprotocol.io/vega/core/netparams" "code.vegaprotocol.io/vega/core/pow" - "code.vegaprotocol.io/vega/core/processor/ratelimit" "code.vegaprotocol.io/vega/core/snapshot" "code.vegaprotocol.io/vega/core/teams" "code.vegaprotocol.io/vega/core/txn" @@ -87,6 +86,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) } @@ -192,6 +192,14 @@ type EthCallEngine interface { Start() } +type TxCache interface { + SetRawTxs(rtx [][]byte, height uint64) + GetRawTxs(height uint64) [][]byte + NewDelayedTransaction(ctx context.Context, delayed [][]byte, height uint64) []byte + IsDelayRequired(marketID string) bool + IsDelayRequiredAnyMarket() bool +} + type App struct { abci *abci.App currentTimestamp time.Time @@ -210,7 +218,6 @@ type App struct { log *logging.Logger cancelFn func() stopBlockchain func() error - rates *ratelimit.Rates // service injection assets Assets @@ -218,6 +225,7 @@ type App struct { broker Broker witness Witness evtForwarder EvtForwarder + evtHeartbeat EvtForwarderHeartbeat primaryChainID uint64 secondaryChainID uint64 exec ExecutionEngine @@ -254,6 +262,7 @@ type App struct { nilSpam bool maxBatchSize atomic.Uint64 + txCache TxCache } func NewApp(log *logging.Logger, @@ -266,6 +275,7 @@ func NewApp(log *logging.Logger, broker Broker, witness Witness, evtForwarder EvtForwarder, + evtHeartbeat EvtForwarderHeartbeat, exec ExecutionEngine, ghandler *genesis.Handler, gov GovernanceEngine, @@ -298,6 +308,7 @@ func NewApp(log *logging.Logger, ethCallEngine EthCallEngine, balanceChecker BalanceChecker, partiesEngine PartiesEngine, + txCache TxCache, ) *App { log = log.Named(namedLogger) log.SetLevel(config.Level.Get()) @@ -305,20 +316,17 @@ func NewApp(log *logging.Logger, app := &App{ abci: abci.New(codec), - log: log, - vegaPaths: vegaPaths, - cfg: config, - cancelFn: cancelFn, - stopBlockchain: stopBlockchain, - rates: ratelimit.New( - config.Ratelimit.Requests, - config.Ratelimit.PerNBlocks, - ), + log: log, + vegaPaths: vegaPaths, + cfg: config, + cancelFn: cancelFn, + stopBlockchain: stopBlockchain, assets: assets, banking: banking, broker: broker, witness: witness, evtForwarder: evtForwarder, + evtHeartbeat: evtHeartbeat, exec: exec, ghandler: ghandler, gov: gov, @@ -350,6 +358,7 @@ func NewApp(log *logging.Logger, ethCallEngine: ethCallEngine, balanceChecker: balanceChecker, partiesEngine: partiesEngine, + txCache: txCache, } // setup handlers @@ -385,12 +394,20 @@ func NewApp(log *logging.Logger, HandleCheckTx(txn.TransferFundsCommand, app.CheckTransferCommand). HandleCheckTx(txn.ApplyReferralCodeCommand, app.CheckApplyReferralCode). HandleCheckTx(txn.CreateReferralSetCommand, app.CheckCreateOrUpdateReferralSet). - HandleCheckTx(txn.UpdateReferralSetCommand, app.CheckCreateOrUpdateReferralSet) - - app.abci. - // node commands - HandleDeliverTx(txn.NodeSignatureCommand, - app.RequireValidatorPubKeyW(app.DeliverNodeSignature)). + HandleCheckTx(txn.UpdateReferralSetCommand, app.CheckCreateOrUpdateReferralSet). + HandleCheckTx(txn.SubmitOrderCommand, app.CheckOrderSubmissionForSpam). + HandleCheckTx(txn.LiquidityProvisionCommand, app.CheckLPSubmissionForSpam). + HandleCheckTx(txn.AmendLiquidityProvisionCommand, app.CheckLPAmendForSpam). + HandleCheckTx(txn.SubmitAMMCommand, app.CheckSubmitAmmForSpam). + HandleCheckTx(txn.AmendAMMCommand, app.CheckAmendAmmForSpam). + HandleCheckTx(txn.AmendOrderCommand, app.CheckAmendOrderForSpam). + HandleCheckTx(txn.CancelOrderCommand, app.CheckCancelOrderForSpam). + HandleCheckTx(txn.CancelAMMCommand, app.CheckCancelAmmForSpam). + HandleCheckTx(txn.CancelLiquidityProvisionCommand, app.CheckCancelLPForSpam) + + // node commands + app.abci.HandleDeliverTx(txn.NodeSignatureCommand, + app.RequireValidatorPubKeyW(app.DeliverNodeSignature)). HandleDeliverTx(txn.NodeVoteCommand, app.RequireValidatorPubKeyW(app.DeliverNodeVote)). HandleDeliverTx(txn.ChainEventCommand, @@ -451,6 +468,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))). @@ -517,7 +549,9 @@ func NewApp(log *logging.Logger, ). HandleDeliverTx(txn.UpdatePartyProfileCommand, app.SendTransactionResult(app.UpdatePartyProfile), - ) + ). + HandleDeliverTx(txn.DelayedTransactionsWrapper, + app.SendTransactionResult(app.handleDelayedTransactionWrapper)) app.time.NotifyOnTick(app.onTick) @@ -851,14 +885,50 @@ func (app *App) OnInitChain(req *tmtypes.RequestInitChain) (*tmtypes.ResponseIni // 4. we never add transactions failing spam checks // therefore a block generated with this method will never contain any transactions that would violate spam/pow constraints that would have previously // caused the party to get blocked. -func (app *App) prepareProposal(txs []abci.Tx, rawTxs [][]byte) [][]byte { +func (app *App) prepareProposal(height uint64, txs []abci.Tx, rawTxs [][]byte) [][]byte { var totalBytes int64 + validationResults := []pow.ValidationEntry{} // internally we use this as max bytes, externally to consensus params we return max ints. This is done so that cometbft always returns to us the full mempool // and we can first sort it by priority and then reap by size. maxBytes := tmtypesint.DefaultBlockParams().MaxBytes * 4 app.log.Debug("prepareProposal called with", logging.Int("txs", len(rawTxs)), logging.Int64("max-bytes", maxBytes)) + // as transactions that are wrapped for sending in the next block are not removed from the mempool + // to avoid adding them both from the mempool and from the cache we need to check + // they were not in the cache. + // we still need to check that the transactions from previous block are passing pow and spam requirements. + addedFromPreviousHash := map[string]struct{}{} + delayedTxs := [][]byte{} + for _, txx := range app.txCache.GetRawTxs(height) { + tx, err := app.abci.GetTx(txx) + if err != nil { + continue + } + if !app.nilPow { + vr, d := app.pow.CheckBlockTx(tx) + validationResults = append(validationResults, pow.ValidationEntry{Tx: tx, Difficulty: d, ValResult: vr}) + if vr != pow.ValidationResultSuccess && vr != pow.ValidationResultValidatorCommand { + app.log.Debug("pow failure", logging.Int64("validation-result", int64(vr))) + continue + } + } + if !app.nilSpam { + err := app.spam.CheckBlockTx(tx) + if err != nil { + app.log.Debug("spam error", logging.Error(err)) + continue + } + } + if err := app.canSubmitTx(tx); err != nil { + continue + } + + addedFromPreviousHash[hex.EncodeToString(tx.Hash())] = struct{}{} + delayedTxs = append(delayedTxs, txx) + totalBytes += int64(len(txx)) + } + // wrap the transaction with information about gas wanted and priority wrappedTxs := make([]*TxWrapper, 0, len(txs)) for i, v := range txs { @@ -866,6 +936,10 @@ func (app *App) prepareProposal(txs []abci.Tx, rawTxs [][]byte) [][]byte { if error != nil { continue } + if _, ok := addedFromPreviousHash[hex.EncodeToString(wtx.tx.Hash())]; ok { + app.log.Debug("ignoring mempool transaction corresponding to a delayed transaction from previous block") + continue + } wrappedTxs = append(wrappedTxs, wtx) } @@ -878,10 +952,12 @@ func (app *App) prepareProposal(txs []abci.Tx, rawTxs [][]byte) [][]byte { }) // add transactions to the block as long as we can without breaking size and gas limits in order of priority - validationResults := []pow.ValidationEntry{} maxGas := app.getMaxGas() totalGasWanted := uint64(0) - blockTxs := [][]byte{} + cancellations := [][]byte{} + postOnly := [][]byte{} + anythingElseFromThisBlock := [][]byte{} + nextBlockRtx := [][]byte{} for _, tx := range wrappedTxs { totalBytes += int64(len(tx.raw)) @@ -893,6 +969,11 @@ func (app *App) prepareProposal(txs []abci.Tx, rawTxs [][]byte) [][]byte { break } + if tx.tx.Command() == txn.DelayedTransactionsWrapper { + app.log.Debug("delayed transaction wrapper should never be submitted into the mempool") + continue + } + if !app.nilPow { vr, d := app.pow.CheckBlockTx(tx.tx) validationResults = append(validationResults, pow.ValidationEntry{Tx: tx.tx, Difficulty: d, ValResult: vr}) @@ -913,10 +994,200 @@ func (app *App) prepareProposal(txs []abci.Tx, rawTxs [][]byte) [][]byte { if err := app.canSubmitTx(tx.tx); err != nil { continue } - app.log.Debug("adding tx to blockProposal", logging.String("tx-hash", hex.EncodeToString(tx.tx.Hash())), logging.String("tid", tx.tx.GetPoWTID())) - blockTxs = append(blockTxs, tx.raw) + + switch tx.tx.Command() { + case txn.CancelOrderCommand: + s := &commandspb.OrderCancellation{} + if err := tx.tx.Unmarshal(s); err != nil { + continue + } + if len(s.MarketId) > 0 { + if app.txCache.IsDelayRequired(s.MarketId) { + cancellations = append(cancellations, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + } else if app.txCache.IsDelayRequiredAnyMarket() { + cancellations = append(cancellations, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + case txn.CancelAMMCommand: + s := &commandspb.CancelAMM{} + if err := tx.tx.Unmarshal(s); err != nil { + continue + } + if len(s.MarketId) > 0 { + if app.txCache.IsDelayRequired(s.MarketId) { + cancellations = append(cancellations, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + } else if app.txCache.IsDelayRequiredAnyMarket() { + cancellations = append(cancellations, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + case txn.StopOrdersCancellationCommand: + s := &commandspb.StopOrdersCancellation{} + if err := tx.tx.Unmarshal(s); err != nil { + continue + } + if s.MarketId != nil { + if app.txCache.IsDelayRequired(*s.MarketId) { + cancellations = append(cancellations, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + } else if app.txCache.IsDelayRequiredAnyMarket() { + cancellations = append(cancellations, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + case txn.SubmitOrderCommand: + s := &commandspb.OrderSubmission{} + if err := tx.tx.Unmarshal(s); err != nil { + continue + } + if s.PostOnly { + postOnly = append(postOnly, tx.raw) + } else if app.txCache.IsDelayRequired(s.MarketId) { + nextBlockRtx = append(nextBlockRtx, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + case txn.AmendOrderCommand: + s := &commandspb.OrderAmendment{} + if err := tx.tx.Unmarshal(s); err != nil { + continue + } + if app.txCache.IsDelayRequired(s.MarketId) { + nextBlockRtx = append(nextBlockRtx, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + case txn.AmendAMMCommand: + s := &commandspb.AmendAMM{} + if err := tx.tx.Unmarshal(s); err != nil { + continue + } + if app.txCache.IsDelayRequired(s.MarketId) { + nextBlockRtx = append(nextBlockRtx, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + case txn.StopOrdersSubmissionCommand: + s := &commandspb.StopOrdersSubmission{} + if err := tx.tx.Unmarshal(s); err != nil { + continue + } + if s.RisesAbove != nil && s.FallsBelow == nil { + if app.txCache.IsDelayRequired(s.RisesAbove.OrderSubmission.MarketId) { + nextBlockRtx = append(nextBlockRtx, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + } else if s.FallsBelow != nil && s.RisesAbove == nil { + if app.txCache.IsDelayRequired(s.FallsBelow.OrderSubmission.MarketId) { + nextBlockRtx = append(nextBlockRtx, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + } else if s.FallsBelow != nil && s.RisesAbove != nil { + if app.txCache.IsDelayRequired(s.FallsBelow.OrderSubmission.MarketId) || app.txCache.IsDelayRequired(s.RisesAbove.OrderSubmission.MarketId) { + nextBlockRtx = append(nextBlockRtx, tx.raw) + } else { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + } + case txn.BatchMarketInstructions: + batch := &commandspb.BatchMarketInstructions{} + if err := tx.tx.Unmarshal(batch); err != nil { + continue + } + someMarketRequiresDelay := false + for _, s := range batch.Submissions { + if app.txCache.IsDelayRequired(s.MarketId) { + someMarketRequiresDelay = true + break + } + } + if !someMarketRequiresDelay { + for _, s := range batch.Amendments { + if app.txCache.IsDelayRequired(s.MarketId) { + someMarketRequiresDelay = true + break + } + } + } + if !someMarketRequiresDelay { + for _, s := range batch.Cancellations { + if len(s.MarketId) != 0 && app.txCache.IsDelayRequired(s.MarketId) { + someMarketRequiresDelay = true + break + } + } + } + if !someMarketRequiresDelay { + for _, s := range batch.StopOrdersSubmission { + if s.FallsBelow != nil && s.FallsBelow.OrderSubmission != nil && app.txCache.IsDelayRequired(s.FallsBelow.OrderSubmission.MarketId) { + someMarketRequiresDelay = true + break + } + if !someMarketRequiresDelay { + if s.RisesAbove != nil && s.RisesAbove.OrderSubmission != nil && app.txCache.IsDelayRequired(s.RisesAbove.OrderSubmission.MarketId) { + someMarketRequiresDelay = true + break + } + } + } + } + if !someMarketRequiresDelay { + for _, s := range batch.StopOrdersCancellation { + if app.txCache.IsDelayRequired(*s.MarketId) { + someMarketRequiresDelay = true + break + } + } + } + if !someMarketRequiresDelay { + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + continue + } + // if there are no amends/submissions + if len(batch.Amendments) == 0 && len(batch.Submissions) == 0 && len(batch.StopOrdersSubmission) == 0 { + cancellations = append(cancellations, tx.raw) + } else if len(batch.Amendments) == 0 && len(batch.StopOrdersSubmission) == 0 { + allPostOnly := true + for _, sub := range batch.Submissions { + if !sub.PostOnly { + allPostOnly = false + break + } + } + if allPostOnly { + postOnly = append(postOnly, tx.raw) + } else { + nextBlockRtx = append(nextBlockRtx, tx.raw) + } + } else { + nextBlockRtx = append(nextBlockRtx, tx.raw) + } + default: + anythingElseFromThisBlock = append(anythingElseFromThisBlock, tx.raw) + } + } + blockTxs := [][]byte{} + blockTxs = append(blockTxs, cancellations...) // cancellations go first + blockTxs = append(blockTxs, postOnly...) // then post only orders + if delayedTxs != nil { + blockTxs = append(blockTxs, delayedTxs...) // then anything from previous block + } + blockTxs = append(blockTxs, anythingElseFromThisBlock...) // finally anything else from this block + if len(nextBlockRtx) > 0 { + wrapperTx := app.txCache.NewDelayedTransaction(app.blockCtx, nextBlockRtx, height) + blockTxs = append(blockTxs, wrapperTx) } - app.log.Debug("prepareProposal returned with", logging.Int("blockTxs", len(blockTxs))) if !app.nilPow { app.pow.EndPrepareProposal(validationResults) } @@ -932,11 +1203,23 @@ func (app *App) prepareProposal(txs []abci.Tx, rawTxs [][]byte) [][]byte { // 1. no violations of pow and spam // 2. max gas limit is not exceeded // 3. (soft) max bytes is not exceeded. -func (app *App) processProposal(txs []abci.Tx) bool { +func (app *App) processProposal(height uint64, txs []abci.Tx) bool { totalGasWanted := 0 maxGas := app.gastimator.GetMaxGas() maxBytes := tmtypesint.DefaultBlockParams().MaxBytes * 4 size := int64(0) + delayedTxCount := 0 + + expectedDelayedAtHeight := app.txCache.GetRawTxs(height) + expectedDelayedTxs := make(map[string]struct{}, len(expectedDelayedAtHeight)) + for _, tx := range expectedDelayedAtHeight { + txx, err := app.abci.GetTx(tx) + if err == nil { + expectedDelayedTxs[hex.EncodeToString(txx.Hash())] = struct{}{} + } + } + foundDelayedTxs := make(map[string]struct{}, len(expectedDelayedAtHeight)) + for _, tx := range txs { size += int64(tx.GetLength()) if size > maxBytes { @@ -950,6 +1233,21 @@ func (app *App) processProposal(txs []abci.Tx) bool { if totalGasWanted > int(maxGas) { return false } + // allow only one delayed transaction wrapper in one block and its transactions must match what we expect. + if tx.Command() == txn.DelayedTransactionsWrapper { + if delayedTxCount > 0 { + app.log.Debug("more than one DelayedTransactionsWrapper") + return false + } + delayedTxCount += 1 + } + if _, ok := expectedDelayedTxs[hex.EncodeToString(tx.Hash())]; ok { + foundDelayedTxs[hex.EncodeToString(tx.Hash())] = struct{}{} + } + } + + if len(foundDelayedTxs) != len(expectedDelayedAtHeight) { + return false } if !app.nilPow && !app.pow.ProcessProposal(txs) { @@ -975,6 +1273,7 @@ func (app *App) OnEndBlock(blockHeight uint64) (tmtypes.ValidatorUpdates, types1 app.epoch.OnBlockEnd(app.blockCtx) app.stateVar.OnBlockEnd(app.blockCtx) + app.banking.OnBlockEnd(app.blockCtx, app.currentTimestamp) powerUpdates := app.top.GetValidatorPowerUpdates() if len(powerUpdates) == 0 { @@ -1001,6 +1300,8 @@ func (app *App) OnBeginBlock(blockHeight uint64, blockHash string, blockTime tim app.log.Debug("entering begin block", logging.Time("at", time.Now()), logging.Uint64("height", blockHeight), logging.Time("time", blockTime), logging.String("blockHash", blockHash)) defer func() { app.log.Debug("leaving begin block", logging.Time("at", time.Now())) }() + app.txCache.SetRawTxs(nil, blockHeight) + ctx := vgcontext.WithBlockHeight(vgcontext.WithTraceID(app.chainCtx, blockHash), blockHeight) if app.protocolUpgradeService.CoreReadyForUpgrade() { app.startProtocolUpgrade(ctx) @@ -1031,7 +1332,6 @@ func (app *App) OnBeginBlock(blockHeight uint64, blockHash string, blockTime tim app.blockCtx = ctx now := blockTime app.time.SetTimeNow(ctx, now) - app.rates.NextBlock() app.currentTimestamp = app.time.GetTimeNow() app.previousTimestamp = app.time.GetTimeLastBatch() app.log.Debug("ABCI service BEGIN completed", @@ -1045,7 +1345,8 @@ func (app *App) OnBeginBlock(blockHeight uint64, blockHash string, blockTime tim app.protocolUpgradeService.BeginBlock(ctx, blockHeight) app.top.BeginBlock(ctx, blockHeight, proposer) app.balanceChecker.BeginBlock(ctx) - app.exec.BeginBlock(ctx) + blockDuration := app.currentTimestamp.Sub(app.previousTimestamp) + app.exec.BeginBlock(ctx, blockDuration) return ctx } @@ -1313,10 +1614,6 @@ func (app *App) OnCheckTx(ctx context.Context, _ *tmtypes.RequestCheckTx, tx abc return ctx, &resp } - // Check ratelimits - // FIXME(): temporary disable all rate limiting - _, isval := app.limitPubkey(tx.PubKeyHex()) - gasWanted, err := app.gastimator.CalcGasWantedForTx(tx) if err != nil { // this error means the transaction couldn't be parsed app.log.Error("error getting gas estimate", logging.Error(err)) @@ -1330,30 +1627,9 @@ func (app *App) OnCheckTx(ctx context.Context, _ *tmtypes.RequestCheckTx, tx abc app.log.Debug("transaction passed checkTx", logging.String("tid", tx.GetPoWTID()), logging.String("command", tx.Command().String())) } - if isval { - return ctx, &resp - } - return ctx, &resp } -// limitPubkey returns whether a request should be rate limited or not. -func (app *App) limitPubkey(pk string) (limit bool, isValidator bool) { - // Do not rate limit validators nodes. - if app.top.IsValidatorVegaPubKey(pk) { - return false, true - } - - key := ratelimit.Key(pk).String() - if !app.rates.Allow(key) { - app.log.Debug("Rate limit exceeded", logging.String("key", key)) - return true, false - } - - app.log.Debug("RateLimit allowance", logging.String("key", key), logging.Int("count", app.rates.Count(key))) - return false, false -} - func (app *App) canSubmitTx(tx abci.Tx) (err error) { defer func() { if err != nil { @@ -1366,6 +1642,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 { @@ -1538,6 +1818,27 @@ func (app *App) CheckBatchMarketInstructions(_ context.Context, tx abci.Tx) erro return ErrMarketBatchInstructionTooBig(size, maxBatchSize) } + for _, s := range bmi.Submissions { + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), s.MarketId); err != nil { + return err + } + + os, err := types.NewOrderSubmissionFromProto(s) + if err != nil { + return err + } + + if err := app.exec.CheckOrderSubmissionForSpam(os, tx.Party()); err != nil { + return err + } + } + + for _, s := range bmi.Amendments { + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), s.MarketId); err != nil { + return err + } + // TODO add amend checks + } return nil } @@ -1828,6 +2129,113 @@ func (app *App) DeliverWithdraw(ctx context.Context, tx abci.Tx, id string) erro return app.handleCheckpoint(snap) } +func (app *App) CheckCancelOrderForSpam(_ context.Context, tx abci.Tx) error { + sub := &commandspb.OrderCancellation{} + if err := tx.Unmarshal(sub); err != nil { + return err + } + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), sub.MarketId); err != nil { + return err + } + return nil +} + +func (app *App) CheckCancelAmmForSpam(_ context.Context, tx abci.Tx) error { + sub := &commandspb.CancelAMM{} + if err := tx.Unmarshal(sub); err != nil { + return err + } + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), sub.MarketId); err != nil { + return err + } + return nil +} + +func (app *App) CheckCancelLPForSpam(_ context.Context, tx abci.Tx) error { + sub := &commandspb.LiquidityProvisionCancellation{} + if err := tx.Unmarshal(sub); err != nil { + return err + } + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), sub.MarketId); err != nil { + return err + } + return nil +} + +func (app *App) CheckAmendOrderForSpam(_ context.Context, tx abci.Tx) error { + sub := &commandspb.OrderAmendment{} + if err := tx.Unmarshal(sub); err != nil { + return err + } + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), sub.MarketId); err != nil { + return err + } + return nil +} + +func (app *App) CheckAmendAmmForSpam(_ context.Context, tx abci.Tx) error { + sub := &commandspb.AmendAMM{} + if err := tx.Unmarshal(sub); err != nil { + return err + } + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), sub.MarketId); err != nil { + return err + } + return nil +} + +func (app *App) CheckSubmitAmmForSpam(_ context.Context, tx abci.Tx) error { + sub := &commandspb.SubmitAMM{} + if err := tx.Unmarshal(sub); err != nil { + return err + } + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), sub.MarketId); err != nil { + return err + } + return nil +} + +func (app *App) CheckLPSubmissionForSpam(_ context.Context, tx abci.Tx) error { + sub := &commandspb.LiquidityProvisionSubmission{} + if err := tx.Unmarshal(sub); err != nil { + return err + } + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), sub.MarketId); err != nil { + return err + } + return nil +} + +func (app *App) CheckLPAmendForSpam(_ context.Context, tx abci.Tx) error { + sub := &commandspb.LiquidityProvisionAmendment{} + if err := tx.Unmarshal(sub); err != nil { + return err + } + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), sub.MarketId); err != nil { + return err + } + return nil +} + +func (app *App) CheckOrderSubmissionForSpam(_ context.Context, tx abci.Tx) error { + s := &commandspb.OrderSubmission{} + if err := tx.Unmarshal(s); err != nil { + return err + } + + if err := app.exec.CheckCanSubmitOrderOrLiquidityCommitment(tx.Party(), s.MarketId); err != nil { + return err + } + + // Convert from proto to domain type + os, err := types.NewOrderSubmissionFromProto(s) + if err != nil { + return err + } + + return app.exec.CheckOrderSubmissionForSpam(os, tx.Party()) +} + func (app *App) CheckPropose(_ context.Context, tx abci.Tx) error { p := &commandspb.ProposalSubmission{} if err := tx.Unmarshal(p); err != nil { @@ -2627,6 +3035,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 { @@ -2696,6 +3134,15 @@ func (app *App) JoinTeam(ctx context.Context, tx abci.Tx) error { return nil } +func (app *App) handleDelayedTransactionWrapper(ctx context.Context, tx abci.Tx) error { + txs := &commandspb.DelayedTransactionsWrapper{} + if err := tx.Unmarshal(txs); err != nil { + return fmt.Errorf("could not deserialize DelayedTransactionsWrapper command: %w", err) + } + app.txCache.SetRawTxs(txs.Transactions, txs.Height) + return nil +} + func (app *App) UpdatePartyProfile(ctx context.Context, tx abci.Tx) error { params := &commandspb.UpdatePartyProfile{} if err := tx.Unmarshal(params); err != nil { diff --git a/core/processor/config.go b/core/processor/config.go index 093025c86ee..57a2fd07f22 100644 --- a/core/processor/config.go +++ b/core/processor/config.go @@ -16,7 +16,6 @@ package processor import ( - "code.vegaprotocol.io/vega/core/processor/ratelimit" "code.vegaprotocol.io/vega/libs/config/encoding" "code.vegaprotocol.io/vega/logging" ) @@ -37,7 +36,6 @@ type Config struct { LogOrderSubmitDebug encoding.Bool `long:"log-order-submit-debug"` LogOrderAmendDebug encoding.Bool `long:"log-order-amend-debug"` LogOrderCancelDebug encoding.Bool `long:"log-order-cancel-debug"` - Ratelimit ratelimit.Config `group:"Ratelimit" namespace:"ratelimit"` KeepCheckpointsMax uint `long:"keep-checkpoints-max"` SnapshotDebug Snapshot `group:"SnapshotDebug" namespace:"snapshotdebug"` } @@ -48,7 +46,6 @@ func NewDefaultConfig() Config { return Config{ Level: encoding.LogLevel{Level: logging.InfoLevel}, LogOrderSubmitDebug: true, - Ratelimit: ratelimit.NewDefaultConfig(), KeepCheckpointsMax: 20, SnapshotDebug: Snapshot{ DevEnabled: false, diff --git a/core/processor/gastimator.go b/core/processor/gastimator.go index 88bfa2a8d85..0d5a0fa4e90 100644 --- a/core/processor/gastimator.go +++ b/core/processor/gastimator.go @@ -99,6 +99,8 @@ func (g *Gastimator) GetPriority(tx abci.Tx) uint64 { func (g *Gastimator) CalcGasWantedForTx(tx abci.Tx) (uint64, error) { switch tx.Command() { + case txn.DelayedTransactionsWrapper: + return 0, nil case txn.SubmitOrderCommand: s := &commandspb.OrderSubmission{} if err := tx.Unmarshal(s); err != nil { diff --git a/core/processor/mocks/mocks.go b/core/processor/mocks/mocks.go index 8a4428eb4ec..db7d9837f92 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() @@ -296,15 +310,15 @@ func (mr *MockExecutionEngineMockRecorder) AmendOrder(arg0, arg1, arg2, arg3 int } // BeginBlock mocks base method. -func (m *MockExecutionEngine) BeginBlock(arg0 context.Context) { +func (m *MockExecutionEngine) BeginBlock(arg0 context.Context, arg1 time.Duration) { m.ctrl.T.Helper() - m.ctrl.Call(m, "BeginBlock", arg0) + m.ctrl.Call(m, "BeginBlock", arg0, arg1) } // BeginBlock indicates an expected call of BeginBlock. -func (mr *MockExecutionEngineMockRecorder) BeginBlock(arg0 interface{}) *gomock.Call { +func (mr *MockExecutionEngineMockRecorder) BeginBlock(arg0, arg1 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BeginBlock", reflect.TypeOf((*MockExecutionEngine)(nil).BeginBlock), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BeginBlock", reflect.TypeOf((*MockExecutionEngine)(nil).BeginBlock), arg0, arg1) } // BlockEnd mocks base method. @@ -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() @@ -362,6 +390,34 @@ func (mr *MockExecutionEngineMockRecorder) CancelStopOrders(arg0, arg1, arg2, ar return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CancelStopOrders", reflect.TypeOf((*MockExecutionEngine)(nil).CancelStopOrders), arg0, arg1, arg2, arg3) } +// CheckCanSubmitOrderOrLiquidityCommitment mocks base method. +func (m *MockExecutionEngine) CheckCanSubmitOrderOrLiquidityCommitment(arg0, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckCanSubmitOrderOrLiquidityCommitment", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// CheckCanSubmitOrderOrLiquidityCommitment indicates an expected call of CheckCanSubmitOrderOrLiquidityCommitment. +func (mr *MockExecutionEngineMockRecorder) CheckCanSubmitOrderOrLiquidityCommitment(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckCanSubmitOrderOrLiquidityCommitment", reflect.TypeOf((*MockExecutionEngine)(nil).CheckCanSubmitOrderOrLiquidityCommitment), arg0, arg1) +} + +// CheckOrderSubmissionForSpam mocks base method. +func (m *MockExecutionEngine) CheckOrderSubmissionForSpam(arg0 *types.OrderSubmission, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CheckOrderSubmissionForSpam", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// CheckOrderSubmissionForSpam indicates an expected call of CheckOrderSubmissionForSpam. +func (mr *MockExecutionEngineMockRecorder) CheckOrderSubmissionForSpam(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckOrderSubmissionForSpam", reflect.TypeOf((*MockExecutionEngine)(nil).CheckOrderSubmissionForSpam), arg0, arg1) +} + // Hash mocks base method. func (m *MockExecutionEngine) Hash() []byte { m.ctrl.T.Helper() @@ -418,6 +474,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() @@ -1734,6 +1804,18 @@ func (mr *MockBankingMockRecorder) NewGovernanceTransfer(arg0, arg1, arg2, arg3 return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NewGovernanceTransfer", reflect.TypeOf((*MockBanking)(nil).NewGovernanceTransfer), arg0, arg1, arg2, arg3) } +// OnBlockEnd mocks base method. +func (m *MockBanking) OnBlockEnd(arg0 context.Context, arg1 time.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "OnBlockEnd", arg0, arg1) +} + +// OnBlockEnd indicates an expected call of OnBlockEnd. +func (mr *MockBankingMockRecorder) OnBlockEnd(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "OnBlockEnd", reflect.TypeOf((*MockBanking)(nil).OnBlockEnd), arg0, arg1) +} + // TransferFunds mocks base method. func (m *MockBanking) TransferFunds(arg0 context.Context, arg1 *types.TransferFunds) error { m.ctrl.T.Helper() @@ -2107,6 +2189,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/process_chain_event.go b/core/processor/process_chain_event.go index 0de76e9992d..db2e0f1b81a 100644 --- a/core/processor/process_chain_event.go +++ b/core/processor/process_chain_event.go @@ -66,6 +66,14 @@ func (app *App) processChainEvent( // OK the event was newly acknowledged, so now we need to // figure out what to do with it. switch c := ce.Event.(type) { + case *commandspb.ChainEvent_Heartbeat: + app.evtHeartbeat.ProcessHeartbeat( + c.Heartbeat.ContractAddress, + c.Heartbeat.SourceChainId, + c.Heartbeat.BlockHeight, + c.Heartbeat.BlockTime, + ) + return nil case *commandspb.ChainEvent_StakingEvent: blockNumber := c.StakingEvent.Block logIndex := c.StakingEvent.Index diff --git a/core/processor/processor.go b/core/processor/processor.go index 7a02ff22717..57ac56b5a56 100644 --- a/core/processor/processor.go +++ b/core/processor/processor.go @@ -72,6 +72,9 @@ type DelegationEngine interface { //nolint:interfacebloat type ExecutionEngine interface { + CheckCanSubmitOrderOrLiquidityCommitment(party, market string) error + CheckOrderSubmissionForSpam(orderSubmission *types.OrderSubmission, party string) error + // orders stuff SubmitOrder(ctx context.Context, orderSubmission *types.OrderSubmission, party string, idgen common.IDGenerator, orderID string) (*types.OrderConfirmation, error) CancelOrder(ctx context.Context, order *types.OrderCancellation, party string, idgen common.IDGenerator) ([]*types.OrderCancellationConfirmation, error) @@ -102,12 +105,16 @@ type ExecutionEngine interface { // End of block BlockEnd(ctx context.Context) - BeginBlock(ctx context.Context) + BeginBlock(ctx context.Context, duration time.Duration) // Margin mode 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 { @@ -208,6 +215,11 @@ type EvtForwarder interface { Ack(*commandspb.ChainEvent) bool } +// EvtForwarderHeartbeat ... +type EvtForwarderHeartbeat interface { + ProcessHeartbeat(string, string, uint64, uint64) error +} + // Banking .. // //nolint:interfacebloat @@ -229,6 +241,7 @@ type Banking interface { VerifyGovernanceTransfer(transfer *types.NewTransferConfiguration) error VerifyCancelGovernanceTransfer(transferID string) error CancelGovTransfer(ctx context.Context, ID string) error + OnBlockEnd(ctx context.Context, now time.Time) } // NetworkParameters ... @@ -266,6 +279,7 @@ type Limits interface { CanProposeAsset() bool CanProposeSpotMarket() bool CanProposePerpsMarket() bool + CanUseAMMPool() bool CanTrade() bool } diff --git a/core/processor/ratelimit/ratelimit.go b/core/processor/ratelimit/ratelimit.go deleted file mode 100644 index f69ac27870e..00000000000 --- a/core/processor/ratelimit/ratelimit.go +++ /dev/null @@ -1,89 +0,0 @@ -// 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 ratelimit - -import ( - "encoding/base64" -) - -type Key []byte - -func (k Key) String() string { - return base64.StdEncoding.EncodeToString(k) -} - -type Rates struct { - block int - requests int - perNBlocks int - entries map[string][]int -} - -func New(requests, perNBlocks int) *Rates { - return &Rates{ - block: 0, - requests: requests, - perNBlocks: perNBlocks, - entries: map[string][]int{}, - } -} - -// Count returns the number of requests recorded for a given key -// It returns -1 if the key has been not recorded or evicted. -func (r *Rates) Count(key string) int { - entry, ok := r.entries[key] - if !ok { - return -1 - } - - var count int - for _, n := range entry { - count += n - } - return count -} - -func (r *Rates) NextBlock() { - // compute the next block index - r.block = (r.block + 1) % (r.perNBlocks) - - // reset the counters for that particular block index - for _, c := range r.entries { - c[r.block] = 0 - } - - // We clean up the entries after finishing the block round - if r.block != 0 { - return - } - - for key := range r.entries { - if r.Count(key) == 0 { - delete(r.entries, key) - } - } -} - -func (r *Rates) Allow(key string) bool { - entry, ok := r.entries[key] - if !ok { - entry = make([]int, r.perNBlocks) - r.entries[key] = entry - } - entry[r.block]++ - - return r.Count(key) < r.requests -} diff --git a/core/processor/ratelimit/ratelimit_test.go b/core/processor/ratelimit/ratelimit_test.go deleted file mode 100644 index 072c333427a..00000000000 --- a/core/processor/ratelimit/ratelimit_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// 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 ratelimit_test - -import ( - "testing" - - "code.vegaprotocol.io/vega/core/processor/ratelimit" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// runN executes the given `fn` func, `n` times. -func runN(n int, fn func()) { - for { - if n == 0 { - return - } - n-- - fn() - } -} - -func TestRateLimits(t *testing.T) { - t.Run("Single Block", func(t *testing.T) { - r := ratelimit.New(10, 10) // 10 requests in the last 10 blocks - - // make 9 requests, all should be allowed - runN(9, func() { - ok := r.Allow("test") - assert.True(t, ok) - }) - - // request number 10 should not be allowed - ok := r.Allow("test") - assert.False(t, ok) - }) - - t.Run("Even Blocks", func(t *testing.T) { - r := ratelimit.New(10, 10) // 10 requests in the last 10 blocks - - // this will make 1 request and move to the next block. - runN(9, func() { - ok := r.Allow("test") - assert.True(t, ok) - r.NextBlock() - }) - - ok := r.Allow("test") - assert.False(t, ok) - }) - - t.Run("Uneven Blocks", func(t *testing.T) { - r := ratelimit.New(10, 3) // 10 request in the last 3 blocks - - // let's fill the rate limiter - runN(100, func() { - _ = r.Allow("test") - }) - require.False(t, r.Allow("test")) - - r.NextBlock() - assert.False(t, r.Allow("test")) - - r.NextBlock() - assert.False(t, r.Allow("test")) - - r.NextBlock() - assert.True(t, r.Allow("test")) - }) - - t.Run("Clean up", func(t *testing.T) { - r := ratelimit.New(10, 10) - runN(10, func() { - r.Allow("test") - }) - require.Equal(t, 10, r.Count("test")) - - runN(10, func() { - r.NextBlock() - }) - require.Equal(t, -1, r.Count("test")) - }) -} diff --git a/core/processor/tx.go b/core/processor/tx.go index c3c73404c47..a2fad51f70a 100644 --- a/core/processor/tx.go +++ b/core/processor/tx.go @@ -78,6 +78,8 @@ func DecodeTx(payload []byte, chainID string) (*Tx, error) { func (t Tx) Command() txn.Command { switch cmd := t.inputData.Command.(type) { + case *commandspb.InputData_DelayedTransactionsWrapper: + return txn.DelayedTransactionsWrapper case *commandspb.InputData_OrderSubmission: return txn.SubmitOrderCommand case *commandspb.InputData_OrderCancellation: @@ -146,6 +148,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 +257,14 @@ 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 + case *commandspb.InputData_DelayedTransactionsWrapper: + return cmd.DelayedTransactionsWrapper default: return fmt.Errorf("command %T is not supported", cmd) } @@ -460,6 +476,30 @@ 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 + case *commandspb.InputData_DelayedTransactionsWrapper: + underlyingCmd, ok := i.(*commandspb.DelayedTransactionsWrapper) + if !ok { + return errors.New("failed to unmarshall to DelayedTransactionsWrapper") + } + *underlyingCmd = *cmd.DelayedTransactionsWrapper default: return fmt.Errorf("command %T is not supported", cmd) } diff --git a/core/products/perpetual.go b/core/products/perpetual.go index de7e2701130..8429ce263c9 100644 --- a/core/products/perpetual.go +++ b/core/products/perpetual.go @@ -900,15 +900,22 @@ func (p *Perpetual) calculateFundingPayment(t int64) *fundingData { // the funding payment is the difference between the two, the sign representing the direction of cash flow fundingPayment := num.DecimalFromUint(internalTWAP).Sub(num.DecimalFromUint(externalTWAP)) + delta := t - p.startedAt // apply interest-rates if necessary if !p.p.InterestRate.IsZero() { - delta := t - p.startedAt if p.log.GetLevel() == logging.DebugLevel { p.log.Debug("applying interest-rate with clamping", logging.String("funding-payment", fundingPayment.String()), logging.Int64("delta", delta)) } fundingPayment = fundingPayment.Add(p.calculateInterestTerm(externalTWAP, internalTWAP, delta)) } + // scale funding payment by fraction of funding period spent outside of auction + timeSpentInAuction := p.auctions.timeSpent(p.startedAt, t) + if timeSpentInAuction > 0 && delta > 0 { + scaling := num.DecimalOne().Sub(num.DecimalFromInt64(timeSpentInAuction).Div(num.DecimalFromInt64(delta))) + fundingPayment = fundingPayment.Mul(scaling) + } + // apply funding scaling factor if p.p.FundingRateScalingFactor != nil { fundingPayment = fundingPayment.Mul(*p.p.FundingRateScalingFactor) diff --git a/core/products/perpetual_auctions_test.go b/core/products/perpetual_auctions_test.go index 19c190b06c6..929c16d6397 100644 --- a/core/products/perpetual_auctions_test.go +++ b/core/products/perpetual_auctions_test.go @@ -74,17 +74,23 @@ func testDataPointInAuctionIgnored(t *testing.T) { // submit the first point then enter an auction submitPointWithDifference(t, perp, points[0], expectedTWAP) - whenAuctionStateChanges(t, perp, points[0].t+int64(time.Second), true) + auctionStart := points[0].t + int64(time.Second) + whenAuctionStateChanges(t, perp, auctionStart, true) // submit a crazy point difference, then a normal point submitPointWithDifference(t, perp, points[1], -9999999) submitPointWithDifference(t, perp, points[2], expectedTWAP) // now we leave auction and the crazy point difference will not affect the TWAP because it was in an auction period - whenAuctionStateChanges(t, perp, points[2].t+int64(time.Second), false) + auctionEnd := points[2].t + int64(time.Second) + whenAuctionStateChanges(t, perp, auctionEnd, false) + + currentPeriodLength := float64(points[len(points)-1].t - points[0].t) + timeInAuction := float64(auctionEnd - auctionStart) + periodFractionOutsideAuction := 1 - timeInAuction/currentPeriodLength fundingPayment := whenTheFundingPeriodEnds(t, perp, points[len(points)-1].t) - assert.Equal(t, int64(expectedTWAP), fundingPayment.Int64()) + assert.Equal(t, int64(periodFractionOutsideAuction*float64(expectedTWAP)), fundingPayment.Int64()) } func testDataPointsInAuctionOutOfOrder(t *testing.T) { @@ -107,18 +113,24 @@ func testDataPointsInAuctionOutOfOrder(t *testing.T) { whenAuctionStateChanges(t, perp, a1, true) whenAuctionStateChanges(t, perp, a2, false) + currentPeriodLength := float64(points[len(points)-1].t - points[0].t) + timeInAuction := float64(points[1].t - points[0].t + points[3].t - points[2].t) + periodFractionOutsideAuction := num.DecimalOne().Sub(num.DecimalFromFloat(timeInAuction).Div(num.DecimalFromFloat(currentPeriodLength))) // funding payment will be the constant diff in the first point - assert.Equal(t, "100", getFundingPayment(t, perp, nd)) + expected, _ := num.IntFromDecimal(periodFractionOutsideAuction.Mul(num.DecimalFromInt64(100))) + assert.Equal(t, num.IntToString(expected), getFundingPayment(t, perp, nd)) // now submit a point that is mid the auction period submitPointWithDifference(t, perp, points[2], 200) - assert.Equal(t, "150", getFundingPayment(t, perp, nd)) + + expected, _ = num.IntFromDecimal(periodFractionOutsideAuction.Mul(num.DecimalFromInt64(150))) + assert.Equal(t, num.IntToString(expected), getFundingPayment(t, perp, nd)) // now submit a point also in before the previous point, also in an auction period // and its contribution should be ignored. crazy := &testDataPoint{t: between(a1, points[1].t), price: num.NewUint(1000)} submitPointWithDifference(t, perp, crazy, 9999999) - assert.Equal(t, "150", getFundingPayment(t, perp, nd)) + assert.Equal(t, "49", getFundingPayment(t, perp, nd)) } func testAuctionFundingPeriodReset(t *testing.T) { @@ -136,7 +148,8 @@ func testAuctionFundingPeriodReset(t *testing.T) { whenAuctionStateChanges(t, perp, points[0].t+int64(time.Second), true) fundingPayment := whenTheFundingPeriodEnds(t, perp, points[0].t+int64(2*time.Second)) - assert.Equal(t, int64(expectedTWAP), fundingPayment.Int64()) + periodFractionOutsideAuction := 0.5 + assert.Equal(t, int64(periodFractionOutsideAuction*float64(expectedTWAP)), fundingPayment.Int64()) // should still be on an auction to ending another funding period should give 0 submitPointWithDifference(t, perp, points[1], -999999) @@ -148,7 +161,7 @@ func testAuctionFundingPeriodReset(t *testing.T) { whenAuctionStateChanges(t, perp, between(points[2].t, points[3].t), false) fundingPayment = whenTheFundingPeriodEnds(t, perp, points[3].t) - assert.Equal(t, int64(100), fundingPayment.Int64()) + assert.Equal(t, int64(periodFractionOutsideAuction*100), fundingPayment.Int64()) // now we're not in an auction, ending the period again will preserve that fundingPayment = whenTheFundingPeriodEnds(t, perp, points[3].t+int64(time.Hour)) @@ -171,7 +184,8 @@ func testFundingDataAtInAuctionPeriodStart(t *testing.T) { end := points[0].t + int64(2*time.Second) fundingPayment := whenTheFundingPeriodEnds(t, perp, end) - assert.Equal(t, int64(expectedTWAP), fundingPayment.Int64()) + periodFractionOutsideAuction := 0.5 + assert.Equal(t, int64(periodFractionOutsideAuction*float64(expectedTWAP)), fundingPayment.Int64()) // but if we query the funding payment right now it'll be zero because this 0 length, just started // funding period is all in auction @@ -203,9 +217,15 @@ func testPastFundingPaymentInAuction(t *testing.T) { perp.broker.EXPECT().Send(gomock.Any()).Times(1) require.NoError(t, perp.perpetual.SubmitDataPoint(context.Background(), points[2].price, points[2].t)) + endPrev := end end = points[2].t - int64(500*time.Millisecond) fundingPayment = whenTheFundingPeriodEnds(t, perp, end) - assert.Equal(t, int64(expectedTWAP), fundingPayment.Int64()) + + currentPeriodLength := float64(end - endPrev) + timeInAuction := float64(end - points[1].t) + periodFractionOutsideAuction := 1 - timeInAuction/currentPeriodLength + + assert.Equal(t, int64(periodFractionOutsideAuction*float64(expectedTWAP)), fundingPayment.Int64()) } func testPastFundingPayment(t *testing.T) { diff --git a/core/products/perpetual_snapshot_test.go b/core/products/perpetual_snapshot_test.go index 0e819d86f2e..77cca74a4b8 100644 --- a/core/products/perpetual_snapshot_test.go +++ b/core/products/perpetual_snapshot_test.go @@ -64,9 +64,10 @@ func TestPerpetualSnapshot(t *testing.T) { whenAuctionStateChanges(t, perps, points[2].t+int64(time.Second), false) fundingPayment := getFundingPayment(t, perps, points[3].t) - assert.Equal(t, "1234", fundingPayment) + // 2/3 of funding period spent in auction so expecting funding payment of 1/3*1234=~411 + assert.Equal(t, "411", fundingPayment) fundingPayment = getFundingPayment(t, perps, points[3].t) - assert.Equal(t, "1234", fundingPayment) + assert.Equal(t, "411", fundingPayment) // now get the serialised state, and try to load it state1 := perps.perpetual.Serialize() @@ -88,7 +89,7 @@ func TestPerpetualSnapshot(t *testing.T) { // check funding payment comes out the same fundingPayment = getFundingPayment(t, perps2, points[3].t) - assert.Equal(t, "1234", fundingPayment) + assert.Equal(t, "411", fundingPayment) // check the the time-trigger has been set properly cfg := scheduleSrc.Data.GetInternalTimeTriggerSpecConfiguration() diff --git a/core/protocol/all_services.go b/core/protocol/all_services.go index 1df9a5639c1..e5c516a5854 100644 --- a/core/protocol/all_services.go +++ b/core/protocol/all_services.go @@ -63,6 +63,7 @@ import ( "code.vegaprotocol.io/vega/core/statevar" "code.vegaprotocol.io/vega/core/stats" "code.vegaprotocol.io/vega/core/teams" + "code.vegaprotocol.io/vega/core/txcache" "code.vegaprotocol.io/vega/core/types" "code.vegaprotocol.io/vega/core/validators" "code.vegaprotocol.io/vega/core/validators/erc20multisig" @@ -128,6 +129,7 @@ type allServices struct { ethereumOraclesVerifier *ethverifier.Verifier partiesEngine *parties.SnapshottedEngine + txCache *txcache.TxCache assets *assets.Service topology *validators.Topology @@ -142,6 +144,7 @@ type allServices struct { referralProgram *referral.SnapshottedEngine primaryEventForwarder *evtforward.Forwarder + forwarderHeartbeat *evtforward.Tracker primaryEventForwarderEngine EventForwarderEngine primaryEthConfirmations *ethclient.EthereumConfirmations primaryEthClient *ethclient.PrimaryClient @@ -247,6 +250,7 @@ func newServices( svcs.primaryMultisig.SetWitness(svcs.witness) svcs.secondaryMultisig.SetWitness(svcs.witness) svcs.primaryEventForwarder = evtforward.New(svcs.log, svcs.conf.EvtForward, svcs.commander, svcs.timeService, svcs.topology) + svcs.forwarderHeartbeat = evtforward.NewTracker(log, svcs.witness, svcs.timeService) if svcs.conf.HaveEthClient() { svcs.primaryBridgeView = bridges.NewERC20LogicView(primaryEthClient, primaryEthConfirmations) @@ -277,11 +281,11 @@ func newServices( svcs.oracleAdaptors = oracleAdaptors.New() // this is done to go around circular deps again..s - svcs.primaryMultisig.SetEthereumEventSource(svcs.primaryEventForwarderEngine) - svcs.secondaryMultisig.SetEthereumEventSource(svcs.secondaryEventForwarderEngine) + svcs.primaryMultisig.SetEthereumEventSource(svcs.forwarderHeartbeat) + svcs.secondaryMultisig.SetEthereumEventSource(svcs.forwarderHeartbeat) svcs.stakingAccounts, svcs.stakeVerifier, svcs.stakeCheckpoint = staking.New( - svcs.log, svcs.conf.Staking, svcs.timeService, svcs.broker, svcs.witness, svcs.primaryEthClient, svcs.netParams, svcs.primaryEventForwarder, svcs.conf.HaveEthClient(), svcs.primaryEthConfirmations, svcs.primaryEventForwarderEngine, + svcs.log, svcs.conf.Staking, svcs.timeService, svcs.broker, svcs.witness, svcs.primaryEthClient, svcs.netParams, svcs.primaryEventForwarder, svcs.conf.HaveEthClient(), svcs.primaryEthConfirmations, svcs.forwarderHeartbeat, ) svcs.epochService.NotifyOnEpoch(svcs.topology.OnEpochEvent, svcs.topology.OnEpochRestore) svcs.epochService.NotifyOnEpoch(stats.OnEpochEvent, stats.OnEpochRestore) @@ -289,6 +293,7 @@ func newServices( svcs.teamsEngine = teams.NewSnapshottedEngine(svcs.broker, svcs.timeService) svcs.partiesEngine = parties.NewSnapshottedEngine(svcs.broker) + svcs.txCache = txcache.NewTxCache(svcs.commander) svcs.statevar = statevar.New(svcs.log, svcs.conf.StateVar, svcs.broker, svcs.topology, svcs.commander) svcs.marketActivityTracker = common.NewMarketActivityTracker(svcs.log, svcs.teamsEngine, svcs.stakingAccounts, svcs.broker) @@ -326,12 +331,15 @@ func newServices( svcs.volumeDiscount.OnEpochRestore, ) - svcs.banking = banking.New(svcs.log, svcs.conf.Banking, svcs.collateral, svcs.witness, svcs.timeService, svcs.assets, svcs.notary, svcs.broker, svcs.topology, svcs.marketActivityTracker, svcs.primaryBridgeView, svcs.secondaryBridgeView, svcs.primaryEventForwarderEngine, svcs.secondaryEventForwarderEngine) + svcs.banking = banking.New(svcs.log, svcs.conf.Banking, svcs.collateral, svcs.witness, svcs.timeService, + svcs.assets, svcs.notary, svcs.broker, svcs.topology, svcs.marketActivityTracker, svcs.primaryBridgeView, + svcs.secondaryBridgeView, svcs.forwarderHeartbeat, svcs.partiesEngine) // instantiate the execution engine svcs.executionEngine = execution.NewEngine( svcs.log, svcs.conf.Execution, svcs.timeService, svcs.collateral, svcs.oracle, svcs.broker, svcs.statevar, - svcs.marketActivityTracker, svcs.assets, svcs.referralProgram, svcs.volumeDiscount, svcs.banking, + svcs.marketActivityTracker, svcs.assets, svcs.referralProgram, svcs.volumeDiscount, svcs.banking, svcs.partiesEngine, + svcs.txCache, ) svcs.epochService.NotifyOnEpoch(svcs.executionEngine.OnEpochEvent, svcs.executionEngine.OnEpochRestore) svcs.epochService.NotifyOnEpoch(svcs.marketActivityTracker.OnEpochEvent, svcs.marketActivityTracker.OnEpochRestore) @@ -376,7 +384,7 @@ func newServices( svcs.activityStreak.OnEpochRestore, ) - svcs.vesting = vesting.NewSnapshotEngine(svcs.log, svcs.collateral, svcs.activityStreak, svcs.broker, svcs.assets) + svcs.vesting = vesting.NewSnapshotEngine(svcs.log, svcs.collateral, svcs.activityStreak, svcs.broker, svcs.assets, svcs.partiesEngine) svcs.timeService.NotifyOnTick(svcs.vesting.OnTick) svcs.rewards = rewards.New(svcs.log, svcs.conf.Rewards, svcs.broker, svcs.delegation, svcs.epochService, svcs.collateral, svcs.timeService, svcs.marketActivityTracker, svcs.topology, svcs.vesting, svcs.banking, svcs.activityStreak) @@ -424,6 +432,7 @@ func newServices( svcs.topology.NotifyOnKeyChange(svcs.governance.ValidatorKeyChanged) svcs.snapshotEngine.AddProviders( + svcs.txCache, svcs.checkpoint, svcs.collateral, svcs.governance, @@ -452,7 +461,10 @@ func newServices( svcs.volumeDiscount, svcs.teamsEngine, svcs.spam, - svcs.l2Verifiers) + svcs.l2Verifiers, + svcs.partiesEngine, + svcs.forwarderHeartbeat, + ) pow := pow.New(svcs.log, svcs.conf.PoW) @@ -526,6 +538,7 @@ func (svcs *allServices) registerTimeServiceCallbacks() { svcs.ethereumOraclesVerifier.OnTick, svcs.l2Verifiers.OnTick, + svcs.forwarderHeartbeat.OnTick, ) } @@ -554,6 +567,7 @@ func (svcs *allServices) registerConfigWatchers() { func(cfg config.Config) { svcs.banking.ReloadConf(cfg.Banking) }, func(cfg config.Config) { svcs.governance.ReloadConf(cfg.Governance) }, func(cfg config.Config) { svcs.stats.ReloadConf(cfg.Stats) }, + func(cfg config.Config) { svcs.broker.ReloadConf(cfg.Broker) }, ) if svcs.conf.HaveEthClient() { @@ -582,6 +596,10 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) spamWatchers := []netparams.WatchParam{} if svcs.spam != nil { spamWatchers = []netparams.WatchParam{ + { + Param: netparams.MarketAggressiveOrderBlockDelay, + Watcher: svcs.txCache.OnNumBlocksToDelayUpdated, + }, { Param: netparams.SpamProtectionMaxVotes, Watcher: svcs.spam.OnMaxVotesChanged, @@ -710,6 +728,14 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) Param: netparams.RewardAsset, Watcher: dispatch.RewardAssetUpdate(svcs.log, svcs.assets), }, + { + Param: netparams.MinimalMarginQuantumMultiple, + Watcher: svcs.executionEngine.OnMinimalMarginQuantumMultipleUpdate, + }, + { + Param: netparams.MinimalHoldingQuantumMultiple, + Watcher: svcs.executionEngine.OnMinimalHoldingQuantumMultipleUpdate, + }, { Param: netparams.MarketMarginScalingFactors, Watcher: svcs.executionEngine.OnMarketMarginScalingFactorsUpdate, @@ -726,6 +752,10 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) Param: netparams.MarketValueWindowLength, Watcher: svcs.executionEngine.OnMarketValueWindowLengthUpdate, }, + { + Param: netparams.NetworkWideAuctionDuration, + Watcher: svcs.executionEngine.OnNetworkWideAuctionDurationUpdated, + }, { Param: netparams.BlockchainsPrimaryEthereumConfig, Watcher: func(ctx context.Context, cfg interface{}) error { @@ -739,7 +769,23 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) } svcs.assets.SetBridgeChainID(ethCfg.ChainID(), true) - return svcs.primaryEventForwarderEngine.SetupEthereumEngine(svcs.primaryEthClient, svcs.primaryEventForwarder, svcs.conf.EvtForward.Ethereum, ethCfg, svcs.assets) + if err := svcs.primaryEventForwarderEngine.SetupEthereumEngine( + svcs.primaryEthClient, + svcs.primaryEventForwarder, + svcs.conf.EvtForward.Ethereum, + ethCfg, + svcs.assets); err != nil { + return err + } + svcs.forwarderHeartbeat.RegisterForwarder( + svcs.primaryEventForwarderEngine, + ethCfg.ChainID(), + ethCfg.CollateralBridge().HexAddress(), + ethCfg.StakingBridge().HexAddress(), + ethCfg.VestingBridge().HexAddress(), + ethCfg.MultiSigControl().HexAddress(), + ) + return nil }, }, { @@ -762,7 +808,25 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) if svcs.conf.HaveEthClient() { bridgeCfg = svcs.conf.EvtForward.EVMBridges[0] } - return svcs.secondaryEventForwarderEngine.SetupSecondaryEthereumEngine(svcs.secondaryEthClient, svcs.primaryEventForwarder, bridgeCfg, ethCfg, svcs.assets) + + if err := svcs.secondaryEventForwarderEngine.SetupSecondaryEthereumEngine( + svcs.secondaryEthClient, + svcs.primaryEventForwarder, + bridgeCfg, + ethCfg, + svcs.assets, + ); err != nil { + return err + } + + svcs.forwarderHeartbeat.RegisterForwarder( + svcs.secondaryEventForwarderEngine, + ethCfg.ChainID(), + ethCfg.CollateralBridge().HexAddress(), + ethCfg.MultiSigControl().HexAddress(), + ) + + return nil }, }, { @@ -891,6 +955,10 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) Param: netparams.TransferFeeFactor, Watcher: svcs.banking.OnTransferFeeFactorUpdate, }, + { + Param: netparams.RewardsUpdateFrequency, + Watcher: svcs.banking.OnRewardsUpdateFrequencyUpdate, + }, { Param: netparams.TransferFeeMaxQuantumAmount, Watcher: svcs.banking.OnMaxQuantumAmountUpdate, @@ -979,7 +1047,7 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) return fmt.Errorf("invalid primary ethereum configuration: %w", err) } - svcs.banking.OnPrimaryEthChainIDUpdated(ethCfg.ChainID()) + svcs.banking.OnPrimaryEthChainIDUpdated(ethCfg.ChainID(), ethCfg.CollateralBridge().HexAddress()) return nil }, }, @@ -992,7 +1060,7 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) } ethCfg := ethCfgs.Configs[0] - svcs.banking.OnSecondaryEthChainIDUpdated(ethCfg.ChainID()) + svcs.banking.OnSecondaryEthChainIDUpdated(ethCfg.ChainID(), ethCfg.CollateralBridge().HexAddress()) svcs.witness.SetSecondaryDefaultConfirmations(ethCfg.ChainID(), ethCfg.Confirmations(), ethCfg.BlockTime()) return nil }, @@ -1028,6 +1096,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 +1176,18 @@ func (svcs *allServices) setupNetParameters(powWatchers []netparams.WatchParam) Param: netparams.RewardsActivityStreakInactivityLimit, Watcher: svcs.activityStreak.OnRewardsActivityStreakInactivityLimit, }, + { + Param: netparams.MarketAMMMinCommitmentQuantum, + Watcher: svcs.executionEngine.OnMarketAMMMinCommitmentQuantum, + }, + { + Param: netparams.MarketAMMMaxCalculationLevels, + Watcher: svcs.executionEngine.OnMarketAMMMaxCalculationLevels, + }, + { + Param: netparams.MarketLiquidityEquityLikeShareFeeFraction, + Watcher: svcs.executionEngine.OnMarketLiquidityEquityLikeShareFeeFractionUpdate, + }, } watchers = append(watchers, powWatchers...) diff --git a/core/protocol/engines.go b/core/protocol/engines.go index 1ea51cc3180..2079ed4d3b6 100644 --- a/core/protocol/engines.go +++ b/core/protocol/engines.go @@ -16,6 +16,8 @@ package protocol import ( + "context" + "code.vegaprotocol.io/vega/core/evtforward/ethereum" evtfwdeth "code.vegaprotocol.io/vega/core/evtforward/ethereum" "code.vegaprotocol.io/vega/core/types" @@ -32,4 +34,6 @@ type EventForwarderEngine interface { UpdateCollateralStartingBlock(uint64) UpdateStakingStartingBlock(uint64) UpdateMultisigControlStartingBlock(uint64) + VerifyHeartbeat(context.Context, uint64, string, string, uint64) error + UpdateStartingBlock(string, uint64) } diff --git a/core/protocol/protocol.go b/core/protocol/protocol.go index 86383ab3b30..2f1e048d8b4 100644 --- a/core/protocol/protocol.go +++ b/core/protocol/protocol.go @@ -114,6 +114,7 @@ func New( svcs.broker, svcs.witness, svcs.primaryEventForwarder, + svcs.forwarderHeartbeat, svcs.executionEngine, svcs.genesisHandler, svcs.governance, @@ -151,6 +152,7 @@ func New( svcs.ethCallEngine, svcs.collateral, svcs.partiesEngine, + svcs.txCache, ), log: log, confWatcher: confWatcher, diff --git a/core/rewards/engine.go b/core/rewards/engine.go index 2d06ea1c28d..095ecddd601 100644 --- a/core/rewards/engine.go +++ b/core/rewards/engine.go @@ -22,6 +22,7 @@ import ( "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/core/vesting" "code.vegaprotocol.io/vega/libs/num" "code.vegaprotocol.io/vega/logging" "code.vegaprotocol.io/vega/protos/vega" @@ -89,7 +90,7 @@ type Teams interface { type Vesting interface { AddReward(party, asset string, amount *num.Uint, lockedForEpochs uint64) - GetRewardBonusMultiplier(party string) (*num.Uint, num.Decimal) + GetSingleAndSummedRewardBonusMultipliers(party string) (vesting.MultiplierAndQuantBalance, vesting.MultiplierAndQuantBalance) } type ActivityStreak interface { @@ -357,8 +358,18 @@ func (e *Engine) convertTakerFeesToRewardAsset(takerFees map[string]*num.Uint, f func (e *Engine) getRewardMultiplierForParty(party string) num.Decimal { asMultiplier := e.activityStreak.GetRewardsDistributionMultiplier(party) - _, vsMultiplier := e.vesting.GetRewardBonusMultiplier(party) - return asMultiplier.Mul(vsMultiplier) + _, summed := e.vesting.GetSingleAndSummedRewardBonusMultipliers(party) + return asMultiplier.Mul(summed.Multiplier) +} + +func filterEligible(ps []*types.PartyContributionScore) []*types.PartyContributionScore { + filtered := []*types.PartyContributionScore{} + for _, psEntry := range ps { + if psEntry.IsEligible { + filtered = append(filtered, psEntry) + } + } + return filtered } // calculateRewardTypeForAsset calculates the payout for a given asset and reward type. @@ -391,7 +402,7 @@ func (e *Engine) calculateRewardTypeForAsset(ctx context.Context, epochSeq, asse takerFeesPaidInRewardAsset = e.convertTakerFeesToRewardAsset(takerFeesPaid, ds.AssetForMetric, asset) } if ds.EntityScope == vega.EntityScope_ENTITY_SCOPE_INDIVIDUALS { - partyScores := e.marketActivityTracker.CalculateMetricForIndividuals(ctx, ds) + partyScores := filterEligible(e.marketActivityTracker.CalculateMetricForIndividuals(ctx, ds)) partyRewardFactors := map[string]num.Decimal{} for _, pcs := range partyScores { partyRewardFactors[pcs.Party] = e.getRewardMultiplierForParty(pcs.Party) @@ -399,6 +410,14 @@ func (e *Engine) calculateRewardTypeForAsset(ctx context.Context, epochSeq, asse return calculateRewardsByContributionIndividual(epochSeq, account.Asset, account.ID, account.Balance, partyScores, partyRewardFactors, timestamp, ds, takerFeesPaidInRewardAsset) } else { teamScores, partyScores := e.marketActivityTracker.CalculateMetricForTeams(ctx, ds) + filteredPartyScore := map[string][]*types.PartyContributionScore{} + for t, team := range partyScores { + filtered := filterEligible(team) + if len(filtered) > 0 { + filteredPartyScore[t] = filtered + } + } + partyScores = filteredPartyScore partyRewardFactors := map[string]num.Decimal{} for _, team := range partyScores { for _, pcs := range team { diff --git a/core/rewards/mocks/mocks.go b/core/rewards/mocks/mocks.go index 171e9bd3e42..f6b1c4a7d34 100644 --- a/core/rewards/mocks/mocks.go +++ b/core/rewards/mocks/mocks.go @@ -10,6 +10,7 @@ import ( time "time" types "code.vegaprotocol.io/vega/core/types" + vesting "code.vegaprotocol.io/vega/core/vesting" num "code.vegaprotocol.io/vega/libs/num" vega "code.vegaprotocol.io/vega/protos/vega" gomock "github.com/golang/mock/gomock" @@ -373,19 +374,19 @@ func (mr *MockVestingMockRecorder) AddReward(arg0, arg1, arg2, arg3 interface{}) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddReward", reflect.TypeOf((*MockVesting)(nil).AddReward), arg0, arg1, arg2, arg3) } -// GetRewardBonusMultiplier mocks base method. -func (m *MockVesting) GetRewardBonusMultiplier(arg0 string) (*num.Uint, decimal.Decimal) { +// GetSingleAndSummedRewardBonusMultipliers mocks base method. +func (m *MockVesting) GetSingleAndSummedRewardBonusMultipliers(arg0 string) (vesting.MultiplierAndQuantBalance, vesting.MultiplierAndQuantBalance) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetRewardBonusMultiplier", arg0) - ret0, _ := ret[0].(*num.Uint) - ret1, _ := ret[1].(decimal.Decimal) + ret := m.ctrl.Call(m, "GetSingleAndSummedRewardBonusMultipliers", arg0) + ret0, _ := ret[0].(vesting.MultiplierAndQuantBalance) + ret1, _ := ret[1].(vesting.MultiplierAndQuantBalance) return ret0, ret1 } -// GetRewardBonusMultiplier indicates an expected call of GetRewardBonusMultiplier. -func (mr *MockVestingMockRecorder) GetRewardBonusMultiplier(arg0 interface{}) *gomock.Call { +// GetSingleAndSummedRewardBonusMultipliers indicates an expected call of GetSingleAndSummedRewardBonusMultipliers. +func (mr *MockVestingMockRecorder) GetSingleAndSummedRewardBonusMultipliers(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRewardBonusMultiplier", reflect.TypeOf((*MockVesting)(nil).GetRewardBonusMultiplier), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSingleAndSummedRewardBonusMultipliers", reflect.TypeOf((*MockVesting)(nil).GetSingleAndSummedRewardBonusMultipliers), arg0) } // MockActivityStreak is a mock of ActivityStreak interface. diff --git a/core/risk/engine.go b/core/risk/engine.go index ac0bdba553a..51080fb8eba 100644 --- a/core/risk/engine.go +++ b/core/risk/engine.go @@ -83,7 +83,7 @@ type Engine struct { marginCalculator *types.MarginCalculator scalingFactorsUint *scalingFactorsUint log *logging.Logger - cfgMu sync.Mutex + cfgMu sync.RWMutex model Model factors *types.RiskFactor waiting bool @@ -151,7 +151,9 @@ func NewEngine(log *logging.Logger, stateVarEngine.RegisterStateVariable(asset, mktID, RiskFactorStateVarName, FactorConverter{}, e.startRiskFactorsCalculation, []statevar.EventType{statevar.EventTypeMarketEnactment, statevar.EventTypeMarketUpdated}, e.updateRiskFactor) if initialisedRiskFactors != nil { + e.cfgMu.Lock() e.factors = initialisedRiskFactors + e.cfgMu.Unlock() // we've restored from snapshot, we don't need want to trigger a MarketEnactment event } else { // trigger the calculation of risk factors for the market @@ -220,7 +222,9 @@ func (e *Engine) UpdateModel( quadraticSlippageFactor num.Decimal, ) { e.scalingFactorsUint = scalingFactorsUintFromDecimals(calculator.ScalingFactors) + e.cfgMu.Lock() e.factors = model.DefaultRiskFactors() + e.cfgMu.Unlock() e.model = model e.linearSlippageFactor = linearSlippageFactor e.quadraticSlippageFactor = quadraticSlippageFactor @@ -245,9 +249,19 @@ func (e *Engine) ReloadConf(cfg Config) { // GetRiskFactors returns risk factors per specified asset. func (e *Engine) GetRiskFactors() *types.RiskFactor { + e.cfgMu.RLock() + defer e.cfgMu.RUnlock() 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/risk/liquidation_calculation.go b/core/risk/liquidation_calculation.go index 3ba6dfcf974..c2ce3b741a3 100644 --- a/core/risk/liquidation_calculation.go +++ b/core/risk/liquidation_calculation.go @@ -28,6 +28,16 @@ type OrderInfo struct { IsMarketOrder bool } +// Clone - Not really necessary, just added to avoid future pointers +// copy if some were added. +func (o *OrderInfo) Clone() *OrderInfo { + return &OrderInfo{ + TrueRemaining: o.TrueRemaining, + Price: o.Price.Copy(), + IsMarketOrder: o.IsMarketOrder, + } +} + func CalculateLiquidationPriceWithSlippageFactors(sizePosition int64, buyOrders, sellOrders []*OrderInfo, currentPrice, collateralAvailable num.Decimal, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactorLong, riskFactorShort, fundingPaymentPerUnitPosition num.Decimal, isolatedMarginMode bool, marginFactor num.Decimal) (liquidationPriceForOpenVolume, liquidationPriceWithBuyOrders, liquidationPriceWithSellOrders num.Decimal, err error) { openVolume := num.DecimalFromInt64(sizePosition).Div(positionFactor) diff --git a/core/risk/margins_calculation.go b/core/risk/margins_calculation.go index 23c9d8a1e74..9170bbddf94 100644 --- a/core/risk/margins_calculation.go +++ b/core/risk/margins_calculation.go @@ -46,6 +46,19 @@ func scalingFactorsUintFromDecimals(sf *types.ScalingFactors) *scalingFactorsUin } } +func newMarginLevelsFull(maintenance num.Decimal) *types.MarginLevels { + maint, _ := num.UintFromDecimal(maintenance.Ceil()) + return &types.MarginLevels{ + MaintenanceMargin: maint, + SearchLevel: maint.Clone(), + InitialMargin: maint.Clone(), + CollateralReleaseLevel: maint.Clone(), + OrderMargin: num.UintZero(), + MarginMode: types.MarginModeCrossMargin, + MarginFactor: num.DecimalZero(), + } +} + func newMarginLevels(maintenance num.Decimal, scalingFactors *scalingFactorsUint) *types.MarginLevels { umaintenance, _ := num.UintFromDecimal(maintenance.Ceil()) return &types.MarginLevels{ @@ -59,9 +72,85 @@ func newMarginLevels(maintenance num.Decimal, scalingFactors *scalingFactorsUint } } +func (e *Engine) calculateFullCollatMargins(m events.Margin, price *num.Uint, _ types.RiskFactor, withPotential bool) *types.MarginLevels { + var ( + marginMaintenanceLng num.Decimal + marginMaintenanceSht num.Decimal + ) + // convert volumn to a decimal number from a * 10^pdp + openVolume := num.DecimalFromInt64(m.Size()).Div(e.positionFactor) + aep := m.AverageEntryPrice().ToDecimal() + base := price.ToDecimal() + var ( + riskiestLng = openVolume + riskiestSht = openVolume + ) + // the party has no open positions that we need to calculate margin for + if riskiestLng.IsZero() && riskiestSht.IsZero() && !withPotential { + return &types.MarginLevels{ + MaintenanceMargin: num.UintZero(), + SearchLevel: num.UintZero(), + InitialMargin: num.UintZero(), + CollateralReleaseLevel: num.UintZero(), + OrderMargin: num.UintZero(), + MarginMode: types.MarginModeCrossMargin, + MarginFactor: num.DecimalZero(), + } + } + if riskiestLng.IsPositive() { + marginMaintenanceLng = riskiestLng.Mul(aep) + } else { + // even our riskies position is short, get the sell AEP + marginMaintenanceLng = riskiestLng.Mul(base.Sub(aep)).Abs() + } + if riskiestSht.IsNegative() { + marginMaintenanceSht = riskiestSht.Mul(base.Sub(aep)).Abs() + } else { + // even the shortest position is long, get buy AEP + marginMaintenanceSht = riskiestSht.Mul(aep) + } + if withPotential { + // add margins required to cover the buy and sell orders + longSize := num.DecimalFromInt64(m.Buy()).Div(e.positionFactor) + // size * order price + longMargin := longSize.Mul(m.VWBuy().ToDecimal()) + // add limit price * size to the margin required + shortSize := num.DecimalFromInt64(m.Sell()).Div(e.positionFactor).Abs() + // size * (max price - order price) + shortMargin := shortSize.Mul(base.Sub(m.VWSell().ToDecimal())) + marginMaintenanceLng = marginMaintenanceLng.Add(longMargin) + marginMaintenanceSht = marginMaintenanceSht.Add(shortMargin) + } + // now get the max margin required + if marginMaintenanceLng.GreaterThan(marginMaintenanceSht) { + return newMarginLevelsFull(marginMaintenanceLng) + } + // if short margin level > 0 + if !marginMaintenanceSht.IsZero() { + return newMarginLevelsFull(marginMaintenanceSht) + } + + // long margin level <= short, and short is zero, so no margin required. + return &types.MarginLevels{ + MaintenanceMargin: num.UintZero(), + SearchLevel: num.UintZero(), + InitialMargin: num.UintZero(), + CollateralReleaseLevel: num.UintZero(), + OrderMargin: num.UintZero(), + MarginMode: types.MarginModeCrossMargin, + MarginFactor: num.DecimalZero(), + } +} + // Implementation of the margin calculator per specs: // https://github.com/vegaprotocol/product/blob/master/specs/0019-margin-calculator.md func (e *Engine) calculateMargins(m events.Margin, markPrice *num.Uint, rf types.RiskFactor, withPotentialBuyAndSell, auction bool, inc num.Decimal, auctionPrice *num.Uint) *types.MarginLevels { + if e.marginCalculator.FullyCollateralised { + if auction && auctionPrice != nil { + return e.calculateFullCollatMargins(m, auctionPrice, rf, withPotentialBuyAndSell) + } + return e.calculateFullCollatMargins(m, markPrice, rf, withPotentialBuyAndSell) + } var ( marginMaintenanceLng num.Decimal marginMaintenanceSht num.Decimal diff --git a/core/risk/models/lognormal.go b/core/risk/models/lognormal.go index 1c91bdaaf38..6d1a213c0fc 100644 --- a/core/risk/models/lognormal.go +++ b/core/risk/models/lognormal.go @@ -34,6 +34,7 @@ type LogNormal struct { riskAversionParameter, tau num.Decimal params riskmodelbs.ModelParamsBS asset string + RiskFactorOverride *types.RiskFactorOverride distCache interfaces.AnalyticalDistribution cachePrice num.Decimal @@ -49,6 +50,15 @@ func NewBuiltinFutures(pf *types.LogNormalRiskModel, asset string) (*LogNormal, mu, _ := pf.Params.Mu.Float64() r, _ := pf.Params.R.Float64() sigma, _ := pf.Params.Sigma.Float64() + + var override *types.RiskFactorOverride + if pf.RiskFactorOverride != nil { + override = &types.RiskFactorOverride{ + Short: pf.RiskFactorOverride.Short, + Long: pf.RiskFactorOverride.Long, + } + } + return &LogNormal{ riskAversionParameter: pf.RiskAversionParameter, tau: pf.Tau, @@ -58,13 +68,21 @@ func NewBuiltinFutures(pf *types.LogNormalRiskModel, asset string) (*LogNormal, R: r, Sigma: sigma, }, - asset: asset, + RiskFactorOverride: override, + asset: asset, }, nil } // CalculateRiskFactors calls the risk model in order to get // the new risk models. func (f *LogNormal) CalculateRiskFactors() *types.RiskFactor { + if f.RiskFactorOverride != nil { + return &types.RiskFactor{ + Long: f.RiskFactorOverride.Long, + Short: f.RiskFactorOverride.Short, + } + } + rav, _ := f.riskAversionParameter.Float64() tau, _ := f.tau.Float64() rawrf := riskmodelbs.RiskFactorsForward(rav, tau, f.params) @@ -112,6 +130,13 @@ func (f *LogNormal) GetProjectionHorizon() num.Decimal { } func (f *LogNormal) DefaultRiskFactors() *types.RiskFactor { + if f.RiskFactorOverride != nil { + return &types.RiskFactor{ + Long: f.RiskFactorOverride.Long, + Short: f.RiskFactorOverride.Short, + } + } + return &types.RiskFactor{ Short: num.DecimalFromFloat(1), Long: num.DecimalFromFloat(1), diff --git a/core/risk/statevar.go b/core/risk/statevar.go index cd02a57d168..ca0129f4c15 100644 --- a/core/risk/statevar.go +++ b/core/risk/statevar.go @@ -55,12 +55,16 @@ func (e *Engine) startRiskFactorsCalculation(eventID string, endOfCalcCallback s // CalculateRiskFactorsForTest is a hack for testing for setting directly the risk factors for a market. func (e *Engine) CalculateRiskFactorsForTest() { + e.cfgMu.Lock() + defer e.cfgMu.Unlock() e.factors = e.model.CalculateRiskFactors() e.factors.Market = e.mktID } // updateRiskFactor sets the risk factor value to that of the decimal consensus value. func (e *Engine) updateRiskFactor(ctx context.Context, res statevar.StateVariableResult) error { + e.cfgMu.Lock() + defer e.cfgMu.Unlock() e.factors = res.(*types.RiskFactor) e.factors.Market = e.mktID e.riskFactorsInitialised = true @@ -71,5 +75,7 @@ func (e *Engine) updateRiskFactor(ctx context.Context, res statevar.StateVariabl } func (e *Engine) IsRiskFactorInitialised() bool { + e.cfgMu.RLock() + defer e.cfgMu.RUnlock() return e.riskFactorsInitialised } diff --git a/core/settlement/engine.go b/core/settlement/engine.go index 0eba081daad..be3a486f122 100644 --- a/core/settlement/engine.go +++ b/core/settlement/engine.go @@ -345,7 +345,10 @@ func (e *Engine) SettleMTM(ctx context.Context, markPrice *num.Uint, positions [ } // no need for this lock anymore e.mu.Unlock() - delta := num.UintZero().Sub(lossTotal, winTotal) + delta := num.UintZero() + if lossTotal.GT(winTotal) { + delta.Sub(lossTotal, winTotal) + } // make sure largests share is never nil if largestShare == nil { largestShare = &mtmTransfer{ diff --git a/core/settlement/engine_test.go b/core/settlement/engine_test.go index 50756694fe2..43bcade79b3 100644 --- a/core/settlement/engine_test.go +++ b/core/settlement/engine_test.go @@ -84,6 +84,7 @@ func TestMTMWinDistribution(t *testing.T) { t.Run("A MTM loss party with a loss of value 1, with several parties needing a win", testMTMWinOneExcess) t.Run("Distribute win excess in a scenario where no transfer amount is < 1", testMTMWinNoZero) t.Run("Distribute loss excess in a scenario where no transfer amount is < 1", testMTMWinWithZero) + t.Run("A MTM case where win total > loss total", testMTMWinGTLoss) } func testSettlingAFundingPeriod(t *testing.T) { @@ -1395,6 +1396,105 @@ func testMTMWinWithZero(t *testing.T) { require.NotEmpty(t, transfers) } +func testMTMWinGTLoss(t *testing.T) { + // cheat by setting the factor to some specific value, makes it easier to create a scenario where win/loss amounts don't match + engine := getTestEngineWithFactor(t, 5) + defer engine.Finish() + + price := num.NewUint(100000) + one := num.NewUint(1) + two := num.Sum(one, one) + ctx := context.Background() + + initPos := []testPos{ + { + price: price.Clone(), + party: "party-1", + size: 10, + }, + { + price: price.Clone(), + party: "party-2", + size: -4, + }, + { + price: price.Clone(), + party: "party-3", + size: -1, + }, + { + price: price.Clone(), + party: "party-4", + size: -5, + }, + { + price: price.Clone(), + party: "party-6", + size: -1, + }, + { + price: price.Clone(), + party: "party-7", + size: 1, + }, + } + init := make([]events.MarketPosition, 0, len(initPos)) + for _, p := range initPos { + init = append(init, p) + } + + somePrice := num.Sum(price, two) + newPrice := num.Sum(price, one) + newParty := testPos{ + size: 3, + price: newPrice.Clone(), + party: "party-5", + } + + trades := []*types.Trade{ + { + Size: 1, + Buyer: newParty.party, + Seller: initPos[0].party, + Price: somePrice.Clone(), + }, + { + Size: 1, + Buyer: newParty.party, + Seller: initPos[3].party, + Price: somePrice.Clone(), + }, + { + Size: 1, + Buyer: newParty.party, + Seller: initPos[0].party, + Price: newPrice.Clone(), + }, + } + updates := make([]events.MarketPosition, 0, len(initPos)+1) + for _, trade := range trades { + for i, p := range initPos { + if p.party == trade.Seller { + p.size -= int64(trade.Size) + initPos[i] = p + } + p.price = trade.Price.Clone() + } + } + for _, p := range initPos { + updates = append(updates, p) + } + updates = append(updates, newParty) + engine.Update(init) + for _, trade := range trades { + engine.AddTrade(trade) + } + transfers := engine.SettleMTM(ctx, newPrice.Clone(), updates) + require.NotEmpty(t, transfers) + // just a single transfer of 2 + require.True(t, transfers[0].Transfer().Amount.Amount.EQ(two)) +} + // {{{. func (te *testEngine) getExpiryPositions(positions ...posValue) []events.MarketPosition { te.positions = make([]*mocks.MockMarketPosition, 0, len(positions)) diff --git a/core/snapshot/engine.go b/core/snapshot/engine.go index b9830595d24..e8197b293d1 100644 --- a/core/snapshot/engine.go +++ b/core/snapshot/engine.go @@ -64,6 +64,8 @@ type DoneCh <-chan interface{} type TimeService interface { GetTimeNow() time.Time SetTimeNow(context.Context, time.Time) + GetTimeLastBatch() time.Time + SetPrevTime(t time.Time) } type StatsService interface { @@ -727,7 +729,7 @@ func (e *Engine) snapshotNow(ctx context.Context, saveAsync bool) ([]byte, DoneC _, block := vegactx.TraceIDFromContext(ctx) e.appState.Block = block e.appState.Time = e.timeService.GetTimeNow().UnixNano() - + e.appState.PrevBlockTime = e.timeService.GetTimeLastBatch().UnixNano() cid, err := vegactx.ChainIDFromContext(ctx) if err != nil { e.snapshotTreeLock.Unlock() @@ -883,6 +885,7 @@ func (e *Engine) restoreStateFromSnapshot(ctx context.Context, payloads []*types // Restoring state in globally shared services. e.timeService.SetTimeNow(ctx, time.Unix(0, e.appState.Time)) + e.timeService.SetPrevTime(time.Unix(0, e.appState.PrevBlockTime)) e.statsService.SetHeight(e.appState.Height) e.log.Info("loading state from snapshot", diff --git a/core/snapshot/engine_test.go b/core/snapshot/engine_test.go index 9ec77d910b6..77931e083db 100644 --- a/core/snapshot/engine_test.go +++ b/core/snapshot/engine_test.go @@ -109,6 +109,7 @@ func testRestoringStateSucceeds(t *testing.T) { // converting the chunks to payload, that are then broadcast to the providers. timeService.EXPECT().SetTimeNow(gomock.Any(), time.Unix(0, testSnapshot.appState.Time)).Times(1) + timeService.EXPECT().SetPrevTime(time.Unix(0, testSnapshot.appState.PrevBlockTime)).Times(1) statsService.EXPECT().SetHeight(testSnapshot.appState.Height).Times(1) governanceProvider.EXPECT().LoadState(gomock.Any(), testSnapshot.PayloadGovernanceActive()).Return(nil, nil).Times(1) governanceProvider.EXPECT().LoadState(gomock.Any(), testSnapshot.PayloadGovernanceEnacted()).Return(nil, nil).Times(1) @@ -176,6 +177,7 @@ func testRestoringStateSucceeds(t *testing.T) { // State restored on the snapshot engine itself, from the local snapshot. timeService.EXPECT().SetTimeNow(gomock.Any(), time.Unix(0, testSnapshot.appState.Time)).Times(1) + timeService.EXPECT().SetPrevTime(time.Unix(0, testSnapshot.appState.PrevBlockTime)).Times(1) statsService.EXPECT().SetHeight(testSnapshot.appState.Height).Times(1) // LoadState() is called once for each key. If there are 2 keys, it's called twice. @@ -363,6 +365,7 @@ func TestTakingSnapshotSucceeds(t *testing.T) { delegationProvider.EXPECT().GetState(payloadDelegationActive.Key()).Return(serialize(t, payloadDelegationActive), nil, nil).Times(1) epochProvider.EXPECT().GetState(payloadEpoch.Key()).Return(serialize(t, payloadEpoch), nil, nil).Times(1) timeService.EXPECT().GetTimeNow().Return(time.Now()).Times(1) + timeService.EXPECT().GetTimeLastBatch().Return(time.Now()).Times(1) // This time, the snapshot is triggered. hash, done, err := engine.Snapshot(ctx) @@ -378,6 +381,7 @@ func TestTakingSnapshotSucceeds(t *testing.T) { delegationProvider.EXPECT().GetState(payloadDelegationActive.Key()).Return(serialize(t, payloadDelegationActive), nil, nil).Times(1) epochProvider.EXPECT().GetState(payloadEpoch.Key()).Return(serialize(t, payloadEpoch), nil, nil).Times(1) timeService.EXPECT().GetTimeNow().Return(time.Now()).Times(1) + timeService.EXPECT().GetTimeLastBatch().Return(time.Now()).Times(1) // First 11 iterations as the snapshot occurs on th 12th one, as we configured // above. @@ -462,6 +466,7 @@ func TestProtocolVersionInAppstatePayload(t *testing.T) { require.NoError(t, engine.Start(ctx)) timeService.EXPECT().GetTimeNow().AnyTimes() + timeService.EXPECT().GetTimeLastBatch().Return(time.Now()).Times(1) _, err = engine.SnapshotNow(ctx) engine.Close() require.NoError(t, err) @@ -517,6 +522,7 @@ func TestSnapshotVersionCommunicatedToProviders(t *testing.T) { // converting the chunks to payload, that are then broadcast to the providers. timeService.EXPECT().SetTimeNow(gomock.Any(), time.Unix(0, testSnapshot.appState.Time)).Times(1) + timeService.EXPECT().SetPrevTime(time.Unix(0, testSnapshot.appState.PrevBlockTime)).Times(1) statsService.EXPECT().SetHeight(testSnapshot.appState.Height).Times(1) governanceProvider.EXPECT().LoadState(gomock.Any(), testSnapshot.PayloadGovernanceActive()).Return(nil, nil).Times(1) governanceProvider.EXPECT().LoadState(gomock.Any(), testSnapshot.PayloadGovernanceEnacted()).Return(nil, nil).Times(1) diff --git a/core/snapshot/mocks/mocks.go b/core/snapshot/mocks/mocks.go index fb400f7457e..59dcad12010 100644 --- a/core/snapshot/mocks/mocks.go +++ b/core/snapshot/mocks/mocks.go @@ -35,6 +35,20 @@ func (m *MockTimeService) EXPECT() *MockTimeServiceMockRecorder { return m.recorder } +// GetTimeLastBatch mocks base method. +func (m *MockTimeService) GetTimeLastBatch() time.Time { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetTimeLastBatch") + ret0, _ := ret[0].(time.Time) + return ret0 +} + +// GetTimeLastBatch indicates an expected call of GetTimeLastBatch. +func (mr *MockTimeServiceMockRecorder) GetTimeLastBatch() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTimeLastBatch", reflect.TypeOf((*MockTimeService)(nil).GetTimeLastBatch)) +} + // GetTimeNow mocks base method. func (m *MockTimeService) GetTimeNow() time.Time { m.ctrl.T.Helper() @@ -49,6 +63,18 @@ func (mr *MockTimeServiceMockRecorder) GetTimeNow() *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTimeNow", reflect.TypeOf((*MockTimeService)(nil).GetTimeNow)) } +// SetPrevTime mocks base method. +func (m *MockTimeService) SetPrevTime(arg0 time.Time) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "SetPrevTime", arg0) +} + +// SetPrevTime indicates an expected call of SetPrevTime. +func (mr *MockTimeServiceMockRecorder) SetPrevTime(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetPrevTime", reflect.TypeOf((*MockTimeService)(nil).SetPrevTime), arg0) +} + // SetTimeNow mocks base method. func (m *MockTimeService) SetTimeNow(arg0 context.Context, arg1 time.Time) { m.ctrl.T.Helper() diff --git a/core/snapshot/providers.go b/core/snapshot/providers.go index 5ea1fac0e0f..b0cd1778735 100644 --- a/core/snapshot/providers.go +++ b/core/snapshot/providers.go @@ -22,6 +22,7 @@ import ( // providersInCallOrder holds the providers namespace in the order in which // they must be called. var providersInCallOrder = []types.SnapshotNamespace{ + types.TxCacheSnapshot, types.EpochSnapshot, types.AssetsSnapshot, // Needs to happen before banking. types.WitnessSnapshot, // Needs to happen before banking and governance. @@ -35,8 +36,8 @@ var providersInCallOrder = []types.SnapshotNamespace{ types.DelegationSnapshot, types.FloatingPointConsensusSnapshot, // Shouldn't matter but maybe best before the markets are restored. types.ExecutionSnapshot, // Creates the markets, returns matching and positions engines for state providers. - types.MatchingSnapshot, // Requires markets. types.PositionsSnapshot, // Requires markets. + types.MatchingSnapshot, // Requires markets, and positions so that AMM's evaluate properly types.SettlementSnapshot, // Requires markets. types.LiquidationSnapshot, // Requires markets. types.HoldingAccountTrackerSnapshot, @@ -63,6 +64,7 @@ var providersInCallOrder = []types.SnapshotNamespace{ types.ActivityStreakSnapshot, types.VolumeDiscountProgramSnapshot, types.PartiesSnapshot, + types.EVMHeartbeatSnapshot, } func groupPayloadsPerNamespace(payloads []*types.Payload) map[types.SnapshotNamespace][]*types.Payload { diff --git a/core/staking/accounting.go b/core/staking/accounting.go index 66fb92a7ade..8566583546b 100644 --- a/core/staking/accounting.go +++ b/core/staking/accounting.go @@ -67,12 +67,15 @@ type Accounting struct { isValidator bool stakingAssetTotalSupply *num.Uint - stakingBridgeAddress ethcmn.Address + stakingBridgeAddresses []ethcmn.Address chainID string // snapshot bits accState accountingSnapshotState + // only used in upgrade from v0.76.8 + ethSource EthereumEventSource + // these two are used in order to propagate // the staking asset total supply at genesis. evtFwd EvtForwarder @@ -107,6 +110,7 @@ func NewAccounting( evtForward EvtForwarder, witness Witness, isValidator bool, + ethSource EthereumEventSource, ) (acc *Accounting) { log = log.Named("accounting") @@ -122,6 +126,7 @@ func NewAccounting( evtFwd: evtForward, witness: witness, isValidator: isValidator, + ethSource: ethSource, } } @@ -176,7 +181,8 @@ func (a *Accounting) GetAllAvailableBalances() map[string]*num.Uint { } func (a *Accounting) UpdateStakingBridgeAddress(ethCfg *types.EthereumConfig) error { - a.stakingBridgeAddress = ethCfg.StakingBridgeAddresses()[0] + a.stakingBridgeAddresses = ethCfg.StakingBridgeAddresses() + a.chainID = ethCfg.ChainID() if !a.accState.isRestoring { @@ -203,7 +209,7 @@ func (a *Accounting) ProcessStakeTotalSupply(_ context.Context, evt *types.Stake sts: evt, chainID: a.chainID, check: func() error { - totalSupply, err := a.getStakeAssetTotalSupply(a.stakingBridgeAddress) + totalSupply, err := a.getStakeAssetTotalSupply(a.stakingBridgeAddresses[0]) if err != nil { return err } @@ -258,7 +264,7 @@ func (a *Accounting) updateStakingAssetTotalSupply() error { return nil } - totalSupply, err := a.getStakeAssetTotalSupply(a.stakingBridgeAddress) + totalSupply, err := a.getStakeAssetTotalSupply(a.stakingBridgeAddresses[0]) if err != nil { return err } @@ -270,7 +276,7 @@ func (a *Accounting) updateStakingAssetTotalSupply() error { StakingEvent: &vgproto.StakingEvent{ Action: &vgproto.StakingEvent_TotalSupply{ TotalSupply: &vgproto.StakeTotalSupply{ - TokenAddress: a.stakingBridgeAddress.Hex(), + TokenAddress: a.stakingBridgeAddresses[0].Hex(), TotalSupply: totalSupply.String(), }, }, diff --git a/core/staking/accounting_snapshot.go b/core/staking/accounting_snapshot.go index 9763f694e4a..b7c1dd18653 100644 --- a/core/staking/accounting_snapshot.go +++ b/core/staking/accounting_snapshot.go @@ -21,6 +21,7 @@ import ( "code.vegaprotocol.io/vega/core/events" "code.vegaprotocol.io/vega/core/types" + vgcontext "code.vegaprotocol.io/vega/libs/context" "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/logging" ) @@ -175,7 +176,7 @@ func (a *Accounting) restoreStakingAccounts(ctx context.Context, accounts *types sts: pendingSupply, chainID: a.chainID, check: func() error { - totalSupply, err := a.getStakeAssetTotalSupply(a.stakingBridgeAddress) + totalSupply, err := a.getStakeAssetTotalSupply(a.stakingBridgeAddresses[0]) if err != nil { return err } @@ -193,6 +194,18 @@ func (a *Accounting) restoreStakingAccounts(ctx context.Context, accounts *types a.witness.RestoreResource(a.pendingStakeTotalSupply, a.onStakeTotalSupplyVerified) } + if vgcontext.InProgressUpgradeFrom(ctx, "v0.76.8") { + lastSeen := a.getLastBlockSeen() + for _, addr := range a.stakingBridgeAddresses { + a.log.Info("migration code updating multisig last seen", + logging.String("address", addr.Hex()), + logging.Uint64("last-seen", lastSeen), + logging.String("chain-id", a.chainID), + ) + a.ethSource.UpdateContractBlock(addr.Hex(), a.chainID, lastSeen) + } + } + a.stakingAssetTotalSupply = accounts.StakingAssetTotalSupply.Clone() var err error a.accState.serialised, err = proto.Marshal(p.IntoProto()) diff --git a/core/staking/accounting_test.go b/core/staking/accounting_test.go index 243392aa129..d6d0fc653f2 100644 --- a/core/staking/accounting_test.go +++ b/core/staking/accounting_test.go @@ -53,11 +53,12 @@ func getAccountingTest(t *testing.T) *accountingTest { broker := mocks.NewMockBroker(ctrl) evtfwd := smocks.NewMockEvtForwarder(ctrl) witness := smocks.NewMockWitness(ctrl) + ethsource := smocks.NewMockEthereumEventSource(ctrl) var onTick func(context.Context, time.Time) return &accountingTest{ Accounting: staking.NewAccounting( - log, staking.NewDefaultConfig(), ts, broker, nil, evtfwd, witness, true), + log, staking.NewDefaultConfig(), ts, broker, nil, evtfwd, witness, true, ethsource), log: log, ctrl: ctrl, tsvc: ts, diff --git a/core/staking/checkpoint.go b/core/staking/checkpoint.go index c1e68ddb8d7..a2e8c77821e 100644 --- a/core/staking/checkpoint.go +++ b/core/staking/checkpoint.go @@ -97,7 +97,9 @@ func (c *Checkpoint) Load(ctx context.Context, data []byte) error { // 0 is default value, we assume that it was then not set if b.LastBlockSeen != 0 { - c.ethEventSource.UpdateStakingStartingBlock(b.LastBlockSeen) + for _, addr := range c.stakeVerifier.ocv.GetStakingBridgeAddresses() { + c.ethEventSource.UpdateContractBlock(addr, c.accounting.chainID, b.LastBlockSeen) + } } return nil diff --git a/core/staking/checkpoint_test.go b/core/staking/checkpoint_test.go index 373909f6c91..d28d5db323a 100644 --- a/core/staking/checkpoint_test.go +++ b/core/staking/checkpoint_test.go @@ -88,8 +88,9 @@ func TestCheckpointLoadNoDuplicates(t *testing.T) { cptest.acc.broker.EXPECT().Send(gomock.Any()).AnyTimes() cptest.acc.broker.EXPECT().SendBatch(gomock.Any()).Times(1) - cptest.ethEventSource.EXPECT().UpdateStakingStartingBlock(gomock.Any()).Do( - func(block uint64) { + cptest.sv.ocv.EXPECT().GetStakingBridgeAddresses().Times(1).Return([]string{"hello"}) + cptest.ethEventSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).Do( + func(_, _ string, block uint64) { // ensure we restart at the right block // which is the last pending event we've seen assert.Equal(t, int(block), 15026715) @@ -117,9 +118,10 @@ func TestCheckpoint(t *testing.T) { cptest2 := getCheckpointTest(t) - cptest2.acc.broker.EXPECT().Send(gomock.Any()).Times(1) - cptest2.ethEventSource.EXPECT().UpdateStakingStartingBlock(gomock.Any()).Do( - func(block uint64) { + cptest2.acc.broker.EXPECT().Send(gomock.Any()).AnyTimes() + cptest2.sv.ocv.EXPECT().GetStakingBridgeAddresses().AnyTimes().Return([]string{"hello"}) + cptest2.ethEventSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).Do( + func(_, _ string, block uint64) { // ensure we restart at the right block // which is the last pending event we've seen assert.Equal(t, int(block), 42) diff --git a/core/staking/mocks/mocks.go b/core/staking/mocks/mocks.go index 6f68bad3eb8..e0f75d0ff41 100644 --- a/core/staking/mocks/mocks.go +++ b/core/staking/mocks/mocks.go @@ -113,16 +113,16 @@ func (m *MockEthereumEventSource) EXPECT() *MockEthereumEventSourceMockRecorder return m.recorder } -// UpdateStakingStartingBlock mocks base method. -func (m *MockEthereumEventSource) UpdateStakingStartingBlock(arg0 uint64) { +// UpdateContractBlock mocks base method. +func (m *MockEthereumEventSource) UpdateContractBlock(arg0, arg1 string, arg2 uint64) { m.ctrl.T.Helper() - m.ctrl.Call(m, "UpdateStakingStartingBlock", arg0) + m.ctrl.Call(m, "UpdateContractBlock", arg0, arg1, arg2) } -// UpdateStakingStartingBlock indicates an expected call of UpdateStakingStartingBlock. -func (mr *MockEthereumEventSourceMockRecorder) UpdateStakingStartingBlock(arg0 interface{}) *gomock.Call { +// UpdateContractBlock indicates an expected call of UpdateContractBlock. +func (mr *MockEthereumEventSourceMockRecorder) UpdateContractBlock(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateStakingStartingBlock", reflect.TypeOf((*MockEthereumEventSource)(nil).UpdateStakingStartingBlock), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateContractBlock", reflect.TypeOf((*MockEthereumEventSource)(nil).UpdateContractBlock), arg0, arg1, arg2) } // MockTimeService is a mock of TimeService interface. @@ -250,6 +250,20 @@ func (mr *MockEthOnChainVerifierMockRecorder) CheckStakeRemoved(arg0 interface{} return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckStakeRemoved", reflect.TypeOf((*MockEthOnChainVerifier)(nil).CheckStakeRemoved), arg0) } +// GetStakingBridgeAddresses mocks base method. +func (m *MockEthOnChainVerifier) GetStakingBridgeAddresses() []string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetStakingBridgeAddresses") + ret0, _ := ret[0].([]string) + return ret0 +} + +// GetStakingBridgeAddresses indicates an expected call of GetStakingBridgeAddresses. +func (mr *MockEthOnChainVerifierMockRecorder) GetStakingBridgeAddresses() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStakingBridgeAddresses", reflect.TypeOf((*MockEthOnChainVerifier)(nil).GetStakingBridgeAddresses)) +} + // MockWitness is a mock of Witness interface. type MockWitness struct { ctrl *gomock.Controller diff --git a/core/staking/on_chain_verifier.go b/core/staking/on_chain_verifier.go index 1ad758bc8e8..820dfd3ce11 100644 --- a/core/staking/on_chain_verifier.go +++ b/core/staking/on_chain_verifier.go @@ -74,6 +74,17 @@ func (o *OnChainVerifier) UpdateStakingBridgeAddresses(stakingBridgeAddresses [] } } +func (o *OnChainVerifier) GetStakingBridgeAddresses() []string { + o.mu.Lock() + defer o.mu.Unlock() + + addresses := make([]string, 0, len(o.stakingBridgeAddresses)) + for _, v := range o.stakingBridgeAddresses { + addresses = append(addresses, v.Hex()) + } + return addresses +} + func (o *OnChainVerifier) CheckStakeDeposited( event *types.StakeDeposited, ) error { diff --git a/core/staking/stake_verifier.go b/core/staking/stake_verifier.go index f0b89ff459d..d59e3070ea3 100644 --- a/core/staking/stake_verifier.go +++ b/core/staking/stake_verifier.go @@ -55,6 +55,7 @@ type EthConfirmations interface { type EthOnChainVerifier interface { CheckStakeDeposited(*types.StakeDeposited) error CheckStakeRemoved(*types.StakeRemoved) error + GetStakingBridgeAddresses() []string } // Witness provide foreign chain resources validations. @@ -288,15 +289,17 @@ func (s *StakeVerifier) onEventVerified(event interface{}, ok bool) { func (s *StakeVerifier) OnTick(ctx context.Context, t time.Time) { for _, evt := range s.finalizedEvents { - // s.removeEvent(evt.ID) if evt.Status == types.StakeLinkingStatusAccepted { s.accs.AddEvent(ctx, evt) + for _, addresss := range s.ocv.GetStakingBridgeAddresses() { + s.ethEventSource.UpdateContractBlock(addresss, s.accs.chainID, evt.BlockHeight) + } } + s.log.Info("stake linking finalized", logging.String("status", evt.Status.String()), logging.String("event", evt.String())) s.broker.Send(events.NewStakeLinking(ctx, *evt)) } - s.finalizedEvents = nil } diff --git a/core/staking/stake_verifier_snapshot.go b/core/staking/stake_verifier_snapshot.go index 4a0ebd6c196..505f70f2b8a 100644 --- a/core/staking/stake_verifier_snapshot.go +++ b/core/staking/stake_verifier_snapshot.go @@ -173,7 +173,7 @@ func (s *StakeVerifier) OnStateLoaded(ctx context.Context) error { } if lastBlockSeen != 0 { s.log.Info("restoring staking bridge starting block", logging.Uint64("block", lastBlockSeen)) - s.ethEventSource.UpdateStakingStartingBlock(lastBlockSeen) + // s.ethEventSource.UpdateStakingStartingBlock(lastBlockSeen) } return nil } diff --git a/core/staking/stake_verifier_snapshot_test.go b/core/staking/stake_verifier_snapshot_test.go index 763eada65de..148e74bd0e5 100644 --- a/core/staking/stake_verifier_snapshot_test.go +++ b/core/staking/stake_verifier_snapshot_test.go @@ -100,9 +100,6 @@ func TestSVSnapshotDeposited(t *testing.T) { require.Nil(t, err) // Check its there by adding it again and checking for duplication error require.ErrorIs(t, staking.ErrDuplicatedStakeDepositedEvent, snapSV.ProcessStakeDeposited(ctx, event)) - - snapSV.evtSrc.EXPECT().UpdateStakingStartingBlock(uint64(42)).Times(1) - snapSV.OnStateLoaded(ctx) } func TestSVSnapshotRemoved(t *testing.T) { diff --git a/core/staking/stake_verifier_test.go b/core/staking/stake_verifier_test.go index 4a5c17a117c..a83fe644efb 100644 --- a/core/staking/stake_verifier_test.go +++ b/core/staking/stake_verifier_test.go @@ -59,7 +59,7 @@ func getStakeVerifierTest(t *testing.T) *stakeVerifierTest { evtfwd := mocks.NewMockEvtForwarder(ctrl) evtSrc := mocks.NewMockEthereumEventSource(ctrl) - accs := staking.NewAccounting(log, cfg, ts, broker, nil, evtfwd, witness, true) + accs := staking.NewAccounting(log, cfg, ts, broker, nil, evtfwd, witness, true, evtSrc) svt := &stakeVerifierTest{ StakeVerifier: staking.NewStakeVerifier(log, cfg, accs, witness, ts, broker, ocv, evtSrc), @@ -125,6 +125,7 @@ func testProcessStakeEventDepositedOK(t *testing.T) { f(evt, true) stakev.broker.EXPECT().Send(gomock.Any()).Times(1) + stakev.ocv.EXPECT().GetStakingBridgeAddresses().Times(1) stakev.onTick(context.Background(), time.Unix(10, 0)) balance, err := stakev.accs.GetAvailableBalance("somepubkey") @@ -216,6 +217,7 @@ func testProcessStakeEventRemovedOK(t *testing.T) { // no expectation there. f(evt, true) + stakev.ocv.EXPECT().GetStakingBridgeAddresses().Times(1) stakev.broker.EXPECT().Send(gomock.Any()).Times(1) stakev.onTick(context.Background(), time.Unix(10, 0)) @@ -278,6 +280,7 @@ func testProcessStakeEventMultiOK(t *testing.T) { stakev.tsvc.EXPECT().GetTimeNow().Times(2) stakev.broker.EXPECT().Send(gomock.Any()).Times(2) + stakev.ocv.EXPECT().GetStakingBridgeAddresses().AnyTimes() var f func(interface{}, bool) var evt interface{} diff --git a/core/staking/staking.go b/core/staking/staking.go index 48239ecb3b9..245fdb05ff9 100644 --- a/core/staking/staking.go +++ b/core/staking/staking.go @@ -40,7 +40,7 @@ type EthereumClientConfirmations interface { } type EthereumEventSource interface { - UpdateStakingStartingBlock(uint64) + UpdateContractBlock(string, string, uint64) } func New( @@ -58,7 +58,7 @@ func New( ) (*Accounting, *StakeVerifier, *Checkpoint) { log = log.Named(namedLogger) log.SetLevel(cfg.Level.Get()) - accs := NewAccounting(log, cfg, ts, broker, ethClient, evtFwd, witness, isValidator) + accs := NewAccounting(log, cfg, ts, broker, ethClient, evtFwd, witness, isValidator, ethEventSource) ocv := NewOnChainVerifier(cfg, log, ethClient, ethCfns) stakeV := NewStakeVerifier(log, cfg, accs, witness, ts, broker, ocv, ethEventSource) diff --git a/core/txcache/cache.go b/core/txcache/cache.go new file mode 100644 index 00000000000..179e79e3fd7 --- /dev/null +++ b/core/txcache/cache.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 txcache + +import ( + "context" + "fmt" + "sort" + + "code.vegaprotocol.io/vega/core/nodewallets" + "code.vegaprotocol.io/vega/core/txn" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/proto" + commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1" + snapshotpb "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" +) + +func NewTxCache(commander *nodewallets.Commander) *TxCache { + return &TxCache{ + commander: commander, + marketToDelayRequired: map[string]bool{}, + heightToTxs: map[uint64][][]byte{}, + } +} + +type TxCache struct { + commander *nodewallets.Commander + heightToTxs map[uint64][][]byte + // network param + numBlocksToDelay uint64 + // no need to include is snapshot - is updated when markets are created/updated/loaded from snapshot + marketToDelayRequired map[string]bool +} + +// MarketDelayRequiredUpdated is called when the market configuration is created/updated with support for +// transaction reordering. +func (t *TxCache) MarketDelayRequiredUpdated(marketID string, required bool) { + t.marketToDelayRequired[marketID] = required +} + +// IsDelayRequired returns true if the market supports transaction reordering. +func (t *TxCache) IsDelayRequired(marketID string) bool { + delay, ok := t.marketToDelayRequired[marketID] + return ok && delay +} + +// IsDelayRequiredAnyMarket returns true of there is any market that supports transaction reordering. +func (t *TxCache) IsDelayRequiredAnyMarket() bool { + return len(t.marketToDelayRequired) > 0 +} + +// OnNumBlocksToDelayUpdated is called when the network parameter for the number of blocks to delay +// transactions is updated. +func (t *TxCache) OnNumBlocksToDelayUpdated(_ context.Context, blocks *num.Uint) error { + t.numBlocksToDelay = blocks.Uint64() + return nil +} + +// NewDelayedTransaction creates a new delayed transaction with a target block height being the current +// block being proposed + the configured network param indicating the target delay. +func (t *TxCache) NewDelayedTransaction(ctx context.Context, delayed [][]byte, currentHeight uint64) []byte { + height := currentHeight + t.numBlocksToDelay + payload := &commandspb.DelayedTransactionsWrapper{Transactions: delayed, Height: height} + tx, err := t.commander.NewTransaction(ctx, txn.DelayedTransactionsWrapper, payload) + if err != nil { + panic(err.Error()) + } + return tx +} + +func (t *TxCache) SetRawTxs(rtx [][]byte, height uint64) { + if rtx == nil { + delete(t.heightToTxs, height) + } else { + t.heightToTxs[height] = rtx + } +} + +func (t *TxCache) GetRawTxs(height uint64) [][]byte { + return t.heightToTxs[height] +} + +func (t *TxCache) Namespace() types.SnapshotNamespace { + return types.TxCacheSnapshot +} + +func (t *TxCache) Keys() []string { + return []string{(&types.PayloadTxCache{}).Key()} +} + +func (t *TxCache) GetState(k string) ([]byte, []types.StateProvider, error) { + delays := make([]*snapshotpb.DelayedTx, 0, len(t.heightToTxs)) + for delay, txs := range t.heightToTxs { + delays = append(delays, &snapshotpb.DelayedTx{ + Height: delay, + Tx: txs, + }) + } + sort.Slice(delays, func(i, j int) bool { + return delays[i].Height < delays[j].Height + }) + + payload := &snapshotpb.Payload{ + Data: &snapshotpb.Payload_TxCache{ + TxCache: &snapshotpb.TxCache{ + Txs: delays, + }, + }, + } + + serialised, err := proto.Marshal(payload) + if err != nil { + return nil, nil, fmt.Errorf("could not serialize tx cache payload: %w", err) + } + return serialised, nil, err +} + +func (t *TxCache) LoadState(_ context.Context, p *types.Payload) ([]types.StateProvider, error) { + if t.Namespace() != p.Data.Namespace() { + return nil, types.ErrInvalidSnapshotNamespace + } + + switch data := p.Data.(type) { + case *types.PayloadTxCache: + t.heightToTxs = map[uint64][][]byte{} + for _, tx := range data.TxCache.Txs { + t.heightToTxs[tx.Height] = tx.Tx + } + return nil, nil + default: + return nil, types.ErrUnknownSnapshotType + } +} + +func (t *TxCache) Stopped() bool { + return false +} + +func (e *TxCache) StopSnapshots() {} diff --git a/core/txn/command.go b/core/txn/command.go index 94f20e1a6cf..0f4867581dd 100644 --- a/core/txn/command.go +++ b/core/txn/command.go @@ -88,6 +88,14 @@ const ( BatchProposeCommand Command = 0x62 // UpdatePartyProfileCommand ... UpdatePartyProfileCommand Command = 0x63 + // SubmitAMMCommand ... + SubmitAMMCommand Command = 0x64 + // AmendAMMCommand ... + AmendAMMCommand Command = 0x65 + // CancelAMMCommand ... + CancelAMMCommand Command = 0x66 + // DelayedTransactionsWrapper ... + DelayedTransactionsWrapper Command = 0x67 ) var commandName = map[Command]string{ @@ -125,11 +133,15 @@ var commandName = map[Command]string{ JoinTeamCommand: "Join Team", BatchProposeCommand: "Batch Proposal", UpdatePartyProfileCommand: "Update Party Profile", + SubmitAMMCommand: "Submit AMM", + AmendAMMCommand: "Amend AMM", + CancelAMMCommand: "Cancel AMM", + DelayedTransactionsWrapper: "Delayed Transactions Wrapper", } func (cmd Command) IsValidatorCommand() bool { switch cmd { - case NodeSignatureCommand, ChainEventCommand, NodeVoteCommand, ValidatorHeartbeatCommand, RotateKeySubmissionCommand, StateVariableProposalCommand, RotateEthereumKeySubmissionCommand: + case DelayedTransactionsWrapper, NodeSignatureCommand, ChainEventCommand, NodeVoteCommand, ValidatorHeartbeatCommand, RotateKeySubmissionCommand, StateVariableProposalCommand, RotateEthereumKeySubmissionCommand: return true default: return false diff --git a/core/types/amm.go b/core/types/amm.go new file mode 100644 index 00000000000..390ea1a3dc7 --- /dev/null +++ b/core/types/amm.go @@ -0,0 +1,353 @@ +// 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 + LeverageAtLowerBound *num.Decimal + LeverageAtUpperBound *num.Decimal +} + +func (p *ConcentratedLiquidityParameters) ToProtoEvent() *eventspb.AMM_ConcentratedLiquidityParameters { + var upper, lower *string + if p.UpperBound != nil { + upper = ptr.From(p.UpperBound.String()) + } + + if p.LowerBound != nil { + lower = ptr.From(p.LowerBound.String()) + } + + var lowerLeverage, upperLeverage *string + if p.LeverageAtLowerBound != nil { + lowerLeverage = ptr.From(p.LeverageAtLowerBound.String()) + } + + if p.LeverageAtUpperBound != nil { + upperLeverage = ptr.From(p.LeverageAtUpperBound.String()) + } + return &eventspb.AMM_ConcentratedLiquidityParameters{ + Base: p.Base.String(), + LowerBound: lower, + UpperBound: upper, + LeverageAtUpperBound: upperLeverage, + LeverageAtLowerBound: lowerLeverage, + } +} + +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.LeverageAtLowerBound != nil { + cpy := *p.LeverageAtLowerBound + ret.LeverageAtLowerBound = &cpy + } + if p.LeverageAtUpperBound != nil { + cpy := *p.LeverageAtUpperBound + ret.LeverageAtUpperBound = &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 + upperLeverage, lowerLeverage *num.Decimal + ) + + commitment, _ := num.UintFromString(submitAMM.CommitmentAmount, 10) + + params := submitAMM.ConcentratedLiquidityParameters + base, _ := num.UintFromString(params.Base, 10) + if params.LowerBound != nil { + lowerBound, _ = num.UintFromString(*params.LowerBound, 10) + } + + if params.LeverageAtLowerBound != nil { + leverage, _ := num.DecimalFromString(*params.LeverageAtLowerBound) + lowerLeverage = ptr.From(leverage) + } + + if params.UpperBound != nil { + upperBound, _ = num.UintFromString(*params.UpperBound, 10) + } + + if params.LeverageAtUpperBound != nil { + leverage, _ := num.DecimalFromString(*params.LeverageAtUpperBound) + upperLeverage = ptr.From(leverage) + } + + 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, + LeverageAtLowerBound: lowerLeverage, + LeverageAtUpperBound: upperLeverage, + }, + } +} + +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, leverageLower, leverageUpper *string + var base string + if s.Parameters.LowerBound != nil { + lower = ptr.From(s.Parameters.LowerBound.String()) + } + + if s.Parameters.LeverageAtLowerBound != nil { + leverageLower = ptr.From(s.Parameters.LeverageAtLowerBound.String()) + } + + if s.Parameters.UpperBound != nil { + upper = ptr.From(s.Parameters.UpperBound.String()) + } + + if s.Parameters.LeverageAtUpperBound != nil { + leverageUpper = ptr.From(s.Parameters.LeverageAtUpperBound.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, + LeverageAtUpperBound: leverageUpper, + LeverageAtLowerBound: leverageLower, + }, + } +} + +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 = 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.LeverageAtLowerBound != nil { + ret.ConcentratedLiquidityParameters.LeverageAtLowerBound = ptr.From(a.Parameters.LeverageAtLowerBound.String()) + } + if a.Parameters.LeverageAtUpperBound != nil { + ret.ConcentratedLiquidityParameters.LeverageAtUpperBound = ptr.From(a.Parameters.LeverageAtUpperBound.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 leverageAtUpperBound, leverageAtLowerBound *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 { + 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.LeverageAtLowerBound != nil { + leverage, _ := num.DecimalFromString(*amendAMM.ConcentratedLiquidityParameters.LeverageAtLowerBound) + leverageAtLowerBound = ptr.From(leverage) + } + if amendAMM.ConcentratedLiquidityParameters.LeverageAtUpperBound != nil { + leverage, _ := num.DecimalFromString(*amendAMM.ConcentratedLiquidityParameters.LeverageAtUpperBound) + leverageAtUpperBound = ptr.From(leverage) + } + } + + 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, + LeverageAtUpperBound: leverageAtUpperBound, + LeverageAtLowerBound: leverageAtLowerBound, + }, + } +} + +type CancelAMM struct { + MarketID string + Party string + Method AMMCancellationMethod +} + +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 AMMCancellationMethod = commandspb.CancelAMM_Method + +const ( + AMMCancellationMethodUnspecified AMMCancellationMethod = commandspb.CancelAMM_METHOD_UNSPECIFIED + AMMCancellationMethodImmediate = commandspb.CancelAMM_METHOD_IMMEDIATE + AMMCancellationMethodReduceOnly = commandspb.CancelAMM_METHOD_REDUCE_ONLY +) + +type AMMStatusReason = eventspb.AMM_StatusReason + +const ( + AMMStatusReasonUnspecified AMMStatusReason = eventspb.AMM_STATUS_REASON_UNSPECIFIED + AMMStatusReasonCancelledByParty = eventspb.AMM_STATUS_REASON_CANCELLED_BY_PARTY + AMMStatusReasonCannotFillCommitment = eventspb.AMM_STATUS_REASON_CANNOT_FILL_COMMITMENT + AMMStatusReasonPartyAlreadyOwnsAPool = eventspb.AMM_STATUS_REASON_PARTY_ALREADY_OWNS_AMM_FOR_MARKET + AMMStatusReasonPartyClosedOut = eventspb.AMM_STATUS_REASON_PARTY_CLOSED_OUT + AMMStatusReasonMarketClosed = eventspb.AMM_STATUS_REASON_MARKET_CLOSED + AMMStatusReasonCommitmentTooLow = eventspb.AMM_STATUS_REASON_COMMITMENT_TOO_LOW + AMMStatusReasonCannotRebase = eventspb.AMM_STATUS_REASON_CANNOT_REBASE +) + +type AMMPoolStatus = eventspb.AMM_Status + +const ( + AMMPoolStatusUnspecified AMMPoolStatus = eventspb.AMM_STATUS_UNSPECIFIED + AMMPoolStatusActive = eventspb.AMM_STATUS_ACTIVE + AMMPoolStatusRejected = eventspb.AMM_STATUS_REJECTED + AMMPoolStatusCancelled = eventspb.AMM_STATUS_CANCELLED + AMMPoolStatusStopped = eventspb.AMM_STATUS_STOPPED + AMMPoolStatusReduceOnly = eventspb.AMM_STATUS_REDUCE_ONLY +) diff --git a/core/types/banking.go b/core/types/banking.go index 5afc53bd0cc..7e0185e6f28 100644 --- a/core/types/banking.go +++ b/core/types/banking.go @@ -48,6 +48,7 @@ var ( ErrMissingTransferKind = errors.New("missing transfer kind") ErrCannotTransferZeroFunds = errors.New("cannot transfer zero funds") ErrInvalidFromAccount = errors.New("invalid from account") + ErrInvalidFromDerivedKey = errors.New("invalid from derived key") ErrInvalidToAccount = errors.New("invalid to account") ErrUnsupportedFromAccountType = errors.New("unsupported from account type") ErrUnsupportedToAccountType = errors.New("unsupported to account type") @@ -68,6 +69,7 @@ const ( type TransferBase struct { ID string From string + FromDerivedKey *string FromAccountType AccountType To string ToAccountType AccountType @@ -91,6 +93,22 @@ func (t *TransferBase) IsValid() error { return ErrCannotTransferZeroFunds } + // check for derived account transfer + if t.FromDerivedKey != nil { + if !vgcrypto.IsValidVegaPubKey(*t.FromDerivedKey) { + return ErrInvalidFromDerivedKey + } + + if t.FromAccountType != AccountTypeVestedRewards { + return ErrUnsupportedFromAccountType + } + + if t.ToAccountType != AccountTypeGeneral { + return ErrUnsupportedToAccountType + } + } + + // check for any other transfers switch t.FromAccountType { case AccountTypeGeneral, AccountTypeVestedRewards /*, AccountTypeLockedForStaking*/ : break @@ -183,6 +201,7 @@ func (g *GovernanceTransfer) IntoEvent(amount *num.Uint, reason, gameID *string) StartEpoch: g.Config.RecurringTransferConfig.StartEpoch, EndEpoch: g.Config.RecurringTransferConfig.EndEpoch, DispatchStrategy: g.Config.RecurringTransferConfig.DispatchStrategy, + Factor: g.Config.RecurringTransferConfig.Factor, }, } } @@ -363,7 +382,7 @@ func newTransferBase(id, from string, tf *commandspb.Transfer) (*TransferBase, e return nil, errors.New("invalid transfer amount") } - return &TransferBase{ + tb := &TransferBase{ ID: id, From: from, FromAccountType: tf.FromAccountType, @@ -373,7 +392,13 @@ func newTransferBase(id, from string, tf *commandspb.Transfer) (*TransferBase, e Amount: amount, Reference: tf.Reference, Status: TransferStatusPending, - }, nil + } + + if tf.From != nil { + tb.FromDerivedKey = tf.From + } + + return tb, nil } func newOneOffTransfer(base *TransferBase, tf *commandspb.Transfer) (*TransferFunds, error) { diff --git a/core/types/banking_snapshot.go b/core/types/banking_snapshot.go index bbdd266bf0e..43b49dfe698 100644 --- a/core/types/banking_snapshot.go +++ b/core/types/banking_snapshot.go @@ -16,6 +16,8 @@ package types import ( + "time" + checkpointpb "code.vegaprotocol.io/vega/protos/vega/checkpoint/v1" snapshot "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" ) @@ -567,12 +569,14 @@ func PayloadBankingTransferFeeDiscountsFromProto(pbd *snapshot.Payload_BankingTr type PayloadBankingRecurringTransfers struct { BankingRecurringTransfers *checkpointpb.RecurringTransfers + NextMetricUpdate time.Time } func (p PayloadBankingRecurringTransfers) IntoProto() *snapshot.Payload_BankingRecurringTransfers { return &snapshot.Payload_BankingRecurringTransfers{ BankingRecurringTransfers: &snapshot.BankingRecurringTransfers{ RecurringTransfers: p.BankingRecurringTransfers, + NextMetricUpdate: p.NextMetricUpdate.UnixNano(), }, } } @@ -594,5 +598,6 @@ func (*PayloadBankingRecurringTransfers) Namespace() SnapshotNamespace { func PayloadBankingRecurringTransfersFromProto(pbd *snapshot.Payload_BankingRecurringTransfers) *PayloadBankingRecurringTransfers { return &PayloadBankingRecurringTransfers{ BankingRecurringTransfers: pbd.BankingRecurringTransfers.RecurringTransfers, + NextMetricUpdate: time.Unix(0, pbd.BankingRecurringTransfers.NextMetricUpdate), } } diff --git a/core/types/ethereum.go b/core/types/ethereum.go index 9a8cab8cb30..ec24f384059 100644 --- a/core/types/ethereum.go +++ b/core/types/ethereum.go @@ -19,6 +19,7 @@ import ( "encoding/json" "errors" "fmt" + "time" vgreflect "code.vegaprotocol.io/vega/libs/reflect" proto "code.vegaprotocol.io/vega/protos/vega" @@ -52,6 +53,7 @@ type EthereumConfig struct { multiSigControl EthereumContract stakingBridge EthereumContract vestingBridge EthereumContract + blockTime time.Duration } func EthereumConfigFromUntypedProto(v interface{}) (*EthereumConfig, error) { @@ -84,6 +86,7 @@ func EthereumConfigFromProto(cfgProto *proto.EthereumConfig) (*EthereumConfig, e address: cfgProto.MultisigControlContract.Address, deploymentBlockHeight: cfgProto.MultisigControlContract.DeploymentBlockHeight, }, + blockTime: 12 * time.Second, } if cfgProto.StakingBridgeContract != nil { @@ -100,6 +103,14 @@ func EthereumConfigFromProto(cfgProto *proto.EthereumConfig) (*EthereumConfig, e } } + if len(cfgProto.BlockTime) != 0 { + bl, err := time.ParseDuration(cfgProto.BlockTime) + if err != nil { + return nil, fmt.Errorf("invalid Ethereum chain configuration, block_length: %w", err) + } + cfg.blockTime = bl + } + return cfg, nil } @@ -131,6 +142,10 @@ func (c *EthereumConfig) VestingBridge() EthereumContract { return c.vestingBridge } +func (c *EthereumConfig) BlockTime() time.Duration { + return c.blockTime +} + // StakingBridgeAddresses returns the registered staking bridge addresses. It // might return the staking bridge, or the token vesting, or both contract // address. The vesting contract can also be used to get information needed by @@ -224,6 +239,13 @@ func CheckEthereumConfig(cfgProto *proto.EthereumConfig) error { return ErrAtLeastOneOfStakingOrVestingBridgeAddressMustBeSet } + if len(cfgProto.BlockTime) != 0 { + _, err := time.ParseDuration(cfgProto.BlockTime) + if err != nil { + return ErrInvalidBlockLengthDuration + } + } + return nil } diff --git a/core/types/fee_score.go b/core/types/fee_score.go index 597255d2be9..fe5520efd12 100644 --- a/core/types/fee_score.go +++ b/core/types/fee_score.go @@ -22,8 +22,13 @@ import ( // PartyContributionScore represents the fraction the party has in the total fee. type PartyContributionScore struct { - Party string - Score num.Decimal + Party string + Score num.Decimal + StakingBalance *num.Uint + OpenVolume *num.Uint + TotalFeesPaid *num.Uint + IsEligible bool + RankingIndex int64 } type MarketContributionScore struct { diff --git a/core/types/governance_new_market.go b/core/types/governance_new_market.go index 7443bceaf64..b23d7791c6f 100644 --- a/core/types/governance_new_market.go +++ b/core/types/governance_new_market.go @@ -412,6 +412,7 @@ type NewMarketConfiguration struct { LiquidationStrategy *LiquidationStrategy MarkPriceConfiguration *CompositePriceConfiguration TickSize *num.Uint + EnableTxReordering bool } func (n NewMarketConfiguration) IntoProto() *vegapb.NewMarketConfiguration { @@ -459,6 +460,7 @@ func (n NewMarketConfiguration) IntoProto() *vegapb.NewMarketConfiguration { LiquidationStrategy: liqStrat, MarkPriceConfiguration: n.MarkPriceConfiguration.IntoProto(), TickSize: n.TickSize.String(), + EnableTransactionReordering: n.EnableTxReordering, } if n.Successor != nil { r.Successor = n.Successor.IntoProto() @@ -480,6 +482,7 @@ func (n NewMarketConfiguration) DeepClone() *NewMarketConfiguration { LinearSlippageFactor: n.LinearSlippageFactor.Copy(), QuadraticSlippageFactor: n.QuadraticSlippageFactor.Copy(), TickSize: n.TickSize.Clone(), + EnableTxReordering: n.EnableTxReordering, } cpy.Metadata = append(cpy.Metadata, n.Metadata...) if n.Instrument != nil { @@ -512,7 +515,7 @@ func (n NewMarketConfiguration) DeepClone() *NewMarketConfiguration { func (n NewMarketConfiguration) String() string { return fmt.Sprintf( - "decimalPlaces(%v) positionDecimalPlaces(%v) metadata(%v) instrument(%s) priceMonitoring(%s) liquidityMonitoring(%s) risk(%s) linearSlippageFactor(%s) quadraticSlippageFactor(%s), CompositePriceConfiguration(%s), TickSize(%s)", + "decimalPlaces(%v) positionDecimalPlaces(%v) metadata(%v) instrument(%s) priceMonitoring(%s) liquidityMonitoring(%s) risk(%s) linearSlippageFactor(%s) quadraticSlippageFactor(%s), CompositePriceConfiguration(%s), TickSize(%s), EnableTxReordering(%v)", n.Metadata, n.DecimalPlaces, n.PositionDecimalPlaces, @@ -524,6 +527,7 @@ func (n NewMarketConfiguration) String() string { n.QuadraticSlippageFactor.String(), stringer.PtrToString(n.MarkPriceConfiguration), num.UintToString(n.TickSize), + n.EnableTxReordering, ) } @@ -627,6 +631,7 @@ func NewMarketConfigurationFromProto(p *vegapb.NewMarketConfiguration) (*NewMark LiquidationStrategy: liqStrat, MarkPriceConfiguration: markPriceConfig, TickSize: tickSize, + EnableTxReordering: p.EnableTransactionReordering, } if p.RiskParameters != nil { switch rp := p.RiskParameters.(type) { @@ -741,11 +746,19 @@ func (n NewMarketConfigurationLogNormal) String() string { } func NewMarketConfigurationLogNormalFromProto(p *vegapb.NewMarketConfiguration_LogNormal) *NewMarketConfigurationLogNormal { + var override *RiskFactorOverride + if p.LogNormal.RiskFactorOverride != nil { + override = &RiskFactorOverride{ + Short: num.MustDecimalFromString(p.LogNormal.RiskFactorOverride.Short), + Long: num.MustDecimalFromString(p.LogNormal.RiskFactorOverride.Long), + } + } return &NewMarketConfigurationLogNormal{ LogNormal: &LogNormalRiskModel{ RiskAversionParameter: num.DecimalFromFloat(p.LogNormal.RiskAversionParameter), Tau: num.DecimalFromFloat(p.LogNormal.Tau), Params: LogNormalParamsFromProto(p.LogNormal.Params), + RiskFactorOverride: override, }, } } @@ -904,6 +917,10 @@ func InstrumentConfigurationFromProto( if err != nil { return nil, fmt.Errorf("failed to parse trading termination data source spec: %w", err) } + fCap, err := FutureCapFromProto(pr.Future.Cap) + if err != nil { + return nil, err + } r.Product = &InstrumentConfigurationFuture{ Future: &FutureProduct{ SettlementAsset: pr.Future.SettlementAsset, @@ -911,6 +928,7 @@ func InstrumentConfigurationFromProto( DataSourceSpecForSettlementData: *datasource.NewDefinitionWith(settl), DataSourceSpecForTradingTermination: *datasource.NewDefinitionWith(term), DataSourceSpecBinding: datasource.SpecBindingForFutureFromProto(pr.Future.DataSourceSpecBinding), + Cap: fCap, }, } case *vegapb.InstrumentConfiguration_Perpetual: @@ -996,42 +1014,99 @@ func InstrumentConfigurationFromProto( return r, nil } +type FutureCap struct { + MaxPrice *num.Uint + Binary bool + FullyCollateralised bool +} + +func FutureCapFromProto(fc *vegapb.FutureCap) (*FutureCap, error) { + if fc == nil { + return nil, nil + } + mp, err := num.UintFromString(fc.MaxPrice, 10) + if err { + return nil, fmt.Errorf("invalid max price value") + } + return &FutureCap{ + MaxPrice: mp, + Binary: ptr.UnBox(fc.BinarySettlement), + FullyCollateralised: ptr.UnBox(fc.FullyCollateralised), + }, nil +} + +func (c FutureCap) IntoProto() *vegapb.FutureCap { + return &vegapb.FutureCap{ + MaxPrice: c.MaxPrice.String(), + BinarySettlement: ptr.From(c.Binary), + FullyCollateralised: ptr.From(c.FullyCollateralised), + } +} + +func (c FutureCap) DeepClone() *FutureCap { + return &FutureCap{ + MaxPrice: c.MaxPrice.Clone(), + Binary: c.Binary, + FullyCollateralised: c.FullyCollateralised, + } +} + +func (c FutureCap) String() string { + return fmt.Sprintf("max price(%s) binary(%t) fully collateralised(%t)", c.MaxPrice.String(), c.Binary, c.FullyCollateralised) +} + type FutureProduct struct { SettlementAsset string QuoteName string DataSourceSpecForSettlementData dsdefinition.Definition DataSourceSpecForTradingTermination dsdefinition.Definition DataSourceSpecBinding *datasource.SpecBindingForFuture + Cap *FutureCap } func (f FutureProduct) IntoProto() *vegapb.FutureProduct { + var fCap *vegapb.FutureCap + if f.Cap != nil { + fCap = f.Cap.IntoProto() + } return &vegapb.FutureProduct{ SettlementAsset: f.SettlementAsset, QuoteName: f.QuoteName, DataSourceSpecForSettlementData: f.DataSourceSpecForSettlementData.IntoProto(), DataSourceSpecForTradingTermination: f.DataSourceSpecForTradingTermination.IntoProto(), DataSourceSpecBinding: f.DataSourceSpecBinding.IntoProto(), + Cap: fCap, } } func (f FutureProduct) DeepClone() *FutureProduct { + var fCap *FutureCap + if f.Cap != nil { + fCap = f.Cap.DeepClone() + } return &FutureProduct{ SettlementAsset: f.SettlementAsset, QuoteName: f.QuoteName, DataSourceSpecForSettlementData: *f.DataSourceSpecForSettlementData.DeepClone().(*dsdefinition.Definition), DataSourceSpecForTradingTermination: *f.DataSourceSpecForTradingTermination.DeepClone().(*dsdefinition.Definition), DataSourceSpecBinding: f.DataSourceSpecBinding.DeepClone(), + Cap: fCap, } } func (f FutureProduct) String() string { + fCap := "no" + if f.Cap != nil { + fCap = f.Cap.String() + } return fmt.Sprintf( - "quote(%s) settlementAsset(%s) settlementData(%s) tradingTermination(%s) binding(%s)", + "quote(%s) settlementAsset(%s) settlementData(%s) tradingTermination(%s) binding(%s) capped(%s)", f.QuoteName, f.SettlementAsset, stringer.ObjToString(f.DataSourceSpecForSettlementData), stringer.ObjToString(f.DataSourceSpecForTradingTermination), stringer.PtrToString(f.DataSourceSpecBinding), + fCap, ) } diff --git a/core/types/governance_new_spot_market.go b/core/types/governance_new_spot_market.go index d92d4e97d27..25f92ffae12 100644 --- a/core/types/governance_new_spot_market.go +++ b/core/types/governance_new_spot_market.go @@ -120,6 +120,7 @@ type NewSpotMarketConfiguration struct { SLAParams *LiquiditySLAParams LiquidityFeeSettings *LiquidityFeeSettings TickSize *num.Uint + EnableTxReordering bool // New market risk model parameters // @@ -154,15 +155,16 @@ func (n NewSpotMarketConfiguration) IntoProto() *vegapb.NewSpotMarketConfigurati } r := &vegapb.NewSpotMarketConfiguration{ - Instrument: instrument, - PriceDecimalPlaces: n.PriceDecimalPlaces, - SizeDecimalPlaces: n.SizeDecimalPlaces, - Metadata: md, - PriceMonitoringParameters: priceMonitoring, - TargetStakeParameters: targetStakeParameters, - SlaParams: n.SLAParams.IntoProto(), - LiquidityFeeSettings: n.LiquidityFeeSettings.IntoProto(), - TickSize: n.TickSize.String(), + Instrument: instrument, + PriceDecimalPlaces: n.PriceDecimalPlaces, + SizeDecimalPlaces: n.SizeDecimalPlaces, + Metadata: md, + PriceMonitoringParameters: priceMonitoring, + TargetStakeParameters: targetStakeParameters, + SlaParams: n.SLAParams.IntoProto(), + LiquidityFeeSettings: n.LiquidityFeeSettings.IntoProto(), + TickSize: n.TickSize.String(), + EnableTransactionReordering: n.EnableTxReordering, } switch rp := riskParams.(type) { case *vegapb.NewSpotMarketConfiguration_Simple: @@ -180,6 +182,7 @@ func (n NewSpotMarketConfiguration) DeepClone() *NewSpotMarketConfiguration { Metadata: make([]string, len(n.Metadata)), SLAParams: n.SLAParams.DeepClone(), TickSize: n.TickSize.Clone(), + EnableTxReordering: n.EnableTxReordering, } cpy.Metadata = append(cpy.Metadata, n.Metadata...) if n.Instrument != nil { @@ -202,7 +205,7 @@ func (n NewSpotMarketConfiguration) DeepClone() *NewSpotMarketConfiguration { func (n NewSpotMarketConfiguration) String() string { return fmt.Sprintf( - "decimalPlaces(%v) positionDecimalPlaces(%v) metadata(%v) instrument(%s) priceMonitoring(%s) targetStakeParameters(%s) risk(%s) slaParams(%s) tickSize (%s)", + "decimalPlaces(%v) positionDecimalPlaces(%v) metadata(%v) instrument(%s) priceMonitoring(%s) targetStakeParameters(%s) risk(%s) slaParams(%s) tickSize (%s) enableTxReordering(%v)", n.Metadata, n.PriceDecimalPlaces, n.SizeDecimalPlaces, @@ -212,6 +215,7 @@ func (n NewSpotMarketConfiguration) String() string { stringer.ObjToString(n.RiskParameters), stringer.PtrToString(n.SLAParams), num.UintToString(n.TickSize), + n.EnableTxReordering, ) } @@ -256,6 +260,7 @@ func NewSpotMarketConfigurationFromProto(p *vegapb.NewSpotMarketConfiguration) ( SLAParams: slaParams, LiquidityFeeSettings: liquidityFeeSettings, TickSize: tickSize, + EnableTxReordering: p.EnableTransactionReordering, } if p.RiskParameters != nil { switch rp := p.RiskParameters.(type) { diff --git a/core/types/governance_update_market.go b/core/types/governance_update_market.go index ecb13a7f146..ce35f5e14ae 100644 --- a/core/types/governance_update_market.go +++ b/core/types/governance_update_market.go @@ -138,11 +138,12 @@ type UpdateMarketConfiguration struct { LiquidationStrategy *LiquidationStrategy MarkPriceConfiguration *CompositePriceConfiguration TickSize *num.Uint + EnableTxReordering bool } func (n UpdateMarketConfiguration) String() string { return fmt.Sprintf( - "instrument(%s) metadata(%v) priceMonitoring(%s) liquidityMonitoring(%s) risk(%s) linearSlippageFactor(%s) quadraticSlippageFactor(%s), markPriceConfiguration(%s), tickSize(%s)", + "instrument(%s) metadata(%v) priceMonitoring(%s) liquidityMonitoring(%s) risk(%s) linearSlippageFactor(%s) quadraticSlippageFactor(%s), markPriceConfiguration(%s), tickSize(%s), enableTxReordering(%v)", stringer.PtrToString(n.Instrument), MetadataList(n.Metadata).String(), stringer.PtrToString(n.PriceMonitoringParameters), @@ -152,6 +153,7 @@ func (n UpdateMarketConfiguration) String() string { n.QuadraticSlippageFactor.String(), stringer.PtrToString(n.MarkPriceConfiguration), num.UintToString(n.TickSize), + n.EnableTxReordering, ) } @@ -161,6 +163,7 @@ func (n UpdateMarketConfiguration) DeepClone() *UpdateMarketConfiguration { LinearSlippageFactor: n.LinearSlippageFactor.Copy(), QuadraticSlippageFactor: n.QuadraticSlippageFactor.Copy(), TickSize: n.TickSize.Clone(), + EnableTxReordering: n.EnableTxReordering, } cpy.Metadata = append(cpy.Metadata, n.Metadata...) if n.Instrument != nil { @@ -232,6 +235,7 @@ func (n UpdateMarketConfiguration) IntoProto() *vegapb.UpdateMarketConfiguration LiquidationStrategy: liqStrat, MarkPriceConfiguration: n.MarkPriceConfiguration.IntoProto(), TickSize: n.TickSize.String(), + EnableTransactionReordering: n.EnableTxReordering, } switch rp := riskParams.(type) { case *vegapb.UpdateMarketConfiguration_Simple: @@ -332,6 +336,7 @@ func UpdateMarketConfigurationFromProto(p *vegapb.UpdateMarketConfiguration) (*U LiquidationStrategy: liqStrat, MarkPriceConfiguration: CompositePriceConfigurationFromProto(p.MarkPriceConfiguration), TickSize: tickSize, + EnableTxReordering: p.EnableTransactionReordering, } if p.RiskParameters != nil { switch rp := p.RiskParameters.(type) { @@ -738,11 +743,20 @@ func (n UpdateMarketConfigurationLogNormal) IntoProto() *vegapb.UpdateMarketConf } func UpdateMarketConfigurationLogNormalFromProto(p *vegapb.UpdateMarketConfiguration_LogNormal) *UpdateMarketConfigurationLogNormal { + // ignore validation as it's been validated down the line + var override *RiskFactorOverride + if p.LogNormal.RiskFactorOverride != nil { + override = &RiskFactorOverride{ + Short: num.MustDecimalFromString(p.LogNormal.RiskFactorOverride.Short), + Long: num.MustDecimalFromString(p.LogNormal.RiskFactorOverride.Long), + } + } return &UpdateMarketConfigurationLogNormal{ LogNormal: &LogNormalRiskModel{ RiskAversionParameter: num.DecimalFromFloat(p.LogNormal.RiskAversionParameter), Tau: num.DecimalFromFloat(p.LogNormal.Tau), Params: LogNormalParamsFromProto(p.LogNormal.Params), + RiskFactorOverride: override, }, } } diff --git a/core/types/governance_update_spot_market.go b/core/types/governance_update_spot_market.go index 40416dd2395..0571d7ba31e 100644 --- a/core/types/governance_update_spot_market.go +++ b/core/types/governance_update_spot_market.go @@ -130,17 +130,19 @@ type UpdateSpotMarketConfiguration struct { TickSize *num.Uint Instrument *InstrumentConfiguration LiquidityFeeSettings *LiquidityFeeSettings + EnableTxReordering bool } func (n UpdateSpotMarketConfiguration) String() string { return fmt.Sprintf( - "metadata(%v) priceMonitoring(%s) targetStakeParameters(%s) risk(%s) slaParams(%s) tickSize(%s)", + "metadata(%v) priceMonitoring(%s) targetStakeParameters(%s) risk(%s) slaParams(%s) tickSize(%s) enableTxReordering(%v)", MetadataList(n.Metadata).String(), stringer.PtrToString(n.PriceMonitoringParameters), stringer.PtrToString(n.TargetStakeParameters), stringer.ObjToString(n.RiskParameters), stringer.PtrToString(n.SLAParams), num.UintToString(n.TickSize), + n.EnableTxReordering, ) } @@ -153,6 +155,7 @@ func (n UpdateSpotMarketConfiguration) DeepClone() *UpdateSpotMarketConfiguratio Code: n.Instrument.Code, Name: n.Instrument.Name, }, + EnableTxReordering: n.EnableTxReordering, } cpy.Metadata = append(cpy.Metadata, n.Metadata...) if n.PriceMonitoringParameters != nil { @@ -197,7 +200,8 @@ func (n UpdateSpotMarketConfiguration) IntoProto() *vegapb.UpdateSpotMarketConfi Code: n.Instrument.Code, Name: n.Instrument.Name, }, - LiquidityFeeSettings: liquidityFeeSettings, + LiquidityFeeSettings: liquidityFeeSettings, + EnableTransactionReordering: n.EnableTxReordering, } switch rp := riskParams.(type) { case *vegapb.UpdateSpotMarketConfiguration_Simple: @@ -235,6 +239,7 @@ func UpdateSpotMarketConfigurationFromProto(p *vegapb.UpdateSpotMarketConfigurat Name: p.Instrument.Name, Code: p.Instrument.Code, }, + EnableTxReordering: p.EnableTransactionReordering, } if p.RiskParameters != nil { switch rp := p.RiskParameters.(type) { diff --git a/core/types/market.go b/core/types/market.go index cd6f74a4677..4cf9a010f4c 100644 --- a/core/types/market.go +++ b/core/types/market.go @@ -141,6 +141,8 @@ const ( MarketTradingModeNoTrading MarketTradingMode = vegapb.Market_TRADING_MODE_NO_TRADING // Special auction mode for market suspended via governance. MarketTradingModeSuspendedViaGovernance MarketTradingMode = vegapb.Market_TRADING_MODE_SUSPENDED_VIA_GOVERNANCE + // Long block auction. + MarketTradingModelLongBlockAuction MarketTradingMode = vegapb.Market_TRADING_MODE_LONG_BLOCK_AUCTION ) type MarketState = vegapb.Market_State @@ -189,6 +191,8 @@ const ( AuctionTriggerGovernanceSuspension AuctionTrigger = vegapb.AuctionTrigger_AUCTION_TRIGGER_GOVERNANCE_SUSPENSION // AuctionTriggerUnableToDeployLPOrders legacy liquidity provision supports. AuctionTriggerUnableToDeployLPOrders AuctionTrigger = vegapb.AuctionTrigger_AUCTION_TRIGGER_UNABLE_TO_DEPLOY_LP_ORDERS + // AuctionTriggerLongBlock for market suspension due to a long block. + AuctionTriggerLongBlock AuctionTrigger = vegapb.AuctionTrigger_AUCTION_TRIGGER_LONG_BLOCK ) type InstrumentMetadata struct { @@ -430,36 +434,49 @@ type Future struct { DataSourceSpecForSettlementData *datasource.Spec DataSourceSpecForTradingTermination *datasource.Spec DataSourceSpecBinding *datasource.SpecBindingForFuture + Cap *FutureCap } func FutureFromProto(f *vegapb.Future) *Future { + fCap, _ := FutureCapFromProto(f.Cap) return &Future{ SettlementAsset: f.SettlementAsset, QuoteName: f.QuoteName, DataSourceSpecForSettlementData: datasource.SpecFromProto(f.DataSourceSpecForSettlementData), DataSourceSpecForTradingTermination: datasource.SpecFromProto(f.DataSourceSpecForTradingTermination), DataSourceSpecBinding: datasource.SpecBindingForFutureFromProto(f.DataSourceSpecBinding), + Cap: fCap, } } func (f Future) IntoProto() *vegapb.Future { + var fCap *vegapb.FutureCap + if f.Cap != nil { + fCap = f.Cap.IntoProto() + } return &vegapb.Future{ SettlementAsset: f.SettlementAsset, QuoteName: f.QuoteName, DataSourceSpecForSettlementData: f.DataSourceSpecForSettlementData.IntoProto(), DataSourceSpecForTradingTermination: f.DataSourceSpecForTradingTermination.IntoProto(), DataSourceSpecBinding: f.DataSourceSpecBinding.IntoProto(), + Cap: fCap, } } func (f Future) String() string { + fCap := "no" + if f.Cap != nil { + fCap = f.Cap.String() + } return fmt.Sprintf( - "quoteName(%s) settlementAsset(%s) dataSourceSpec(settlementData(%s) tradingTermination(%s) binding(%s))", + "quoteName(%s) settlementAsset(%s) dataSourceSpec(settlementData(%s) tradingTermination(%s) binding(%s)) capped(%s)", f.QuoteName, f.SettlementAsset, stringer.PtrToString(f.DataSourceSpecForSettlementData), stringer.PtrToString(f.DataSourceSpecForTradingTermination), stringer.PtrToString(f.DataSourceSpecBinding), + fCap, ) } @@ -632,6 +649,8 @@ func (i InstrumentSpot) iIntoProto() interface{} { return i.IntoProto() } +func (_ InstrumentSpot) Cap() *FutureCap { return nil } + func InstrumentFutureFromProto(f *vegapb.Instrument_Future) *InstrumentFuture { return &InstrumentFuture{ Future: FutureFromProto(f.Future), @@ -716,15 +735,25 @@ func (i InstrumentFuture) iIntoProto() interface{} { return i.IntoProto() } +func (i InstrumentFuture) Cap() *FutureCap { + if i.Future.Cap == nil { + return nil + } + return i.Future.Cap.DeepClone() +} + func (i InstrumentPerps) iIntoProto() interface{} { return i.IntoProto() } +func (_ InstrumentPerps) Cap() *FutureCap { return nil } + type iProto interface { iIntoProto() interface{} getAssets() ([]string, error) String() string Type() ProductType + Cap() *FutureCap } type Instrument struct { @@ -1071,6 +1100,7 @@ type Market struct { LiquidationStrategy *LiquidationStrategy MarkPriceConfiguration *CompositePriceConfiguration TickSize *num.Uint + EnableTxReordering bool } func MarketFromProto(mkt *vegapb.Market) (*Market, error) { @@ -1137,6 +1167,7 @@ func MarketFromProto(mkt *vegapb.Market) (*Market, error) { LiquidationStrategy: ls, MarkPriceConfiguration: markPriceConfiguration, TickSize: tickSize, + EnableTxReordering: mkt.EnableTransactionReordering, } if mkt.LiquiditySlaParams != nil { @@ -1209,6 +1240,7 @@ func (m Market) IntoProto() *vegapb.Market { LiquidationStrategy: lstrat, MarkPriceConfiguration: m.MarkPriceConfiguration.IntoProto(), TickSize: m.TickSize.String(), + EnableTransactionReordering: m.EnableTxReordering, } return r } @@ -1219,7 +1251,7 @@ func (m Market) GetID() string { func (m Market) String() string { return fmt.Sprintf( - "ID(%s) tradableInstrument(%s) decimalPlaces(%v) positionDecimalPlaces(%v) fees(%s) openingAuction(%s) priceMonitoringSettings(%s) liquidityMonitoringParameters(%s) tradingMode(%s) state(%s) marketTimestamps(%s) tickSize(%s)", + "ID(%s) tradableInstrument(%s) decimalPlaces(%v) positionDecimalPlaces(%v) fees(%s) openingAuction(%s) priceMonitoringSettings(%s) liquidityMonitoringParameters(%s) tradingMode(%s) state(%s) marketTimestamps(%s) tickSize(%s) enableTxReordering(%v)", m.ID, stringer.PtrToString(m.TradableInstrument), m.DecimalPlaces, @@ -1232,6 +1264,7 @@ func (m Market) String() string { m.State.String(), stringer.PtrToString(m.MarketTimestamps), num.UintToString(m.TickSize), + m.EnableTxReordering, ) } @@ -1261,6 +1294,7 @@ func (m Market) DeepClone() *Market { ParentMarketID: m.ParentMarketID, InsurancePoolFraction: m.InsurancePoolFraction, TickSize: m.TickSize.Clone(), + EnableTxReordering: m.EnableTxReordering, } if m.LiquiditySLAParams != nil { diff --git a/core/types/market_test.go b/core/types/market_test.go index 003cde293e9..551ba663c65 100644 --- a/core/types/market_test.go +++ b/core/types/market_test.go @@ -41,6 +41,7 @@ var testFilter1 = &datapb.Filter{ func TestMarketFromIntoProto(t *testing.T) { pk := dstypes.CreateSignerFromString("pubkey", dstypes.SignerTypePubKey) + fPtr := false pMarket := &vegapb.Market{ Id: "foo", @@ -100,6 +101,7 @@ func TestMarketFromIntoProto(t *testing.T) { InitialMargin: 0.05, CollateralRelease: 0.1, }, + FullyCollateralised: &fPtr, }, RiskModel: &vegapb.TradableInstrument_LogNormalRiskModel{ LogNormalRiskModel: &vegapb.LogNormalRiskModel{ @@ -174,7 +176,8 @@ func TestMarketFromIntoProto(t *testing.T) { SourceWeights: []string{"0.2", "0.3", "0.4", "0.5"}, SourceStalenessTolerance: []string{"3h0m0s", "2s", "24h0m0s", "1h25m0s"}, }, - TickSize: "1", + TickSize: "1", + EnableTransactionReordering: true, } domain, err := types.MarketFromProto(pMarket) @@ -187,6 +190,7 @@ func TestMarketFromIntoProto(t *testing.T) { func TestPerpMarketFromIntoProto(t *testing.T) { pk := dstypes.CreateSignerFromString("pubkey", dstypes.SignerTypePubKey) + fPtr := false pMarket := &vegapb.Market{ Id: "foo", @@ -259,6 +263,7 @@ func TestPerpMarketFromIntoProto(t *testing.T) { InitialMargin: 0.05, CollateralRelease: 0.1, }, + FullyCollateralised: &fPtr, }, RiskModel: &vegapb.TradableInstrument_LogNormalRiskModel{ LogNormalRiskModel: &vegapb.LogNormalRiskModel{ diff --git a/core/types/matching.go b/core/types/matching.go index 9cfe1147e02..5a2ff113c8c 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) { @@ -929,6 +930,7 @@ const ( OrderErrorIsolatedMarginCheckFailed OrderError = proto.OrderError_ORDER_ERROR_ISOLATED_MARGIN_CHECK_FAILED OrderErrorPeggedOrdersNotAllowedInIsolatedMargin OrderError = proto.OrderError_ORDER_ERROR_PEGGED_ORDERS_NOT_ALLOWED_IN_ISOLATED_MARGIN_MODE OrderErrorPriceNotInTickSize OrderError = proto.OrderError_ORDER_ERROR_PRICE_NOT_IN_TICK_SIZE + OrderErrorPriceLTEMaxPrice OrderError = proto.OrderError_ORDER_ERROR_PRICE_MUST_BE_LESS_THAN_OR_EQUAL_TO_MAX_PRICE ) var ( @@ -960,6 +962,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/network_wide_auction.go b/core/types/network_wide_auction.go new file mode 100644 index 00000000000..8be22e34e32 --- /dev/null +++ b/core/types/network_wide_auction.go @@ -0,0 +1,68 @@ +// 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 ( + "sort" + "time" + + proto "code.vegaprotocol.io/vega/protos/vega" +) + +type LongBlockAuctionDuration struct { + threshold time.Duration + duration time.Duration +} + +type LongBlockAuctionDurationTable struct { + thresholdAndDuration []*LongBlockAuctionDuration +} + +func LongBlockAuctionDurationTableFromProto(lbadTable *proto.LongBlockAuctionDurationTable) (*LongBlockAuctionDurationTable, error) { + thresholdAndDuration := []*LongBlockAuctionDuration{} + for _, lbad := range lbadTable.ThresholdAndDuration { + threshold, err := time.ParseDuration(lbad.Threshold) + if err != nil { + return nil, err + } + duration, err := time.ParseDuration(lbad.Duration) + if err != nil { + return nil, err + } + thresholdAndDuration = append(thresholdAndDuration, &LongBlockAuctionDuration{threshold: threshold, duration: duration}) + } + sort.Slice(thresholdAndDuration, func(i, j int) bool { + return thresholdAndDuration[i].threshold.Nanoseconds() < thresholdAndDuration[j].threshold.Nanoseconds() + }) + return &LongBlockAuctionDurationTable{thresholdAndDuration: thresholdAndDuration}, nil +} + +func (b *LongBlockAuctionDurationTable) GetLongBlockAuctionDurationForBlockDuration(d time.Duration) *time.Duration { + if len(b.thresholdAndDuration) == 0 { + return nil + } + if d.Nanoseconds() < b.thresholdAndDuration[0].threshold.Nanoseconds() { + return nil + } + auctionDuration := 0 * time.Second + for _, td := range b.thresholdAndDuration { + if d.Nanoseconds() < td.threshold.Nanoseconds() { + break + } + auctionDuration = td.duration + } + return &auctionDuration +} diff --git a/core/types/network_wide_auction_test.go b/core/types/network_wide_auction_test.go new file mode 100644 index 00000000000..8d28ca488f1 --- /dev/null +++ b/core/types/network_wide_auction_test.go @@ -0,0 +1,101 @@ +// 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_test + +import ( + "testing" + "time" + + "code.vegaprotocol.io/vega/core/types" + proto "code.vegaprotocol.io/vega/protos/vega" + + "github.com/stretchr/testify/require" +) + +func TestInvalidThreshold(t *testing.T) { + lbadTable := &proto.LongBlockAuctionDurationTable{ + ThresholdAndDuration: []*proto.LongBlockAuction{ + {Threshold: "-1", Duration: "2s"}, + }, + } + _, err := types.LongBlockAuctionDurationTableFromProto(lbadTable) + require.Error(t, err) + + lbadTable = &proto.LongBlockAuctionDurationTable{ + ThresholdAndDuration: []*proto.LongBlockAuction{ + {Threshold: "hjk", Duration: "2s"}, + }, + } + _, err = types.LongBlockAuctionDurationTableFromProto(lbadTable) + require.Error(t, err) + + lbadTable = &proto.LongBlockAuctionDurationTable{ + ThresholdAndDuration: []*proto.LongBlockAuction{ + {Threshold: "1s", Duration: "2s"}, + {Threshold: "banana", Duration: "2s"}, + }, + } + _, err = types.LongBlockAuctionDurationTableFromProto(lbadTable) + require.Error(t, err) +} + +func TestInvalidDuration(t *testing.T) { + lbadTable := &proto.LongBlockAuctionDurationTable{ + ThresholdAndDuration: []*proto.LongBlockAuction{ + {Threshold: "1s", Duration: "-2"}, + }, + } + _, err := types.LongBlockAuctionDurationTableFromProto(lbadTable) + require.Error(t, err) + + lbadTable = &proto.LongBlockAuctionDurationTable{ + ThresholdAndDuration: []*proto.LongBlockAuction{ + {Threshold: "1s", Duration: "hjk"}, + }, + } + _, err = types.LongBlockAuctionDurationTableFromProto(lbadTable) + require.Error(t, err) + + lbadTable = &proto.LongBlockAuctionDurationTable{ + ThresholdAndDuration: []*proto.LongBlockAuction{ + {Threshold: "1s", Duration: "2s"}, + {Threshold: "2s", Duration: "banana"}, + }, + } + _, err = types.LongBlockAuctionDurationTableFromProto(lbadTable) + require.Error(t, err) +} + +func TestFindLongBlockDuration(t *testing.T) { + lbadTable := &proto.LongBlockAuctionDurationTable{ + ThresholdAndDuration: []*proto.LongBlockAuction{ + {Threshold: "3s", Duration: "1m"}, + {Threshold: "40s", Duration: "10m"}, + {Threshold: "2m", Duration: "1h"}, + }, + } + table, err := types.LongBlockAuctionDurationTableFromProto(lbadTable) + require.NoError(t, err) + + require.Nil(t, table.GetLongBlockAuctionDurationForBlockDuration(1*time.Second)) + require.Nil(t, table.GetLongBlockAuctionDurationForBlockDuration(2*time.Second)) + require.Equal(t, int64(60), int64(table.GetLongBlockAuctionDurationForBlockDuration(3*time.Second).Seconds())) + require.Equal(t, int64(60), int64(table.GetLongBlockAuctionDurationForBlockDuration(39*time.Second).Seconds())) + require.Equal(t, int64(600), int64(table.GetLongBlockAuctionDurationForBlockDuration(40*time.Second).Seconds())) + require.Equal(t, int64(600), int64(table.GetLongBlockAuctionDurationForBlockDuration(119*time.Second).Seconds())) + require.Equal(t, int64(3600), int64(table.GetLongBlockAuctionDurationForBlockDuration(120*time.Second).Seconds())) + require.Equal(t, int64(3600), int64(table.GetLongBlockAuctionDurationForBlockDuration(100000*time.Second).Seconds())) +} diff --git a/core/types/orders.go b/core/types/orders.go index 69048238663..19144987d71 100644 --- a/core/types/orders.go +++ b/core/types/orders.go @@ -28,16 +28,20 @@ import ( ) type PriceLevel struct { - Price *num.Uint - NumberOfOrders uint64 - Volume uint64 + Price *num.Uint + NumberOfOrders uint64 + Volume uint64 + AMMVolume uint64 + AMMVolumeEstimated uint64 } func (p PriceLevel) IntoProto() *proto.PriceLevel { return &proto.PriceLevel{ - Price: num.UintToString(p.Price), - NumberOfOrders: p.NumberOfOrders, - Volume: p.Volume, + Price: num.UintToString(p.Price), + NumberOfOrders: p.NumberOfOrders, + Volume: p.Volume, + AmmVolume: p.AMMVolume, + AmmVolumeEstimated: p.AMMVolumeEstimated, } } diff --git a/core/types/party.go b/core/types/party.go index e57bf015c70..7be3acce98a 100644 --- a/core/types/party.go +++ b/core/types/party.go @@ -34,7 +34,8 @@ func (p Party) IntoProto() *vegapb.Party { } type PartyProfile struct { - PartyID PartyID - Alias string - Metadata map[string]string + PartyID PartyID + Alias string + Metadata map[string]string + DerivedKeys map[string]struct{} } diff --git a/core/types/pricemonitoring.go b/core/types/pricemonitoring.go index 561d304b30e..b7c6698e66d 100644 --- a/core/types/pricemonitoring.go +++ b/core/types/pricemonitoring.go @@ -51,6 +51,7 @@ type PriceMonitoringBounds struct { MaxValidPrice *num.Uint Trigger *PriceMonitoringTrigger ReferencePrice num.Decimal + Active bool } func (p PriceMonitoringBounds) String() string { @@ -145,6 +146,7 @@ func (p PriceMonitoringBounds) IntoProto() *proto.PriceMonitoringBounds { MaxValidPrice: num.UintToString(p.MaxValidPrice), Trigger: trigger, ReferencePrice: p.ReferencePrice.BigInt().String(), + Active: p.Active, } } @@ -165,6 +167,7 @@ func PriceMonitoringBoundsFromProto(pr *proto.PriceMonitoringBounds) (*PriceMoni MinValidPrice: minValid, MaxValidPrice: maxValid, ReferencePrice: refPrice, + Active: pr.Active, } if pr.Trigger != nil { p.Trigger = PriceMonitoringTriggerFromProto(pr.Trigger) diff --git a/core/types/risk.go b/core/types/risk.go index f8475c31868..f8430889ae3 100644 --- a/core/types/risk.go +++ b/core/types/risk.go @@ -19,10 +19,16 @@ import ( "fmt" "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" "code.vegaprotocol.io/vega/libs/stringer" proto "code.vegaprotocol.io/vega/protos/vega" ) +type RiskFactorOverride struct { + Short num.Decimal + Long num.Decimal +} + type LogNormalModelParams struct { Mu num.Decimal R num.Decimal @@ -33,6 +39,8 @@ type LogNormalRiskModel struct { RiskAversionParameter num.Decimal Tau num.Decimal Params *LogNormalModelParams + // nil if no override + RiskFactorOverride *RiskFactorOverride } func (l LogNormalModelParams) IntoProto() *proto.LogNormalModelParams { @@ -70,10 +78,18 @@ func (l LogNormalRiskModel) IntoProto() *proto.LogNormalRiskModel { if l.Params != nil { params = l.Params.IntoProto() } + var riskFactorOverride *proto.RiskFactorOverride + if l.RiskFactorOverride != nil { + riskFactorOverride = &proto.RiskFactorOverride{ + Short: l.RiskFactorOverride.Short.String(), + Long: l.RiskFactorOverride.Long.String(), + } + } return &proto.LogNormalRiskModel{ RiskAversionParameter: ra, Tau: t, Params: params, + RiskFactorOverride: riskFactorOverride, } } @@ -85,6 +101,12 @@ func (l LogNormalRiskModel) DeepClone() *LogNormalRiskModel { if l.Params != nil { cpy.Params = l.Params.DeepClone() } + if l.RiskFactorOverride != nil { + cpy.RiskFactorOverride = &RiskFactorOverride{ + Short: l.RiskFactorOverride.Short, + Long: l.RiskFactorOverride.Long, + } + } return &cpy } @@ -138,6 +160,20 @@ func (t TradableInstrumentLogNormalRiskModel) Equal(trm isTRM) bool { if !t.LogNormalRiskModel.Tau.Equal(ct.LogNormalRiskModel.Tau) || !t.LogNormalRiskModel.RiskAversionParameter.Equal(ct.LogNormalRiskModel.RiskAversionParameter) { return false } + + if t.LogNormalRiskModel.RiskFactorOverride != nil { + if ct.LogNormalRiskModel.RiskFactorOverride == nil { + return false + } + + if !t.LogNormalRiskModel.RiskFactorOverride.Short.Equal(ct.LogNormalRiskModel.RiskFactorOverride.Short) || + !t.LogNormalRiskModel.RiskFactorOverride.Long.Equal(ct.LogNormalRiskModel.RiskFactorOverride.Long) { + return false + } + } else if ct.LogNormalRiskModel.RiskFactorOverride != nil { + return false + } + // check params p, cp := t.LogNormalRiskModel.Params, ct.LogNormalRiskModel.Params // check if all params match @@ -149,7 +185,8 @@ func MarginCalculatorFromProto(p *proto.MarginCalculator) *MarginCalculator { return nil } return &MarginCalculator{ - ScalingFactors: ScalingFactorsFromProto(p.ScalingFactors), + ScalingFactors: ScalingFactorsFromProto(p.ScalingFactors), + FullyCollateralised: ptr.UnBox(p.FullyCollateralised), } } @@ -162,12 +199,14 @@ func ScalingFactorsFromProto(p *proto.ScalingFactors) *ScalingFactors { } type MarginCalculator struct { - ScalingFactors *ScalingFactors + ScalingFactors *ScalingFactors + FullyCollateralised bool } func (m MarginCalculator) DeepClone() *MarginCalculator { return &MarginCalculator{ - ScalingFactors: m.ScalingFactors.DeepClone(), + ScalingFactors: m.ScalingFactors.DeepClone(), + FullyCollateralised: m.FullyCollateralised, } } @@ -257,14 +296,16 @@ func (r RiskFactor) String() string { func (m MarginCalculator) IntoProto() *proto.MarginCalculator { return &proto.MarginCalculator{ - ScalingFactors: m.ScalingFactors.IntoProto(), + ScalingFactors: m.ScalingFactors.IntoProto(), + FullyCollateralised: ptr.From(m.FullyCollateralised), } } func (m MarginCalculator) String() string { return fmt.Sprintf( - "scalingFactors(%s)", + "scalingFactors(%s) fully collateralised(%T)", stringer.PtrToString(m.ScalingFactors), + m.FullyCollateralised, ) } @@ -326,11 +367,20 @@ func TradableInstrumentLogNormalFromProto(p *proto.TradableInstrument_LogNormalR if p == nil { return nil } + var override *RiskFactorOverride + if p.LogNormalRiskModel.RiskFactorOverride != nil { + override = &RiskFactorOverride{ + Short: num.MustDecimalFromString(p.LogNormalRiskModel.RiskFactorOverride.Short), + Long: num.MustDecimalFromString(p.LogNormalRiskModel.RiskFactorOverride.Long), + } + } + return &TradableInstrumentLogNormalRiskModel{ LogNormalRiskModel: &LogNormalRiskModel{ RiskAversionParameter: num.DecimalFromFloat(p.LogNormalRiskModel.RiskAversionParameter), Tau: num.DecimalFromFloat(p.LogNormalRiskModel.Tau), Params: LogNormalParamsFromProto(p.LogNormalRiskModel.Params), + RiskFactorOverride: override, }, } } diff --git a/core/types/snapshot.go b/core/types/snapshot.go index 19adf015705..8dfb878ebc4 100644 --- a/core/types/snapshot.go +++ b/core/types/snapshot.go @@ -102,6 +102,8 @@ const ( ActivityStreakSnapshot SnapshotNamespace = "activitystreak" VolumeDiscountProgramSnapshot SnapshotNamespace = "volumeDiscountProgram" LiquidationSnapshot SnapshotNamespace = "liquidation" + TxCacheSnapshot SnapshotNamespace = "txCache" + EVMHeartbeatSnapshot SnapshotNamespace = "evmheartbeat" MaxChunkSize = 16 * 1000 * 1000 // technically 16 * 1024 * 1024, but you know IdealChunkSize = 10 * 1000 * 1000 // aim for 10MB diff --git a/core/types/snapshot_nodes.go b/core/types/snapshot_nodes.go index 801ba1777ac..535df034a96 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 } @@ -563,6 +565,7 @@ type AppState struct { Height uint64 Block string Time int64 + PrevBlockTime int64 ChainID string ProtocolVersion string ProtocolUpdgade bool @@ -889,6 +892,10 @@ func PayloadFromProto(p *snapshot.Payload) *Payload { ret.Data = PayloadEthOracleVerifierMisc(dt) case *snapshot.Payload_EvmMultisigTopologies: ret.Data = PayloadEVMMultisigTopologiesFromProto(dt) + case *snapshot.Payload_TxCache: + ret.Data = PayloadTxCacheFromProto(dt) + case *snapshot.Payload_EvmFwdHeartbeats: + ret.Data = PayloadEVMFwdHeartbeatsFromProto(dt) default: panic(fmt.Errorf("missing support for payload %T", dt)) } @@ -1082,6 +1089,10 @@ func (p Payload) IntoProto() *snapshot.Payload { ret.Data = dt case *snapshot.Payload_EvmMultisigTopologies: ret.Data = dt + case *snapshot.Payload_TxCache: + ret.Data = dt + case *snapshot.Payload_EvmFwdHeartbeats: + ret.Data = dt default: panic(fmt.Errorf("missing support for payload %T", dt)) } @@ -2044,6 +2055,7 @@ func LimitFromProto(l *snapshot.LimitState) *LimitState { ProposePerpsMarketEnabled: l.ProposePerpsMarketEnabled, ProposeAssetEnabledFrom: time.Time{}, ProposeMarketEnabledFrom: time.Time{}, + CanUseAMMEnabled: l.CanUseAmmEnabled, } if l.ProposeAssetEnabledFrom != -1 { @@ -2165,6 +2177,7 @@ func AppStateFromProto(as *snapshot.AppState) *AppState { return &AppState{ Height: as.Height, Block: as.Block, + PrevBlockTime: as.PrevBlockTime, Time: as.Time, ChainID: as.ChainId, ProtocolVersion: as.ProtocolVersion, @@ -2177,6 +2190,7 @@ func (a AppState) IntoProto() *snapshot.AppState { Height: a.Height, Block: a.Block, Time: a.Time, + PrevBlockTime: a.PrevBlockTime, ChainId: a.ChainID, ProtocolVersion: a.ProtocolVersion, ProtocolUpgrade: a.ProtocolUpdgade, @@ -2646,6 +2660,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 @@ -3034,6 +3049,7 @@ func ExecMarketFromProto(em *snapshot.Market) *ExecMarket { PartyMarginFactors: em.PartyMarginFactor, MarkPriceCalculator: em.MarkPriceCalculator, InternalCompositePriceCalculator: em.InternalCompositePriceCalculator, + Amm: em.Amm, MarketLiquidity: em.MarketLiquidity, } @@ -3079,6 +3095,7 @@ func (e ExecMarket) IntoProto() *snapshot.Market { MarkPriceCalculator: e.MarkPriceCalculator, InternalCompositePriceCalculator: e.InternalCompositePriceCalculator, MarketLiquidity: e.MarketLiquidity, + Amm: e.Amm, } if e.CurrentMarkPrice != nil { @@ -4279,3 +4296,63 @@ func (p *PayloadEVMMultisigTopologies) Namespace() SnapshotNamespace { func (p *PayloadEVMMultisigTopologies) Key() string { return "all" } + +type PayloadTxCache struct { + TxCache *snapshot.TxCache +} + +func (p *PayloadTxCache) Key() string { + return "txCache" +} + +func (*PayloadTxCache) Namespace() SnapshotNamespace { + return TxCacheSnapshot +} + +func (p *PayloadTxCache) IntoProto() *snapshot.Payload_TxCache { + return &snapshot.Payload_TxCache{ + TxCache: p.TxCache, + } +} + +func (*PayloadTxCache) isPayload() {} + +func (p *PayloadTxCache) plToProto() interface{} { + return p.IntoProto() +} + +func PayloadTxCacheFromProto(txCachePayload *snapshot.Payload_TxCache) *PayloadTxCache { + return &PayloadTxCache{ + TxCache: txCachePayload.TxCache, + } +} + +type PayloadEVMFwdHeartbeats struct { + EVMFwdHeartbeats *snapshot.EVMFwdHeartbeats +} + +func (p *PayloadEVMFwdHeartbeats) Key() string { + return "all" +} + +func (*PayloadEVMFwdHeartbeats) Namespace() SnapshotNamespace { + return EVMHeartbeatSnapshot +} + +func (p *PayloadEVMFwdHeartbeats) IntoProto() *snapshot.Payload_EvmFwdHeartbeats { + return &snapshot.Payload_EvmFwdHeartbeats{ + EvmFwdHeartbeats: p.EVMFwdHeartbeats, + } +} + +func (*PayloadEVMFwdHeartbeats) isPayload() {} + +func (p *PayloadEVMFwdHeartbeats) plToProto() interface{} { + return p.IntoProto() +} + +func PayloadEVMFwdHeartbeatsFromProto(pl *snapshot.Payload_EvmFwdHeartbeats) *PayloadEVMFwdHeartbeats { + return &PayloadEVMFwdHeartbeats{ + EVMFwdHeartbeats: pl.EvmFwdHeartbeats, + } +} diff --git a/core/types/transfer.go b/core/types/transfer.go index 295805659e5..f312943695a 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. + TransferTypeAMMLow TransferType = proto.TransferType_TRANSFER_TYPE_AMM_LOW + TransferTypeAMMHigh TransferType = proto.TransferType_TRANSFER_TYPE_AMM_HIGH + TransferTypeAMMRelease TransferType = proto.TransferType_TRANSFER_TYPE_AMM_RELEASE ) diff --git a/core/types/witness.go b/core/types/witness.go index 46824c51a71..4c60c718c1d 100644 --- a/core/types/witness.go +++ b/core/types/witness.go @@ -34,4 +34,5 @@ const ( NodeVoteTypeSignerThresholdSet NodeVoteType = proto.NodeVote_TYPE_SIGNER_THRESHOLD_SET NodeVoteTypeGovernanceValidateAsset NodeVoteType = proto.NodeVote_TYPE_GOVERNANCE_VALIDATE_ASSET NodeVoteTypeEthereumContractCallResult NodeVoteType = proto.NodeVote_TYPE_ETHEREUM_CONTRACT_CALL_RESULT + NodeVoteTypeEthereumHeartbeat NodeVoteType = proto.NodeVote_TYPE_ETHEREUM_HEARTBEAT ) diff --git a/core/validators/erc20multisig/checkpoint.go b/core/validators/erc20multisig/checkpoint.go index be61eaf9641..064b9a8ed25 100644 --- a/core/validators/erc20multisig/checkpoint.go +++ b/core/validators/erc20multisig/checkpoint.go @@ -73,9 +73,9 @@ func (t *Topology) Load(ctx context.Context, data []byte) error { } // 0 is default value, we assume that it was then not set - if mc.LastBlockSeen != 0 { - t.ethEventSource.UpdateMultisigControlStartingBlock(mc.LastBlockSeen) - } + //if mc.LastBlockSeen != 0 { + // t.ethEventSource.UpdateMultisigControlStartingBlock(mc.LastBlockSeen) + //} return nil } @@ -99,36 +99,10 @@ func (t *Topology) getSigners() []*events.ERC20MultiSigSignerEvent { func (t *Topology) getLastBlockSeen() uint64 { var block uint64 - for _, v := range t.pendingSigners { - if block == 0 { - block = v.BlockNumber - continue - } - - if block > v.BlockNumber { - block = v.BlockNumber - } - } - - for _, v := range t.pendingThresholds { - if block == 0 { - block = v.BlockNumber - continue - } - - if block > v.BlockNumber { - block = v.BlockNumber - } - } - - // now if we have got any pending one, let's just pick the - // most recent verified - if block == 0 { - for _, evts := range t.eventsPerAddress { - for _, evt := range evts { - if evt.BlockNumber > block { - block = evt.BlockNumber - } + for _, evts := range t.eventsPerAddress { + for _, evt := range evts { + if evt.BlockNumber > block { + block = evt.BlockNumber } } } diff --git a/core/validators/erc20multisig/checkpoint_test.go b/core/validators/erc20multisig/checkpoint_test.go index 35bca92e1c6..8b60c861c18 100644 --- a/core/validators/erc20multisig/checkpoint_test.go +++ b/core/validators/erc20multisig/checkpoint_test.go @@ -63,6 +63,8 @@ func TestMultisigTopologyCheckpoint(t *testing.T) { cb(res, true) // now we can update the time + top.ocv.EXPECT().GetMultiSigAddress().AnyTimes() + top.ethEventSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() top.broker.EXPECT().Send(gomock.Any()).Times(1) top.OnTick(context.Background(), time.Unix(11, 0)) assert.Equal(t, top.GetThreshold(), uint32(666)) @@ -162,15 +164,10 @@ func TestMultisigTopologyCheckpoint(t *testing.T) { assert.True(t, len(cp) > 0) top2 := getTestTopology(t) + top2.ocv.EXPECT().GetMultiSigAddress().AnyTimes() + top2.ethEventSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() top2.broker.EXPECT().Send(gomock.Any()).Times(2) - top2.ethEventSource.EXPECT().UpdateMultisigControlStartingBlock(gomock.Any()).Do( - func(block uint64) { - // ensure we restart at the right block - assert.Equal(t, int(block), 101) - }, - ) - require.NoError(t, top2.Load(context.Background(), cp)) // no assert state is restored correctly diff --git a/core/validators/erc20multisig/evm_topologies.go b/core/validators/erc20multisig/evm_topologies.go index 3214c0b6f6c..160f835ef65 100644 --- a/core/validators/erc20multisig/evm_topologies.go +++ b/core/validators/erc20multisig/evm_topologies.go @@ -107,8 +107,9 @@ func (t *EVMTopologies) OnStateLoaded(ctx context.Context) error { topology := t.topologies[0] lastSeen := topology.getLastBlockSeen() if lastSeen != 0 { + // TODO snapshot migration stuff topology.log.Info("restoring multisig starting block", logging.Uint64("block", lastSeen), logging.String("chain-id", topology.chainID)) - topology.ethEventSource.UpdateMultisigControlStartingBlock(topology.getLastBlockSeen()) + // topology.ethEventSource.UpdateMultisigControlStartingBlock(topology.getLastBlockSeen()) } return nil } diff --git a/core/validators/erc20multisig/mocks/mocks.go b/core/validators/erc20multisig/mocks/mocks.go index e65eb2c9eb2..c44d4ff8a0e 100644 --- a/core/validators/erc20multisig/mocks/mocks.go +++ b/core/validators/erc20multisig/mocks/mocks.go @@ -115,6 +115,20 @@ func (mr *MockMultiSigOnChainVerifierMockRecorder) CheckThresholdSetEvent(arg0 i return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckThresholdSetEvent", reflect.TypeOf((*MockMultiSigOnChainVerifier)(nil).CheckThresholdSetEvent), arg0) } +// GetMultiSigAddress mocks base method. +func (m *MockMultiSigOnChainVerifier) GetMultiSigAddress() string { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetMultiSigAddress") + ret0, _ := ret[0].(string) + return ret0 +} + +// GetMultiSigAddress indicates an expected call of GetMultiSigAddress. +func (mr *MockMultiSigOnChainVerifierMockRecorder) GetMultiSigAddress() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMultiSigAddress", reflect.TypeOf((*MockMultiSigOnChainVerifier)(nil).GetMultiSigAddress)) +} + // MockEthConfirmations is a mock of EthConfirmations interface. type MockEthConfirmations struct { ctrl *gomock.Controller @@ -175,14 +189,14 @@ func (m *MockEthereumEventSource) EXPECT() *MockEthereumEventSourceMockRecorder return m.recorder } -// UpdateMultisigControlStartingBlock mocks base method. -func (m *MockEthereumEventSource) UpdateMultisigControlStartingBlock(arg0 uint64) { +// UpdateContractBlock mocks base method. +func (m *MockEthereumEventSource) UpdateContractBlock(arg0, arg1 string, arg2 uint64) { m.ctrl.T.Helper() - m.ctrl.Call(m, "UpdateMultisigControlStartingBlock", arg0) + m.ctrl.Call(m, "UpdateContractBlock", arg0, arg1, arg2) } -// UpdateMultisigControlStartingBlock indicates an expected call of UpdateMultisigControlStartingBlock. -func (mr *MockEthereumEventSourceMockRecorder) UpdateMultisigControlStartingBlock(arg0 interface{}) *gomock.Call { +// UpdateContractBlock indicates an expected call of UpdateContractBlock. +func (mr *MockEthereumEventSourceMockRecorder) UpdateContractBlock(arg0, arg1, arg2 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateMultisigControlStartingBlock", reflect.TypeOf((*MockEthereumEventSource)(nil).UpdateMultisigControlStartingBlock), arg0) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateContractBlock", reflect.TypeOf((*MockEthereumEventSource)(nil).UpdateContractBlock), arg0, arg1, arg2) } diff --git a/core/validators/erc20multisig/on_chain_verifier.go b/core/validators/erc20multisig/on_chain_verifier.go index 9b0e4e9e056..225f79365d2 100644 --- a/core/validators/erc20multisig/on_chain_verifier.go +++ b/core/validators/erc20multisig/on_chain_verifier.go @@ -72,6 +72,12 @@ func NewOnChainVerifier( } } +func (o *OnChainVerifier) GetMultiSigAddress() string { + o.mu.Lock() + defer o.mu.Unlock() + return o.multiSigAddress.Hex() +} + func (o *OnChainVerifier) UpdateMultiSigAddress(multiSigAddress ethcmn.Address, chainID string) { o.mu.Lock() defer o.mu.Unlock() diff --git a/core/validators/erc20multisig/topology.go b/core/validators/erc20multisig/topology.go index 9db3b9f4852..10908ab9085 100644 --- a/core/validators/erc20multisig/topology.go +++ b/core/validators/erc20multisig/topology.go @@ -50,10 +50,11 @@ type Witness interface { type MultiSigOnChainVerifier interface { CheckSignerEvent(*types.SignerEvent) error CheckThresholdSetEvent(*types.SignerThresholdSetEvent) error + GetMultiSigAddress() string } type EthereumEventSource interface { - UpdateMultisigControlStartingBlock(uint64) + UpdateContractBlock(string, string, uint64) } // Topology keeps track of all the validators @@ -389,6 +390,8 @@ func (t *Topology) addSignerEvent(ctx context.Context, event *types.SignerEvent) t.signers[event.Address] = struct{}{} } + t.ethEventSource.UpdateContractBlock(t.ocv.GetMultiSigAddress(), t.chainID, event.BlockNumber) + // send the event anyway so APIs can be aware of past thresholds t.broker.Send(events.NewERC20MultiSigSigner(ctx, *event)) } diff --git a/core/validators/erc20multisig/topology_snapshot_state.go b/core/validators/erc20multisig/topology_snapshot_state.go index 5c57c5fc2cf..e685a62b638 100644 --- a/core/validators/erc20multisig/topology_snapshot_state.go +++ b/core/validators/erc20multisig/topology_snapshot_state.go @@ -20,6 +20,7 @@ import ( "sort" "code.vegaprotocol.io/vega/core/types" + vgcontext "code.vegaprotocol.io/vega/libs/context" "code.vegaprotocol.io/vega/libs/proto" "code.vegaprotocol.io/vega/logging" eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" @@ -69,7 +70,7 @@ func (t *Topology) LoadState(ctx context.Context, payload *types.Payload) ([]typ } func (t *Topology) restoreVerifiedState( - _ context.Context, s *snapshotpb.ERC20MultiSigTopologyVerified, + ctx context.Context, s *snapshotpb.ERC20MultiSigTopologyVerified, ) error { t.log.Debug("restoring snapshot verified state") if s.Threshold != nil { @@ -96,6 +97,17 @@ func (t *Topology) restoreVerifiedState( t.eventsPerAddress[v.Address] = events } + if vgcontext.InProgressUpgradeFrom(ctx, "v0.76.8") { + lastSeen := t.getLastBlockSeen() + + t.log.Info("migration code updating multisig last seen", + logging.String("address", t.ocv.GetMultiSigAddress()), + logging.Uint64("last-seen", lastSeen), + logging.String("chain-id", t.chainID), + ) + t.ethEventSource.UpdateContractBlock(t.ocv.GetMultiSigAddress(), t.chainID, lastSeen) + } + return nil } @@ -266,13 +278,3 @@ func (t *Topology) serialise(k string) ([]byte, error) { return nil, types.ErrSnapshotKeyDoesNotExist } } - -func (t *Topology) OnStateLoaded(ctx context.Context) error { - // tell the internal EEF where it got up to so we do not resend events we're already seen - lastSeen := t.getLastBlockSeen() - if lastSeen != 0 { - t.log.Info("restoring multisig starting block", logging.Uint64("block", lastSeen)) - t.ethEventSource.UpdateMultisigControlStartingBlock(t.getLastBlockSeen()) - } - return nil -} diff --git a/core/validators/erc20multisig/topology_snapshot_state_test.go b/core/validators/erc20multisig/topology_snapshot_state_test.go index dc5a7331453..53f4328c6e0 100644 --- a/core/validators/erc20multisig/topology_snapshot_state_test.go +++ b/core/validators/erc20multisig/topology_snapshot_state_test.go @@ -66,6 +66,8 @@ func TestERC20TopologySnapshot(t *testing.T) { top := getTestTopology(t) defer top.ctrl.Finish() + top.ocv.EXPECT().GetMultiSigAddress().AnyTimes() + top.ethEventSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() top.OnTick(context.Background(), time.Unix(10, 0)) // first set the threshold and 1 validator @@ -196,6 +198,8 @@ func TestERC20TopologySnapshot(t *testing.T) { // now instantiate a new one, and load the stuff top2 := getTestTopology(t) defer top2.ctrl.Finish() + top2.ocv.EXPECT().GetMultiSigAddress().AnyTimes() + top2.ethEventSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() snap := &snapshotpb.Payload{} err = proto.Unmarshal(stateVerified, snap) @@ -291,6 +295,8 @@ func TestERC20TopologySnapshotAddRemoveSigner(t *testing.T) { top := getTestTopology(t) defer top.ctrl.Finish() + top.ocv.EXPECT().GetMultiSigAddress().AnyTimes() + top.ethEventSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() top.OnTick(context.Background(), time.Unix(10, 0)) var cb func(interface{}, bool) @@ -369,6 +375,8 @@ func TestERC20TopologySnapshotAddRemoveSigner(t *testing.T) { // now instantiate a new one, and load the stuff top2 := getTestTopology(t) defer top2.ctrl.Finish() + top2.ocv.EXPECT().GetMultiSigAddress().AnyTimes() + top2.ethEventSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() snap := &snapshotpb.Payload{} err = proto.Unmarshal(stateVerified, snap) diff --git a/core/validators/erc20multisig/topology_test.go b/core/validators/erc20multisig/topology_test.go index 0fd8233f510..06d8af9aa73 100644 --- a/core/validators/erc20multisig/topology_test.go +++ b/core/validators/erc20multisig/topology_test.go @@ -222,6 +222,8 @@ func testValidSignerEvents(t *testing.T) { top := getTestTopology(t) defer top.ctrl.Finish() + top.ocv.EXPECT().GetMultiSigAddress().AnyTimes() + top.ethEventSource.EXPECT().UpdateContractBlock(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() top.OnTick(context.Background(), time.Unix(10, 0)) // first assert we have no signers diff --git a/core/vegatime/service.go b/core/vegatime/service.go index 0f044d6cc1c..c87e4b1b2f8 100644 --- a/core/vegatime/service.go +++ b/core/vegatime/service.go @@ -80,6 +80,10 @@ func (s *Svc) SetTimeNow(ctx context.Context, t time.Time) { s.notify(ctx, t) } +func (s *Svc) SetPrevTime(t time.Time) { + s.previousTimestamp = t +} + // GetTimeNow returns the current time in vega. func (s *Svc) GetTimeNow() time.Time { s.mu.RLock() diff --git a/core/vesting/vesting.go b/core/vesting/engine.go similarity index 70% rename from core/vesting/vesting.go rename to core/vesting/engine.go index 333c92e9512..fd5cdd34ad3 100644 --- a/core/vesting/vesting.go +++ b/core/vesting/engine.go @@ -17,6 +17,7 @@ package vesting import ( "context" + "fmt" "sort" "time" @@ -32,15 +33,12 @@ import ( "golang.org/x/exp/slices" ) -//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/vesting Collateral,ActivityStreakVestingMultiplier,Broker,Assets +//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/core/vesting ActivityStreakVestingMultiplier,Assets,Parties type Collateral interface { - TransferVestedRewards( - ctx context.Context, transfers []*types.Transfer, - ) ([]*types.LedgerMovement, error) + TransferVestedRewards(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovement, error) GetVestingRecovery() map[string]map[string]*num.Uint - GetAllVestingQuantumBalance(party string) *num.Uint - GetVestingAccounts() []*types.Account + GetAllVestingQuantumBalance(party string) num.Decimal } type ActivityStreakVestingMultiplier interface { @@ -55,6 +53,10 @@ type Assets interface { Get(assetID string) (*assets.Asset, error) } +type Parties interface { + RelatedKeys(key string) (*types.PartyID, []string) +} + type PartyRewards struct { // the amounts per assets still being locked in the // account and not available to be released @@ -66,6 +68,11 @@ type PartyRewards struct { Vesting map[string]*num.Uint } +type MultiplierAndQuantBalance struct { + Multiplier num.Decimal + QuantumBalance num.Decimal +} + type Engine struct { log *logging.Logger @@ -81,6 +88,11 @@ type Engine struct { state map[string]*PartyRewards epochSeq uint64 upgradeHackActivated bool + + parties Parties + + // cache the reward bonus multiplier and quantum balance + rewardBonusMultiplierCache map[string]MultiplierAndQuantBalance } func New( @@ -89,16 +101,19 @@ func New( asvm ActivityStreakVestingMultiplier, broker Broker, assets Assets, + parties Parties, ) *Engine { log = log.Named(namedLogger) return &Engine{ - log: log, - c: c, - asvm: asvm, - broker: broker, - assets: assets, - state: map[string]*PartyRewards{}, + log: log, + c: c, + asvm: asvm, + broker: broker, + assets: assets, + parties: parties, + state: map[string]*PartyRewards{}, + rewardBonusMultiplierCache: map[string]MultiplierAndQuantBalance{}, } } @@ -111,9 +126,7 @@ func (e *Engine) OnCheckpointLoaded() { } } -func (e *Engine) OnBenefitTiersUpdate( - _ context.Context, v interface{}, -) error { +func (e *Engine) OnBenefitTiersUpdate(_ context.Context, v interface{}) error { tiers, err := types.VestingBenefitTiersFromUntypedProto(v) if err != nil { return err @@ -126,31 +139,29 @@ func (e *Engine) OnBenefitTiersUpdate( return nil } -func (e *Engine) OnRewardVestingBaseRateUpdate( - _ context.Context, baseRate num.Decimal, -) error { +func (e *Engine) OnRewardVestingBaseRateUpdate(_ context.Context, baseRate num.Decimal) error { e.baseRate = baseRate return nil } -func (e *Engine) OnRewardVestingMinimumTransferUpdate( - _ context.Context, minimumTransfer num.Decimal, -) error { +func (e *Engine) OnRewardVestingMinimumTransferUpdate(_ context.Context, minimumTransfer num.Decimal) error { e.minTransfer = minimumTransfer return nil } func (e *Engine) OnEpochEvent(ctx context.Context, epoch types.Epoch) { if epoch.Action == proto.EpochAction_EPOCH_ACTION_END { - e.broadcastRewardBonusMultipliers(ctx, epoch.Seq) + e.clearMultiplierCache() e.moveLocked() e.distributeVested(ctx) - e.clearup() + e.broadcastVestingStatsUpdate(ctx, epoch.Seq) e.broadcastSummary(ctx, epoch.Seq) + e.clearState() + e.clearMultiplierCache() } } -func (e *Engine) OnEpochRestore(ctx context.Context, epoch types.Epoch) { +func (e *Engine) OnEpochRestore(_ context.Context, epoch types.Epoch) { e.epochSeq = epoch.Seq } @@ -161,31 +172,64 @@ func (e *Engine) AddReward( ) { // no locktime, just increase the amount in vesting if lockedForEpochs == 0 { - e.increaseVestingBalance( - party, asset, amount, - ) + e.increaseVestingBalance(party, asset, amount) return } - e.increaseLockedForAsset( - party, asset, amount, lockedForEpochs, - ) + e.increaseLockedForAsset(party, asset, amount, lockedForEpochs) } -func (e *Engine) GetRewardBonusMultiplier(party string) (*num.Uint, num.Decimal) { - quantumBalance := e.c.GetAllVestingQuantumBalance(party) - +func (e *Engine) rewardBonusMultiplier(quantumBalance num.Decimal) num.Decimal { multiplier := num.DecimalOne() for _, b := range e.benefitTiers { - if quantumBalance.LT(b.MinimumQuantumBalance) { + if quantumBalance.LessThan(num.DecimalFromUint(b.MinimumQuantumBalance)) { break } multiplier = b.RewardMultiplier } - return quantumBalance, multiplier + return multiplier +} + +// GetSingleAndSummedRewardBonusMultipliers returns a single and summed reward bonus multipliers and quantum balances for a party. +// The single multiplier is calculated based on the quantum balance of the party. +// The summed multiplier is calculated based on the quantum balance of the party and all derived keys. +// Caches the summed multiplier and quantum balance for the party. +func (e *Engine) GetSingleAndSummedRewardBonusMultipliers(party string) (MultiplierAndQuantBalance, MultiplierAndQuantBalance) { + owner := party + + partyID, derivedKeys := e.parties.RelatedKeys(party) + if partyID != nil { + owner = partyID.String() + } + + ownerKey := fmt.Sprintf("owner-%s", owner) + + summed, foundSummed := e.rewardBonusMultiplierCache[ownerKey] + + for _, key := range append(derivedKeys, owner) { + single, foundSingle := e.rewardBonusMultiplierCache[key] + if !foundSingle { + quantumBalanceForKey := e.c.GetAllVestingQuantumBalance(key) + + single.QuantumBalance = quantumBalanceForKey + single.Multiplier = e.rewardBonusMultiplier(quantumBalanceForKey) + e.rewardBonusMultiplierCache[key] = single + } + + if !foundSummed { + summed.QuantumBalance = summed.QuantumBalance.Add(single.QuantumBalance) + } + } + + if !foundSummed { + summed.Multiplier = e.rewardBonusMultiplier(summed.QuantumBalance) + e.rewardBonusMultiplierCache[ownerKey] = summed + } + + return e.rewardBonusMultiplierCache[party], e.rewardBonusMultiplierCache[ownerKey] } func (e *Engine) getPartyRewards(party string) *PartyRewards { @@ -234,7 +278,7 @@ func (e *Engine) increaseVestingBalance( partyRewards.Vesting[asset] = vesting } -// checkLocked will move around locked funds. +// moveLocked will move around locked funds. // if the lock for epoch reach 0, the full amount // is added to the vesting amount for the asset. func (e *Engine) moveLocked() { @@ -272,9 +316,7 @@ func (e *Engine) distributeVested(ctx context.Context) { sort.Strings(assets) for _, asset := range assets { balance := rewards.Vesting[asset] - transfer := e.makeTransfer( - party, asset, balance.Clone(), - ) + transfer := e.makeTransfer(party, asset, balance.Clone()) // we are clearing the account, // we can delete it. @@ -289,7 +331,7 @@ func (e *Engine) distributeVested(ctx context.Context) { } // nothing to be done - if len(transfers) <= 0 { + if len(transfers) == 0 { return } @@ -343,28 +385,29 @@ func (e *Engine) makeTransfer( return transfer } -// just remove party entries once they are not needed anymore. -func (e *Engine) clearup() { +func (e *Engine) clearState() { for party, v := range e.state { - if len(v.Locked) <= 0 && len(v.Vesting) <= 0 { + if len(v.Locked) == 0 && len(v.Vesting) == 0 { delete(e.state, party) } } } +func (e *Engine) clearMultiplierCache() { + e.rewardBonusMultiplierCache = map[string]MultiplierAndQuantBalance{} +} + func (e *Engine) broadcastSummary(ctx context.Context, seq uint64) { evt := &eventspb.VestingBalancesSummary{ EpochSeq: seq, PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, } - parties := make([]string, 0, len(e.state)) - for k := range e.state { - parties = append(parties, k) - } - sort.Strings(parties) - for p, pRewards := range e.state { + if len(pRewards.Vesting) == 0 && len(pRewards.Locked) == 0 { + continue + } + pSummary := &eventspb.PartyVestingSummary{ Party: p, PartyLockedBalances: []*eventspb.PartyLockedBalance{}, @@ -416,7 +459,7 @@ func (e *Engine) broadcastSummary(ctx context.Context, seq uint64) { e.broker.Send(events.NewVestingBalancesSummaryEvent(ctx, evt)) } -func (e *Engine) broadcastRewardBonusMultipliers(ctx context.Context, seq uint64) { +func (e *Engine) broadcastVestingStatsUpdate(ctx context.Context, seq uint64) { evt := &eventspb.VestingStatsUpdated{ AtEpoch: seq, Stats: make([]*eventspb.PartyVestingStats, 0, len(e.state)), @@ -426,11 +469,16 @@ func (e *Engine) broadcastRewardBonusMultipliers(ctx context.Context, seq uint64 slices.Sort(parties) for _, party := range parties { - quantumBalance, multiplier := e.GetRewardBonusMultiplier(party) + single, summed := e.GetSingleAndSummedRewardBonusMultipliers(party) + // To avoid excessively large decimals. + single.QuantumBalance.Round(2) + summed.QuantumBalance.Round(2) evt.Stats = append(evt.Stats, &eventspb.PartyVestingStats{ - PartyId: party, - RewardBonusMultiplier: multiplier.String(), - QuantumBalance: quantumBalance.String(), + PartyId: party, + RewardBonusMultiplier: single.Multiplier.String(), + QuantumBalance: single.QuantumBalance.String(), + SummedRewardBonusMultiplier: summed.Multiplier.String(), + SummedQuantumBalance: summed.QuantumBalance.String(), }) } diff --git a/core/vesting/engine_test.go b/core/vesting/engine_test.go new file mode 100644 index 00000000000..b4f664b3f7f --- /dev/null +++ b/core/vesting/engine_test.go @@ -0,0 +1,1358 @@ +// 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 vesting_test + +import ( + "context" + "testing" + + "code.vegaprotocol.io/vega/core/assets" + "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + vegapb "code.vegaprotocol.io/vega/protos/vega" + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestDistributeAfterDelay(t *testing.T) { + v := getTestEngine(t) + + ctx := context.Background() + + // distribute 90% as the base rate, + // so first we distribute some, then we get under the minimum value, and all the rest + // is distributed + require.NoError(t, v.OnRewardVestingBaseRateUpdate(ctx, num.MustDecimalFromString("0.9"))) + // this is multiplied by the quantum, so it will make it 100% of the quantum + require.NoError(t, v.OnRewardVestingMinimumTransferUpdate(ctx, num.MustDecimalFromString("1"))) + + require.NoError(t, v.OnBenefitTiersUpdate(ctx, &vegapb.VestingBenefitTiers{ + Tiers: []*vegapb.VestingBenefitTier{ + { + MinimumQuantumBalance: "200", + RewardMultiplier: "1", + }, + { + MinimumQuantumBalance: "350", + RewardMultiplier: "2", + }, + { + MinimumQuantumBalance: "500", + RewardMultiplier: "3", + }, + }, + })) + + v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1")) + v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) + + party := "party1" + vegaAsset := "VEGA" + + v.parties.EXPECT().RelatedKeys(party).Return(nil, nil).AnyTimes() + + v.col.InitVestedBalance(party, vegaAsset, num.NewUint(300)) + + epochSeq := uint64(1) + + t.Run("No vesting stats and summary when no reward is being vested", func(t *testing.T) { + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Action: vegapb.EpochAction_EPOCH_ACTION_END, + Seq: epochSeq, + }) + }) + + t.Run("Add a reward locked for 3 epochs", func(t *testing.T) { + v.AddReward(party, vegaAsset, num.NewUint(100), 3) + }) + + t.Run("Wait for 3 epochs", func(t *testing.T) { + for i := 0; i < 3; i++ { + epochSeq += 1 + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "1", + QuantumBalance: "300", + SummedRewardBonusMultiplier: "1", + SummedQuantumBalance: "300", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{ + { + Party: party, + PartyLockedBalances: []*eventspb.PartyLockedBalance{ + { + Asset: vegaAsset, + UntilEpoch: 5, + Balance: "100", + }, + }, + PartyVestingBalances: []*eventspb.PartyVestingBalance{}, + }, + }, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Action: vegapb.EpochAction_EPOCH_ACTION_END, + Seq: epochSeq, + }) + } + }) + + t.Run("First reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "390", + SummedRewardBonusMultiplier: "2", + SummedQuantumBalance: "390", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{ + { + Party: party, + PartyLockedBalances: []*eventspb.PartyLockedBalance{}, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "10", + }, + }, + }, + }, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("Second reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "400", + SummedRewardBonusMultiplier: "2", + SummedQuantumBalance: "400", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("No vesting stats and summary when no reward is being vested anymore", func(t *testing.T) { + epochSeq += 1 + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) +} + +func TestDistributeWithNoDelay(t *testing.T) { + v := getTestEngine(t) + + ctx := context.Background() + + // distribute 90% as the base rate, + // so first we distribute some, then we get under the minimum value, and all the rest + // is distributed + require.NoError(t, v.OnRewardVestingBaseRateUpdate(ctx, num.MustDecimalFromString("0.9"))) + // this is multiplied by the quantum, so it will make it 100% of the quantum + require.NoError(t, v.OnRewardVestingMinimumTransferUpdate(ctx, num.MustDecimalFromString("1"))) + + require.NoError(t, v.OnBenefitTiersUpdate(ctx, &vegapb.VestingBenefitTiers{ + Tiers: []*vegapb.VestingBenefitTier{ + { + MinimumQuantumBalance: "200", + RewardMultiplier: "1", + }, + { + MinimumQuantumBalance: "350", + RewardMultiplier: "2", + }, + { + MinimumQuantumBalance: "500", + RewardMultiplier: "3", + }, + }, + })) + + // set the asvm to return always 1 + v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1")) + + // set asset to return proper quantum + v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) + + party := "party1" + vegaAsset := "VEGA" + + v.parties.EXPECT().RelatedKeys(party).Return(nil, nil).AnyTimes() + + v.col.InitVestedBalance(party, vegaAsset, num.NewUint(300)) + + epochSeq := uint64(1) + + t.Run("No vesting stats and summary when no reward is being vested", func(t *testing.T) { + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Action: vegapb.EpochAction_EPOCH_ACTION_END, + Seq: epochSeq, + }) + }) + + t.Run("Add a reward without epoch lock", func(t *testing.T) { + v.AddReward(party, vegaAsset, num.NewUint(100), 0) + }) + + t.Run("First reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "390", + SummedRewardBonusMultiplier: "2", + SummedQuantumBalance: "390", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{ + { + Party: party, + PartyLockedBalances: []*eventspb.PartyLockedBalance{}, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "10", + }, + }, + }, + }, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("Second reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "400", + SummedRewardBonusMultiplier: "2", + SummedQuantumBalance: "400", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("No vesting stats and summary when no reward is being vested anymore", func(t *testing.T) { + epochSeq += 1 + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) +} + +func TestDistributeWithStreakRate(t *testing.T) { + v := getTestEngine(t) + + ctx := context.Background() + + // distribute 90% as the base rate, + // so first we distribute some, then we get under the minimum value, and all the rest + // is distributed + require.NoError(t, v.OnRewardVestingBaseRateUpdate(ctx, num.MustDecimalFromString("0.9"))) + // this is multiplied by the quantum, so it will make it 100% of the quantum + require.NoError(t, v.OnRewardVestingMinimumTransferUpdate(ctx, num.MustDecimalFromString("1"))) + + require.NoError(t, v.OnBenefitTiersUpdate(ctx, &vegapb.VestingBenefitTiers{ + Tiers: []*vegapb.VestingBenefitTier{ + { + MinimumQuantumBalance: "200", + RewardMultiplier: "1", + }, + { + MinimumQuantumBalance: "350", + RewardMultiplier: "2", + }, + { + MinimumQuantumBalance: "500", + RewardMultiplier: "3", + }, + }, + })) + + v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1.1")) + v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) + + party := "party1" + vegaAsset := "VEGA" + + v.parties.EXPECT().RelatedKeys(party).Return(nil, nil).AnyTimes() + + v.col.InitVestedBalance(party, vegaAsset, num.NewUint(300)) + + epochSeq := uint64(1) + + t.Run("No vesting stats and summary when no reward is being vested", func(t *testing.T) { + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Action: vegapb.EpochAction_EPOCH_ACTION_END, + Seq: epochSeq, + }) + }) + + t.Run("Add a reward without epoch lock", func(t *testing.T) { + v.AddReward(party, vegaAsset, num.NewUint(100), 0) + }) + + t.Run("First reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "399", + SummedRewardBonusMultiplier: "2", + SummedQuantumBalance: "399", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{ + { + Party: party, + PartyLockedBalances: []*eventspb.PartyLockedBalance{}, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "1", + }, + }, + }, + }, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("Second reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "400", + SummedRewardBonusMultiplier: "2", + SummedQuantumBalance: "400", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("No vesting stats and summary when no reward is being vested anymore", func(t *testing.T) { + epochSeq += 1 + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) +} + +func TestDistributeMultipleAfterDelay(t *testing.T) { + v := getTestEngine(t) + + ctx := context.Background() + + // distribute 90% as the base rate, + // so first we distribute some, then we get under the minimum value, and all the rest + // is distributed + require.NoError(t, v.OnRewardVestingBaseRateUpdate(ctx, num.MustDecimalFromString("0.9"))) + // this is multiplied by the quantum, so it will make it 100% of the quantum + require.NoError(t, v.OnRewardVestingMinimumTransferUpdate(ctx, num.MustDecimalFromString("1"))) + + require.NoError(t, v.OnBenefitTiersUpdate(ctx, &vegapb.VestingBenefitTiers{ + Tiers: []*vegapb.VestingBenefitTier{ + { + MinimumQuantumBalance: "200", + RewardMultiplier: "1", + }, + { + MinimumQuantumBalance: "350", + RewardMultiplier: "2", + }, + { + MinimumQuantumBalance: "500", + RewardMultiplier: "3", + }, + }, + })) + + v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1")) + v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) + + party := "party1" + vegaAsset := "VEGA" + + v.parties.EXPECT().RelatedKeys(party).Return(nil, nil).AnyTimes() + + v.col.InitVestedBalance(party, vegaAsset, num.NewUint(300)) + + epochSeq := uint64(1) + + t.Run("No vesting stats and summary when no reward is being vested", func(t *testing.T) { + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Action: vegapb.EpochAction_EPOCH_ACTION_END, + Seq: epochSeq, + }) + }) + + t.Run("Add a reward locked for 2 epochs", func(t *testing.T) { + v.AddReward(party, vegaAsset, num.NewUint(100), 2) + }) + + t.Run("Add another reward locked for 1 epoch", func(t *testing.T) { + v.AddReward(party, vegaAsset, num.NewUint(100), 1) + }) + + t.Run("Wait for 1 epoch", func(t *testing.T) { + epochSeq += 1 + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "1", + QuantumBalance: "300", + SummedRewardBonusMultiplier: "1", + SummedQuantumBalance: "300", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{ + { + Party: party, + PartyLockedBalances: []*eventspb.PartyLockedBalance{ + { + Asset: vegaAsset, + UntilEpoch: 3, + Balance: "100", + }, + { + Asset: vegaAsset, + UntilEpoch: 4, + Balance: "100", + }, + }, + PartyVestingBalances: []*eventspb.PartyVestingBalance{}, + }, + }, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Action: vegapb.EpochAction_EPOCH_ACTION_END, + Seq: epochSeq, + }) + }) + + t.Run("First reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "390", + SummedRewardBonusMultiplier: "2", + SummedQuantumBalance: "390", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{ + { + Party: party, + PartyLockedBalances: []*eventspb.PartyLockedBalance{ + { + Asset: vegaAsset, + UntilEpoch: 4, + Balance: "100", + }, + }, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "10", + }, + }, + }, + }, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("Second reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "489", + SummedRewardBonusMultiplier: "2", + SummedQuantumBalance: "489", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{ + { + Party: party, + PartyLockedBalances: []*eventspb.PartyLockedBalance{}, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "11", + }, + }, + }, + }, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("Third reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "499", + SummedRewardBonusMultiplier: "2", + SummedQuantumBalance: "499", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{ + { + Party: party, + PartyLockedBalances: []*eventspb.PartyLockedBalance{}, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "1", + }, + }, + }, + }, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("Fourth reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: party, + RewardBonusMultiplier: "3", + QuantumBalance: "500", + SummedRewardBonusMultiplier: "3", + SummedQuantumBalance: "500", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("No vesting stats and summary when no reward is being vested anymore", func(t *testing.T) { + epochSeq += 1 + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) +} + +func TestDistributeWithRelatedKeys(t *testing.T) { + v := getTestEngine(t) + + ctx := context.Background() + + // distribute 90% as the base rate, + // so first we distribute some, then we get under the minimum value, and all the rest + // is distributed + require.NoError(t, v.OnRewardVestingBaseRateUpdate(ctx, num.MustDecimalFromString("0.9"))) + // this is multiplied by the quantum, so it will make it 100% of the quantum + require.NoError(t, v.OnRewardVestingMinimumTransferUpdate(ctx, num.MustDecimalFromString("1"))) + + require.NoError(t, v.OnBenefitTiersUpdate(ctx, &vegapb.VestingBenefitTiers{ + Tiers: []*vegapb.VestingBenefitTier{ + { + MinimumQuantumBalance: "200", + RewardMultiplier: "1", + }, + { + MinimumQuantumBalance: "350", + RewardMultiplier: "2", + }, + { + MinimumQuantumBalance: "500", + RewardMultiplier: "3", + }, + }, + })) + + // set the asvm to return always 1 + v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1")) + + // set asset to return proper quantum + v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) + + party := "party1" + partyID := types.PartyID(party) + vegaAsset := "VEGA" + derivedKeys := []string{"derived1", "derived2", "derived3"} + + v.parties.EXPECT().RelatedKeys(party).Return(&partyID, derivedKeys).AnyTimes() + + v.col.InitVestedBalance(party, vegaAsset, num.NewUint(300)) + + for _, key := range derivedKeys { + v.col.InitVestedBalance(key, vegaAsset, num.NewUint(100)) + v.parties.EXPECT().RelatedKeys(key).Return(&partyID, derivedKeys).AnyTimes() + } + + epochSeq := uint64(1) + + t.Run("No vesting stats and summary when no reward is being vested", func(t *testing.T) { + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Action: vegapb.EpochAction_EPOCH_ACTION_END, + Seq: epochSeq, + }) + }) + + t.Run("Add a reward without epoch lock", func(t *testing.T) { + v.AddReward(party, vegaAsset, num.NewUint(100), 0) + + for _, key := range derivedKeys { + v.AddReward(key, vegaAsset, num.NewUint(50), 0) + } + }) + + t.Run("First reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: derivedKeys[0], + RewardBonusMultiplier: "1", + QuantumBalance: "145", + SummedRewardBonusMultiplier: "3", + SummedQuantumBalance: "825", + }, + { + PartyId: derivedKeys[1], + RewardBonusMultiplier: "1", + QuantumBalance: "145", + SummedRewardBonusMultiplier: "3", + SummedQuantumBalance: "825", + }, + { + PartyId: derivedKeys[2], + RewardBonusMultiplier: "1", + QuantumBalance: "145", + SummedRewardBonusMultiplier: "3", + SummedQuantumBalance: "825", + }, + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "390", + SummedRewardBonusMultiplier: "3", + SummedQuantumBalance: "825", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{ + { + Party: derivedKeys[0], + PartyLockedBalances: []*eventspb.PartyLockedBalance{}, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "5", + }, + }, + }, + { + Party: derivedKeys[1], + PartyLockedBalances: []*eventspb.PartyLockedBalance{}, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "5", + }, + }, + }, + { + Party: derivedKeys[2], + PartyLockedBalances: []*eventspb.PartyLockedBalance{}, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "5", + }, + }, + }, + { + Party: party, + PartyLockedBalances: []*eventspb.PartyLockedBalance{}, + PartyVestingBalances: []*eventspb.PartyVestingBalance{ + { + Asset: vegaAsset, + Balance: "10", + }, + }, + }, + }, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("Second reward payment", func(t *testing.T) { + epochSeq += 1 + + expectLedgerMovements(t, v) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{ + { + PartyId: derivedKeys[0], + RewardBonusMultiplier: "1", + QuantumBalance: "150", + SummedRewardBonusMultiplier: "3", + SummedQuantumBalance: "850", + }, + { + PartyId: derivedKeys[1], + RewardBonusMultiplier: "1", + QuantumBalance: "150", + SummedRewardBonusMultiplier: "3", + SummedQuantumBalance: "850", + }, + { + PartyId: derivedKeys[2], + RewardBonusMultiplier: "1", + QuantumBalance: "150", + SummedRewardBonusMultiplier: "3", + SummedQuantumBalance: "850", + }, + { + PartyId: party, + RewardBonusMultiplier: "2", + QuantumBalance: "400", + SummedRewardBonusMultiplier: "3", + SummedQuantumBalance: "850", + }, + }, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) + + t.Run("No vesting stats and summary when no reward is being vested anymore", func(t *testing.T) { + epochSeq += 1 + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingStatsUpdated) + require.True(t, ok, "Event should be a VestingStatsUpdated, but is %T", evt) + assert.Equal(t, eventspb.VestingStatsUpdated{ + AtEpoch: epochSeq, + Stats: []*eventspb.PartyVestingStats{}, + }, e.Proto()) + }).Times(1) + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.VestingBalancesSummary) + require.True(t, ok, "Event should be a VestingBalancesSummary, but is %T", evt) + assert.Equal(t, eventspb.VestingBalancesSummary{ + EpochSeq: epochSeq, + PartiesVestingSummary: []*eventspb.PartyVestingSummary{}, + }, e.Proto()) + }).Times(1) + + v.OnEpochEvent(ctx, types.Epoch{ + Seq: epochSeq, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + }) + }) +} + +func TestGetRewardBonusMultiplier(t *testing.T) { + v := getTestEngine(t) + + ctx := context.Background() + + // distribute 90% as the base rate, + // so first we distribute some, then we get under the minimum value, and all the rest + // is distributed + require.NoError(t, v.OnRewardVestingBaseRateUpdate(ctx, num.MustDecimalFromString("0.9"))) + // this is multiplied by the quantum, so it will make it 100% of the quantum + require.NoError(t, v.OnRewardVestingMinimumTransferUpdate(ctx, num.MustDecimalFromString("1"))) + + require.NoError(t, v.OnBenefitTiersUpdate(ctx, &vegapb.VestingBenefitTiers{ + Tiers: []*vegapb.VestingBenefitTier{ + { + MinimumQuantumBalance: "200", + RewardMultiplier: "1", + }, + { + MinimumQuantumBalance: "500", + RewardMultiplier: "2", + }, + { + MinimumQuantumBalance: "1200", + RewardMultiplier: "3", + }, + }, + })) + + party := "party1" + partyID := types.PartyID(party) + vegaAsset := "VEGA" + derivedKeys := []string{"derived1", "derived2", "derived3", "derived4"} + + v.parties.EXPECT().RelatedKeys(party).Return(&partyID, derivedKeys).AnyTimes() + + v.col.InitVestedBalance(party, vegaAsset, num.NewUint(500)) + + for _, key := range derivedKeys { + v.col.InitVestedBalance(key, vegaAsset, num.NewUint(250)) + v.parties.EXPECT().RelatedKeys(key).Return(&partyID, derivedKeys).AnyTimes() + } + + for _, key := range append(derivedKeys, party) { + _, summed := v.GetSingleAndSummedRewardBonusMultipliers(key) + require.Equal(t, num.DecimalFromInt64(1500), summed.QuantumBalance) + require.Equal(t, num.DecimalFromInt64(3), summed.Multiplier) + } + + // check that we only called the GetVestingQuantumBalance once for each key + // later calls should be cached + require.Equal(t, 5, v.col.GetVestingQuantumBalanceCallCount()) + + for _, key := range append(derivedKeys, party) { + _, summed := v.GetSingleAndSummedRewardBonusMultipliers(key) + require.Equal(t, num.DecimalFromInt64(1500), summed.QuantumBalance) + require.Equal(t, num.DecimalFromInt64(3), summed.Multiplier) + } + + // all the calls above should be served from cache + require.Equal(t, 5, v.col.GetVestingQuantumBalanceCallCount()) + + v.broker.EXPECT().Send(gomock.Any()).AnyTimes() + + // now we simulate the end of the epoch + // it will reset cache for reward bonus multipliers + v.OnEpochEvent(ctx, types.Epoch{ + Action: vegapb.EpochAction_EPOCH_ACTION_END, + Seq: 1, + }) + + v.col.ResetVestingQuantumBalanceCallCount() + + for _, key := range append(derivedKeys, party) { + _, summed := v.GetSingleAndSummedRewardBonusMultipliers(key) + require.Equal(t, num.DecimalFromInt64(1500), summed.QuantumBalance) + require.Equal(t, num.DecimalFromInt64(3), summed.Multiplier) + } + + // now it's called 5 times again because the cache gets reset at the end of the epoch + require.Equal(t, 5, v.col.GetVestingQuantumBalanceCallCount()) + + v.OnEpochEvent(ctx, types.Epoch{ + Action: vegapb.EpochAction_EPOCH_ACTION_END, + Seq: 1, + }) + + v.col.ResetVestingQuantumBalanceCallCount() + + for _, key := range append(derivedKeys, party) { + single, summed := v.GetSingleAndSummedRewardBonusMultipliers(key) + require.Equal(t, num.DecimalFromInt64(1500), summed.QuantumBalance) + require.Equal(t, num.DecimalFromInt64(3), summed.Multiplier) + + if key == party { + require.Equal(t, num.DecimalFromInt64(500), single.QuantumBalance) + require.Equal(t, num.DecimalFromInt64(2), single.Multiplier) + } else { + require.Equal(t, num.DecimalFromInt64(250), single.QuantumBalance) + require.Equal(t, num.DecimalFromInt64(1), single.Multiplier) + } + } + + // now it's called 5 times again because the cache gets reset at the end of the epoch + require.Equal(t, 5, v.col.GetVestingQuantumBalanceCallCount()) +} + +// LedgerMovements is the result of a mock, so it doesn't really make sense to +// verify data consistency. +func expectLedgerMovements(t *testing.T, v *testEngine) { + t.Helper() + + v.broker.EXPECT().Send(gomock.Any()).Do(func(evt events.Event) { + e, ok := evt.(*events.LedgerMovements) + require.True(t, ok, "Event should be a LedgerMovements, but is %T", evt) + assert.Equal(t, eventspb.LedgerMovements{LedgerMovements: []*vegapb.LedgerMovement{}}, e.Proto()) + }).Times(1) +} diff --git a/core/vesting/helper_for_test.go b/core/vesting/helper_for_test.go new file mode 100644 index 00000000000..8572c0cc342 --- /dev/null +++ b/core/vesting/helper_for_test.go @@ -0,0 +1,233 @@ +// 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 vesting_test + +import ( + "context" + "testing" + "time" + + "code.vegaprotocol.io/vega/core/assets/common" + bmocks "code.vegaprotocol.io/vega/core/broker/mocks" + "code.vegaprotocol.io/vega/core/integration/stubs" + "code.vegaprotocol.io/vega/core/snapshot" + "code.vegaprotocol.io/vega/core/stats" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/core/vesting" + "code.vegaprotocol.io/vega/core/vesting/mocks" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/logging" + "code.vegaprotocol.io/vega/paths" + vegapb "code.vegaprotocol.io/vega/protos/vega" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" +) + +type testEngine struct { + *vesting.Engine + + ctrl *gomock.Controller + col *collateralMock + asvm *mocks.MockActivityStreakVestingMultiplier + broker *bmocks.MockBroker + assets *mocks.MockAssets + parties *mocks.MockParties +} + +func getTestEngine(t *testing.T) *testEngine { + t.Helper() + ctrl := gomock.NewController(t) + logger := logging.NewTestLogger() + col := newCollateralMock(t) + broker := bmocks.NewMockBroker(ctrl) + asvm := mocks.NewMockActivityStreakVestingMultiplier(ctrl) + assets := mocks.NewMockAssets(ctrl) + parties := mocks.NewMockParties(ctrl) + + return &testEngine{ + Engine: vesting.New( + logger, col, asvm, broker, assets, parties, + ), + ctrl: ctrl, + broker: broker, + col: col, + asvm: asvm, + assets: assets, + parties: parties, + } +} + +type testSnapshotEngine struct { + engine *vesting.SnapshotEngine + + ctrl *gomock.Controller + col *collateralMock + asvm *mocks.MockActivityStreakVestingMultiplier + broker *bmocks.MockBroker + assets *mocks.MockAssets + parties *mocks.MockParties + + currentEpoch uint64 +} + +func newEngine(t *testing.T) *testSnapshotEngine { + t.Helper() + ctrl := gomock.NewController(t) + col := newCollateralMock(t) + asvm := mocks.NewMockActivityStreakVestingMultiplier(ctrl) + broker := bmocks.NewMockBroker(ctrl) + assets := mocks.NewMockAssets(ctrl) + parties := mocks.NewMockParties(ctrl) + + return &testSnapshotEngine{ + engine: vesting.NewSnapshotEngine( + logging.NewTestLogger(), col, asvm, broker, assets, parties, + ), + ctrl: ctrl, + col: col, + asvm: asvm, + broker: broker, + assets: assets, + parties: parties, + currentEpoch: 10, + } +} + +type collateralMock struct { + vestedAccountAmount map[string]map[string]*num.Uint + vestingQuantumBalanceCallCount int +} + +func (c *collateralMock) InitVestedBalance(party, asset string, balance *num.Uint) { + c.vestedAccountAmount[party] = map[string]*num.Uint{ + asset: balance, + } +} + +func (c *collateralMock) TransferVestedRewards(_ context.Context, transfers []*types.Transfer) ([]*types.LedgerMovement, error) { + for _, transfer := range transfers { + vestedAccount, ok := c.vestedAccountAmount[transfer.Owner] + if !ok { + vestedAccount = map[string]*num.Uint{} + c.vestedAccountAmount[transfer.Owner] = map[string]*num.Uint{} + } + + amount, ok := vestedAccount[transfer.Amount.Asset] + if !ok { + amount = num.UintZero() + vestedAccount[transfer.Amount.Asset] = amount + } + + amount.AddSum(transfer.Amount.Amount) + } + return []*types.LedgerMovement{}, nil +} + +func (c *collateralMock) GetVestingRecovery() map[string]map[string]*num.Uint { + // Only used for checkpoint. + return nil +} + +// GetAllVestingQuantumBalance is a custom implementation used to ensure +// the vesting engine account for benefit tiers during computation. +// Using this implementation saves us from mocking this at every call to +// `OnEpochEvent()` with consistent results. +func (c *collateralMock) GetAllVestingQuantumBalance(party string) num.Decimal { + vestedAccount, ok := c.vestedAccountAmount[party] + if !ok { + return num.DecimalZero() + } + + balance := num.DecimalZero() + for _, n := range vestedAccount { + balance = balance.Add(num.DecimalFromUint(n)) + } + + c.vestingQuantumBalanceCallCount += 1 + + return balance +} + +func (c *collateralMock) ResetVestingQuantumBalanceCallCount() { + c.vestingQuantumBalanceCallCount = 0 +} + +func (c *collateralMock) GetVestingQuantumBalanceCallCount() int { + return c.vestingQuantumBalanceCallCount +} + +func newCollateralMock(t *testing.T) *collateralMock { + t.Helper() + + return &collateralMock{ + vestedAccountAmount: make(map[string]map[string]*num.Uint), + } +} + +type dummyAsset struct { + quantum uint64 +} + +func (d dummyAsset) Type() *types.Asset { + return &types.Asset{ + Details: &types.AssetDetails{ + Quantum: num.DecimalFromInt64(int64(d.quantum)), + }, + } +} + +func (dummyAsset) GetAssetClass() common.AssetClass { return common.ERC20 } +func (dummyAsset) IsValid() bool { return true } +func (dummyAsset) SetPendingListing() {} +func (dummyAsset) SetRejected() {} +func (dummyAsset) SetEnabled() {} +func (dummyAsset) SetValid() {} +func (dummyAsset) String() string { return "" } + +func newSnapshotEngine(t *testing.T, vegaPath paths.Paths, now time.Time, engine *vesting.SnapshotEngine) *snapshot.Engine { + t.Helper() + + log := logging.NewTestLogger() + timeService := stubs.NewTimeStub() + timeService.SetTime(now) + statsData := stats.New(log, stats.NewDefaultConfig()) + config := snapshot.DefaultConfig() + + snapshotEngine, err := snapshot.NewEngine(vegaPath, config, log, timeService, statsData.Blockchain) + require.NoError(t, err) + + snapshotEngine.AddProviders(engine) + + return snapshotEngine +} + +func nextEpoch(ctx context.Context, t *testing.T, te *testSnapshotEngine, startEpochTime time.Time) { + t.Helper() + + te.engine.OnEpochEvent(ctx, types.Epoch{ + Seq: te.currentEpoch, + Action: vegapb.EpochAction_EPOCH_ACTION_END, + EndTime: startEpochTime.Add(-1 * time.Second), + }) + + te.currentEpoch += 1 + te.engine.OnEpochEvent(ctx, types.Epoch{ + Seq: te.currentEpoch, + Action: vegapb.EpochAction_EPOCH_ACTION_START, + StartTime: startEpochTime, + }) +} diff --git a/core/vesting/mocks/mocks.go b/core/vesting/mocks/mocks.go index e455b24170f..2ff1049dd3f 100644 --- a/core/vesting/mocks/mocks.go +++ b/core/vesting/mocks/mocks.go @@ -1,101 +1,18 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: code.vegaprotocol.io/vega/core/vesting (interfaces: Collateral,ActivityStreakVestingMultiplier,Broker,Assets) +// Source: code.vegaprotocol.io/vega/core/vesting (interfaces: ActivityStreakVestingMultiplier,Assets,Parties) // Package mocks is a generated GoMock package. package mocks import ( - context "context" reflect "reflect" assets "code.vegaprotocol.io/vega/core/assets" - events "code.vegaprotocol.io/vega/core/events" 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" ) -// 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 -} - -// GetAllVestingQuantumBalance mocks base method. -func (m *MockCollateral) GetAllVestingQuantumBalance(arg0 string) *num.Uint { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetAllVestingQuantumBalance", arg0) - ret0, _ := ret[0].(*num.Uint) - return ret0 -} - -// GetAllVestingQuantumBalance indicates an expected call of GetAllVestingQuantumBalance. -func (mr *MockCollateralMockRecorder) GetAllVestingQuantumBalance(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllVestingQuantumBalance", reflect.TypeOf((*MockCollateral)(nil).GetAllVestingQuantumBalance), arg0) -} - -// GetVestingAccounts mocks base method. -func (m *MockCollateral) GetVestingAccounts() []*types.Account { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetVestingAccounts") - ret0, _ := ret[0].([]*types.Account) - return ret0 -} - -// GetVestingAccounts indicates an expected call of GetVestingAccounts. -func (mr *MockCollateralMockRecorder) GetVestingAccounts() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVestingAccounts", reflect.TypeOf((*MockCollateral)(nil).GetVestingAccounts)) -} - -// GetVestingRecovery mocks base method. -func (m *MockCollateral) GetVestingRecovery() map[string]map[string]*num.Uint { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetVestingRecovery") - ret0, _ := ret[0].(map[string]map[string]*num.Uint) - return ret0 -} - -// GetVestingRecovery indicates an expected call of GetVestingRecovery. -func (mr *MockCollateralMockRecorder) GetVestingRecovery() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVestingRecovery", reflect.TypeOf((*MockCollateral)(nil).GetVestingRecovery)) -} - -// TransferVestedRewards mocks base method. -func (m *MockCollateral) TransferVestedRewards(arg0 context.Context, arg1 []*types.Transfer) ([]*types.LedgerMovement, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "TransferVestedRewards", arg0, arg1) - ret0, _ := ret[0].([]*types.LedgerMovement) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// TransferVestedRewards indicates an expected call of TransferVestedRewards. -func (mr *MockCollateralMockRecorder) TransferVestedRewards(arg0, arg1 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TransferVestedRewards", reflect.TypeOf((*MockCollateral)(nil).TransferVestedRewards), arg0, arg1) -} - // MockActivityStreakVestingMultiplier is a mock of ActivityStreakVestingMultiplier interface. type MockActivityStreakVestingMultiplier struct { ctrl *gomock.Controller @@ -133,41 +50,6 @@ func (mr *MockActivityStreakVestingMultiplierMockRecorder) GetRewardsVestingMult return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRewardsVestingMultiplier", reflect.TypeOf((*MockActivityStreakVestingMultiplier)(nil).GetRewardsVestingMultiplier), arg0) } -// MockBroker is a mock of Broker interface. -type MockBroker struct { - ctrl *gomock.Controller - recorder *MockBrokerMockRecorder -} - -// MockBrokerMockRecorder is the mock recorder for MockBroker. -type MockBrokerMockRecorder struct { - mock *MockBroker -} - -// NewMockBroker creates a new mock instance. -func NewMockBroker(ctrl *gomock.Controller) *MockBroker { - mock := &MockBroker{ctrl: ctrl} - mock.recorder = &MockBrokerMockRecorder{mock} - return mock -} - -// EXPECT returns an object that allows the caller to indicate expected use. -func (m *MockBroker) EXPECT() *MockBrokerMockRecorder { - return m.recorder -} - -// Send mocks base method. -func (m *MockBroker) Send(arg0 events.Event) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "Send", arg0) -} - -// Send indicates an expected call of Send. -func (mr *MockBrokerMockRecorder) Send(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Send", reflect.TypeOf((*MockBroker)(nil).Send), arg0) -} - // MockAssets is a mock of Assets interface. type MockAssets struct { ctrl *gomock.Controller @@ -205,3 +87,41 @@ func (mr *MockAssetsMockRecorder) Get(arg0 interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockAssets)(nil).Get), arg0) } + +// MockParties is a mock of Parties interface. +type MockParties struct { + ctrl *gomock.Controller + recorder *MockPartiesMockRecorder +} + +// MockPartiesMockRecorder is the mock recorder for MockParties. +type MockPartiesMockRecorder struct { + mock *MockParties +} + +// NewMockParties creates a new mock instance. +func NewMockParties(ctrl *gomock.Controller) *MockParties { + mock := &MockParties{ctrl: ctrl} + mock.recorder = &MockPartiesMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockParties) EXPECT() *MockPartiesMockRecorder { + return m.recorder +} + +// RelatedKeys mocks base method. +func (m *MockParties) RelatedKeys(arg0 string) (*types.PartyID, []string) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RelatedKeys", arg0) + ret0, _ := ret[0].(*types.PartyID) + ret1, _ := ret[1].([]string) + return ret0, ret1 +} + +// RelatedKeys indicates an expected call of RelatedKeys. +func (mr *MockPartiesMockRecorder) RelatedKeys(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RelatedKeys", reflect.TypeOf((*MockParties)(nil).RelatedKeys), arg0) +} diff --git a/core/vesting/vesting_snapshot.go b/core/vesting/snapshot.go similarity index 96% rename from core/vesting/vesting_snapshot.go rename to core/vesting/snapshot.go index 0265014c90c..883e9bf66b9 100644 --- a/core/vesting/vesting_snapshot.go +++ b/core/vesting/snapshot.go @@ -39,9 +39,10 @@ func NewSnapshotEngine( asvm ActivityStreakVestingMultiplier, broker Broker, assets Assets, + parties Parties, ) *SnapshotEngine { se := &SnapshotEngine{ - Engine: New(log, c, asvm, broker, assets), + Engine: New(log, c, asvm, broker, assets, parties), } return se @@ -96,8 +97,7 @@ func (e *SnapshotEngine) loadStateFromSnapshot(_ context.Context, state *snapsho e.log.Panic("uint256 in snapshot underflow", logging.String("value", epochBalance.Balance)) } - e.increaseLockedForAsset( - entry.Party, locked.Asset, balance, epochBalance.Epoch) + e.increaseLockedForAsset(entry.Party, locked.Asset, balance, epochBalance.Epoch) } } } diff --git a/core/vesting/snapshot_test.go b/core/vesting/snapshot_test.go new file mode 100644 index 00000000000..167d618b0b1 --- /dev/null +++ b/core/vesting/snapshot_test.go @@ -0,0 +1,165 @@ +// 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 vesting_test + +import ( + "context" + "testing" + "time" + + "code.vegaprotocol.io/vega/core/assets" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/libs/num" + vgtest "code.vegaprotocol.io/vega/libs/test" + "code.vegaprotocol.io/vega/paths" + vegapb "code.vegaprotocol.io/vega/protos/vega" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSnapshotEngine(t *testing.T) { + ctx := vgtest.VegaContext("chainid", 100) + + vegaPath := paths.New(t.TempDir()) + now := time.Now() + + te1 := newEngine(t) + snapshotEngine1 := newSnapshotEngine(t, vegaPath, now, te1.engine) + closeSnapshotEngine1 := vgtest.OnlyOnce(snapshotEngine1.Close) + defer closeSnapshotEngine1() + + require.NoError(t, snapshotEngine1.Start(ctx)) + + setupMocks(t, te1) + setupNetParams(ctx, t, te1) + + te1.engine.AddReward("party1", "eth", num.NewUint(100), 4) + te1.engine.AddReward("party1", "btc", num.NewUint(150), 1) + te1.engine.AddReward("party1", "eth", num.NewUint(200), 0) + + nextEpoch(ctx, t, te1, time.Now()) + + te1.engine.AddReward("party2", "btc", num.NewUint(100), 2) + te1.engine.AddReward("party3", "btc", num.NewUint(100), 0) + + nextEpoch(ctx, t, te1, time.Now()) + + te1.engine.AddReward("party4", "eth", num.NewUint(100), 1) + te1.engine.AddReward("party5", "doge", num.NewUint(100), 0) + + // Take a snapshot. + hash1, err := snapshotEngine1.SnapshotNow(ctx) + require.NoError(t, err) + snapshottedEpoch := te1.currentEpoch + + // This is what must be replayed after snapshot restoration. + replayFn := func(te *testSnapshotEngine) { + te.engine.AddReward("party6", "doge", num.NewUint(100), 3) + + nextEpoch(ctx, t, te, time.Now()) + + te.engine.AddReward("party7", "eth", num.NewUint(100), 2) + te.engine.AddReward("party8", "vega", num.NewUint(100), 10) + + nextEpoch(ctx, t, te, time.Now()) + } + + replayFn(te1) + + state1 := map[string][]byte{} + for _, key := range te1.engine.Keys() { + state, additionalProvider, err := te1.engine.GetState(key) + require.NoError(t, err) + assert.Empty(t, additionalProvider) + state1[key] = state + } + + closeSnapshotEngine1() + + // Reload the engine using the previous snapshot. + + te2 := newEngine(t) + snapshotEngine2 := newSnapshotEngine(t, vegaPath, now, te2.engine) + defer snapshotEngine2.Close() + + setupMocks(t, te2) + setupNetParams(ctx, t, te2) + + // Ensure the engine's epoch (and test helpers) starts at the same epoch the + // first engine has been snapshotted. + te2.currentEpoch = snapshottedEpoch + te2.engine.OnEpochRestore(ctx, types.Epoch{ + Seq: snapshottedEpoch, + Action: vegapb.EpochAction_EPOCH_ACTION_START, + }) + + // This triggers the state restoration from the local snapshot. + require.NoError(t, snapshotEngine2.Start(ctx)) + + // Comparing the hash after restoration, to ensure it produces the same result. + hash2, _, _ := snapshotEngine2.Info() + require.Equal(t, hash1, hash2) + + // Replaying the same commands after snapshot has been taken with first engine. + replayFn(te2) + + state2 := map[string][]byte{} + for _, key := range te2.engine.Keys() { + state, additionalProvider, err := te2.engine.GetState(key) + require.NoError(t, err) + assert.Empty(t, additionalProvider) + state2[key] = state + } + + for key := range state1 { + assert.Equalf(t, state1[key], state2[key], "Key %q does not have the same data", key) + } +} + +func setupNetParams(ctx context.Context, t *testing.T, te *testSnapshotEngine) { + t.Helper() + + require.NoError(t, te.engine.OnBenefitTiersUpdate(ctx, &vegapb.VestingBenefitTiers{ + Tiers: []*vegapb.VestingBenefitTier{ + { + MinimumQuantumBalance: "10000", + RewardMultiplier: "1.5", + }, + { + MinimumQuantumBalance: "100000", + RewardMultiplier: "2", + }, + { + MinimumQuantumBalance: "500000", + RewardMultiplier: "2.5", + }, + }, + })) + + require.NoError(t, te.engine.OnRewardVestingBaseRateUpdate(ctx, num.MustDecimalFromString("0.9"))) + require.NoError(t, te.engine.OnRewardVestingMinimumTransferUpdate(ctx, num.MustDecimalFromString("1"))) +} + +func setupMocks(t *testing.T, te *testSnapshotEngine) { + t.Helper() + + te.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1")) + te.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) + te.broker.EXPECT().Send(gomock.Any()).AnyTimes() + te.parties.EXPECT().RelatedKeys(gomock.Any()).AnyTimes() +} diff --git a/core/vesting/vesting_snapshot_test.go b/core/vesting/vesting_snapshot_test.go deleted file mode 100644 index ae91f49a1a1..00000000000 --- a/core/vesting/vesting_snapshot_test.go +++ /dev/null @@ -1,145 +0,0 @@ -// 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 vesting_test - -import ( - "context" - "testing" - - "code.vegaprotocol.io/vega/core/assets" - "code.vegaprotocol.io/vega/core/types" - "code.vegaprotocol.io/vega/core/vesting" - "code.vegaprotocol.io/vega/core/vesting/mocks" - "code.vegaprotocol.io/vega/libs/num" - "code.vegaprotocol.io/vega/libs/proto" - "code.vegaprotocol.io/vega/logging" - vegapb "code.vegaprotocol.io/vega/protos/vega" - snapshotpb "code.vegaprotocol.io/vega/protos/vega/snapshot/v1" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/assert" -) - -type testSnapshotEngine struct { - *vesting.SnapshotEngine - - ctrl *gomock.Controller - col *mocks.MockCollateral - asvm *mocks.MockActivityStreakVestingMultiplier - broker *mocks.MockBroker - assets *mocks.MockAssets -} - -func getTestSnapshotEngine(t *testing.T) *testSnapshotEngine { - t.Helper() - ctrl := gomock.NewController(t) - col := mocks.NewMockCollateral(ctrl) - asvm := mocks.NewMockActivityStreakVestingMultiplier(ctrl) - broker := mocks.NewMockBroker(ctrl) - assets := mocks.NewMockAssets(ctrl) - - return &testSnapshotEngine{ - SnapshotEngine: vesting.NewSnapshotEngine( - logging.NewTestLogger(), col, asvm, broker, assets, - ), - ctrl: ctrl, - col: col, - asvm: asvm, - broker: broker, - assets: assets, - } -} - -func TestSnapshot(t *testing.T) { - v1 := getTestSnapshotEngine(t) - setDefaults(t, v1) - - // set couple of rewards - v1.AddReward("party1", "eth", num.NewUint(100), 4) - v1.AddReward("party1", "btc", num.NewUint(150), 1) - v1.AddReward("party1", "eth", num.NewUint(200), 0) - v1.AddReward("party2", "btc", num.NewUint(100), 2) - v1.AddReward("party3", "btc", num.NewUint(100), 0) - v1.AddReward("party4", "eth", num.NewUint(100), 1) - v1.AddReward("party5", "doge", num.NewUint(100), 0) - v1.AddReward("party5", "btc", num.NewUint(1420), 1) - v1.AddReward("party6", "doge", num.NewUint(100), 3) - v1.AddReward("party7", "eth", num.NewUint(100), 2) - v1.AddReward("party8", "vega", num.NewUint(100), 10) - - state1, _, err := v1.GetState(vesting.VestingKey) - assert.NoError(t, err) - assert.NotNil(t, state1) - - ppayload := &snapshotpb.Payload{} - err = proto.Unmarshal(state1, ppayload) - assert.NoError(t, err) - - v2 := getTestSnapshotEngine(t) - setDefaults(t, v2) - _, err = v2.LoadState(context.Background(), types.PayloadFromProto(ppayload)) - assert.NoError(t, err) - - // now assert the v2 produce the same state - state2, _, err := v2.GetState(vesting.VestingKey) - assert.NoError(t, err) - assert.NotNil(t, state2) - - assert.Equal(t, state1, state2) - - // now move a couple of epoch for good measure - epochsForward(t, v1) - epochsForward(t, v2) - - // now assert the v2 produce the same state - state1, _, err = v1.GetState(vesting.VestingKey) - assert.NoError(t, err) - assert.NotNil(t, state1) - state2, _, err = v2.GetState(vesting.VestingKey) - assert.NoError(t, err) - assert.NotNil(t, state2) - - assert.Equal(t, state1, state2) -} - -func epochsForward(t *testing.T, v *testSnapshotEngine) { - t.Helper() - - // expect at least 3 transfers and events call, 1 per epoch move - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(3).Return(nil, nil) - v.col.EXPECT().GetAllVestingQuantumBalance(gomock.Any()).AnyTimes().Return(num.UintZero()) - v.broker.EXPECT().Send(gomock.Any()).Times(9) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) -} - -func setDefaults(t *testing.T, v *testSnapshotEngine) { - t.Helper() - v.OnRewardVestingBaseRateUpdate(context.Background(), num.MustDecimalFromString("0.9")) - v.OnRewardVestingMinimumTransferUpdate(context.Background(), num.MustDecimalFromString("1")) - v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1")) - v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return( - assets.NewAsset(dummyAsset{quantum: 10}), nil, - ) -} diff --git a/core/vesting/vesting_test.go b/core/vesting/vesting_test.go deleted file mode 100644 index 8396ae1992d..00000000000 --- a/core/vesting/vesting_test.go +++ /dev/null @@ -1,468 +0,0 @@ -// 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 vesting_test - -import ( - "context" - "testing" - - "code.vegaprotocol.io/vega/core/assets" - "code.vegaprotocol.io/vega/core/assets/common" - "code.vegaprotocol.io/vega/core/types" - "code.vegaprotocol.io/vega/core/vesting" - "code.vegaprotocol.io/vega/core/vesting/mocks" - "code.vegaprotocol.io/vega/libs/num" - "code.vegaprotocol.io/vega/logging" - vegapb "code.vegaprotocol.io/vega/protos/vega" - - "github.com/golang/mock/gomock" - "github.com/stretchr/testify/assert" -) - -type testEngine struct { - *vesting.Engine - - ctrl *gomock.Controller - col *mocks.MockCollateral - asvm *mocks.MockActivityStreakVestingMultiplier - broker *mocks.MockBroker - assets *mocks.MockAssets -} - -func getTestEngine(t *testing.T) *testEngine { - t.Helper() - ctrl := gomock.NewController(t) - col := mocks.NewMockCollateral(ctrl) - asvm := mocks.NewMockActivityStreakVestingMultiplier(ctrl) - broker := mocks.NewMockBroker(ctrl) - assets := mocks.NewMockAssets(ctrl) - - return &testEngine{ - Engine: vesting.New( - logging.NewTestLogger(), col, asvm, broker, assets, - ), - ctrl: ctrl, - col: col, - asvm: asvm, - broker: broker, - assets: assets, - } -} - -func TestRewardMultiplier(t *testing.T) { - v := getTestEngine(t) - - // set benefits tiers - err := v.OnBenefitTiersUpdate(context.Background(), &vegapb.VestingBenefitTiers{ - Tiers: []*vegapb.VestingBenefitTier{ - { - MinimumQuantumBalance: "10000", - RewardMultiplier: "1.5", - }, - { - MinimumQuantumBalance: "100000", - RewardMultiplier: "2", - }, - { - MinimumQuantumBalance: "500000", - RewardMultiplier: "2.5", - }, - }, - }) - - assert.NoError(t, err) - - v.col.EXPECT().GetAllVestingQuantumBalance("party1").Times(1).Return(num.UintZero()) - quantumBalance, bonus := v.GetRewardBonusMultiplier("party1") - assert.Equal(t, num.DecimalOne(), bonus) - assert.Equal(t, num.UintZero(), quantumBalance) - - v.col.EXPECT().GetAllVestingQuantumBalance("party1").Times(1).Return(num.NewUint(10001)) - quantumBalance, bonus = v.GetRewardBonusMultiplier("party1") - assert.Equal(t, num.MustDecimalFromString("1.5"), bonus) - assert.Equal(t, num.MustUintFromString("10001", 10), quantumBalance) - - v.col.EXPECT().GetAllVestingQuantumBalance("party1").Times(1).Return(num.NewUint(100001)) - quantumBalance, bonus = v.GetRewardBonusMultiplier("party1") - assert.Equal(t, num.MustDecimalFromString("2"), bonus) - assert.Equal(t, num.MustUintFromString("100001", 10), quantumBalance) - - v.col.EXPECT().GetAllVestingQuantumBalance("party1").Times(1).Return(num.NewUint(500001)) - quantumBalance, bonus = v.GetRewardBonusMultiplier("party1") - assert.Equal(t, num.MustDecimalFromString("2.5"), bonus) - assert.Equal(t, num.MustUintFromString("500001", 10), quantumBalance) -} - -func TestDistributeAfterDelay(t *testing.T) { - v := getTestEngine(t) - - // distribute 90% as the base rate, - // so first we distribute some, then we get under the minimum value, and all the rest - // is distributed - v.OnRewardVestingBaseRateUpdate(context.Background(), num.MustDecimalFromString("0.9")) - // this is multiplied by the quantume, so it will make it 100% of the quantum - v.OnRewardVestingMinimumTransferUpdate(context.Background(), num.MustDecimalFromString("1")) - - v.col.EXPECT().GetAllVestingQuantumBalance(gomock.Any()).AnyTimes().Return(num.UintZero()) - - // set the asvm to return always 1 - v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1")) - - // set asset to return proper quantum - v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // Add a reward to be locked for 3 epochs then - // we add a 100 of the reward. - // it will be paid in 2 times, first 90, - // then the remain 10, - // and it'll be all - v.AddReward("party1", "eth", num.NewUint(100), 3) - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // now we expect 1 call to the collateral for the transfer of 90, for the transfer of the 90 - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 90) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 90) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // now we expect 1 call to the collateral for the transfer of 10, for the transfer of the 90, which is the whole remaining thing - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 10) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 10) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // try it again and nothing happen - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) -} - -func TestDistributeWithNoDelay(t *testing.T) { - v := getTestEngine(t) - - // distribute 90% as the base rate, - // so first we distribute some, then we get under the minimum value, and all the rest - // is distributed - v.OnRewardVestingBaseRateUpdate(context.Background(), num.MustDecimalFromString("0.9")) - // this is multiplied by the quantume, so it will make it 100% of the quantum - v.OnRewardVestingMinimumTransferUpdate(context.Background(), num.MustDecimalFromString("1")) - - v.col.EXPECT().GetAllVestingQuantumBalance(gomock.Any()).AnyTimes().Return(num.UintZero()) - - // set the asvm to return always 1 - v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1")) - - // set asset to return proper quantum - v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // we add a 100 of the reward. - // it will be paid in 2 times, first 90, - // then the remain 10, - // and it'll be all - v.AddReward("party1", "eth", num.NewUint(100), 0) - - // now we expect 1 call to the collateral for the transfer of 90, for the transfer of the 90 - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 90) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 90) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // now we expect 1 call to the collateral for the transfer of 10, for the transfer of the 90, which is the whole remaining thing - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 10) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 10) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // try it again and nothing happen - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) -} - -func TestDistributeWithStreakRate(t *testing.T) { - v := getTestEngine(t) - - // distribute 90% as the base rate, - // so first we distribute some, then we get under the minimum value, and all the rest - // is distributed - v.OnRewardVestingBaseRateUpdate(context.Background(), num.MustDecimalFromString("0.9")) - // this is multiplied by the quantume, so it will make it 100% of the quantum - v.OnRewardVestingMinimumTransferUpdate(context.Background(), num.MustDecimalFromString("1")) - - v.col.EXPECT().GetAllVestingQuantumBalance(gomock.Any()).AnyTimes().Return(num.UintZero()) - - // set the asvm to return always 1 - v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1.1")) - - // set asset to return proper quantum - v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // Add a reward to be locked for 3 epochs then - // we add a 100 of the reward. - // it will be paid in 2 times, first 90, - // then the remain 10, - // and it'll be all - v.AddReward("party1", "eth", num.NewUint(100), 0) - - // now we expect 1 call to the collateral for the transfer of 99, for the transfer of the 99 - // this is 100 * 0.9 + 1.1 - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 99) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 99) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // now we expect 1 call to the collateral for the transfer of 10, for the transfer of the 90, which is the whole remaining thing - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 1) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 1) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // try it again and nothing happen - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) -} - -func TestDistributeMultipleAfterDelay(t *testing.T) { - v := getTestEngine(t) - - // distribute 90% as the base rate, - // so first we distribute some, then we get under the minimum value, and all the rest - // is distributed - v.OnRewardVestingBaseRateUpdate(context.Background(), num.MustDecimalFromString("0.9")) - // this is multiplied by the quantume, so it will make it 100% of the quantum - v.OnRewardVestingMinimumTransferUpdate(context.Background(), num.MustDecimalFromString("1")) - - v.col.EXPECT().GetAllVestingQuantumBalance(gomock.Any()).AnyTimes().Return(num.UintZero()) - - // set the asvm to return always 1 - v.asvm.EXPECT().GetRewardsVestingMultiplier(gomock.Any()).AnyTimes().Return(num.MustDecimalFromString("1")) - - // set asset to return proper quantum - v.assets.EXPECT().Get(gomock.Any()).AnyTimes().Return(assets.NewAsset(dummyAsset{quantum: 10}), nil) - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // Add a reward to be locked for 2 epochs then - // we add a 100 of the reward. - v.AddReward("party1", "eth", num.NewUint(100), 2) - // then another for 1 epoch - v.AddReward("party1", "eth", num.NewUint(100), 1) - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // now we expect 1 call to the collateral for the transfer of 90, for the transfer of the 90 - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 90) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 90) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - // this will deliver 100 more as well ready to be paid - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // now we expect another transfer of 99 which is 110*0.9 - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 99) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 99) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // now we expect another transfer of 9 which is 110*0.9 floored - // but it's actually defaulting to 10 which is the minimum acceptable transfer - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 10) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 10) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // now we expect another transfer of 1 which is all that is left - v.col.EXPECT().TransferVestedRewards(gomock.Any(), gomock.Any()).Times(1).DoAndReturn( - func(ctx context.Context, transfers []*types.Transfer) ([]*types.LedgerMovements, error) { - assert.Len(t, transfers, 1) - assert.Equal(t, int(transfers[0].Amount.Amount.Uint64()), 1) - assert.Equal(t, transfers[0].Owner, "party1") - assert.Equal(t, int(transfers[0].MinAmount.Uint64()), 1) - assert.Equal(t, transfers[0].Amount.Asset, "eth") - return nil, nil - }, - ) - // one call to the broker - v.broker.EXPECT().Send(gomock.Any()).Times(3) - - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) - - // try it again and nothing happen - v.broker.EXPECT().Send(gomock.Any()).Times(2) - v.OnEpochEvent(context.Background(), types.Epoch{ - Action: vegapb.EpochAction_EPOCH_ACTION_END, - }) -} - -type dummyAsset struct { - quantum uint64 -} - -func (d dummyAsset) Type() *types.Asset { - return &types.Asset{ - Details: &types.AssetDetails{ - Quantum: num.DecimalFromInt64(int64(d.quantum)), - }, - } -} - -func (dummyAsset) GetAssetClass() common.AssetClass { return common.ERC20 } -func (dummyAsset) IsValid() bool { return true } -func (dummyAsset) SetPendingListing() {} -func (dummyAsset) SetRejected() {} -func (dummyAsset) SetEnabled() {} -func (dummyAsset) SetValid() {} -func (dummyAsset) String() string { return "" } diff --git a/datanode/api/errors.go b/datanode/api/errors.go index 71d4dac18e0..e2bea2bc3ed 100644 --- a/datanode/api/errors.go +++ b/datanode/api/errors.go @@ -341,6 +341,17 @@ var ( ErrGetTimeWeightedNotionalPosition = errors.New("failed to get time weighted notional position") ErrDateRangeValidationFailed = newInvalidArgumentError("invalid date range") + + ErrListAMMPools = errors.New("failed to list AMM pools") + + // Amm bounds estimates. + ErrInvalidBasePrice = newInvalidArgumentError("invalid base price") + ErrInvalidUpperPrice = newInvalidArgumentError("invalid upper price") + ErrInvalidLowerPrice = newInvalidArgumentError("invalid lower price") + ErrInvalidLeverageAtLowerPrice = newInvalidArgumentError("invalid leverage at lower price") + ErrInvalidLeverageAtUpperPrice = newInvalidArgumentError("invalid leverage at upper price") + ErrInvalidCommitmentAmount = newInvalidArgumentError("invalid commitment amount") + ErrEstimateAMMBounds = errors.New("failed to estimate AMM bounds") ) // errorMap contains a mapping between errors and Vega numeric error codes. diff --git a/datanode/api/mocks/amm_service_mock.go b/datanode/api/mocks/amm_service_mock.go new file mode 100644 index 00000000000..83831361439 --- /dev/null +++ b/datanode/api/mocks/amm_service_mock.go @@ -0,0 +1,147 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: code.vegaprotocol.io/vega/datanode/api (interfaces: AMMService) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + entities "code.vegaprotocol.io/vega/datanode/entities" + gomock "github.com/golang/mock/gomock" +) + +// MockAMMService is a mock of AMMService interface. +type MockAMMService struct { + ctrl *gomock.Controller + recorder *MockAMMServiceMockRecorder +} + +// MockAMMServiceMockRecorder is the mock recorder for MockAMMService. +type MockAMMServiceMockRecorder struct { + mock *MockAMMService +} + +// NewMockAMMService creates a new mock instance. +func NewMockAMMService(ctrl *gomock.Controller) *MockAMMService { + mock := &MockAMMService{ctrl: ctrl} + mock.recorder = &MockAMMServiceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAMMService) EXPECT() *MockAMMServiceMockRecorder { + return m.recorder +} + +// GetSubKeysForParties mocks base method. +func (m *MockAMMService) GetSubKeysForParties(arg0 context.Context, arg1, arg2 []string) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSubKeysForParties", arg0, arg1, arg2) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetSubKeysForParties indicates an expected call of GetSubKeysForParties. +func (mr *MockAMMServiceMockRecorder) GetSubKeysForParties(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSubKeysForParties", reflect.TypeOf((*MockAMMService)(nil).GetSubKeysForParties), arg0, arg1, arg2) +} + +// ListAll mocks base method. +func (m *MockAMMService) ListAll(arg0 context.Context, arg1 entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListAll", arg0, arg1) + ret0, _ := ret[0].([]entities.AMMPool) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ListAll indicates an expected call of ListAll. +func (mr *MockAMMServiceMockRecorder) ListAll(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListAll", reflect.TypeOf((*MockAMMService)(nil).ListAll), arg0, arg1) +} + +// ListByMarket mocks base method. +func (m *MockAMMService) ListByMarket(arg0 context.Context, arg1 string, arg2 entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListByMarket", arg0, arg1, arg2) + ret0, _ := ret[0].([]entities.AMMPool) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ListByMarket indicates an expected call of ListByMarket. +func (mr *MockAMMServiceMockRecorder) ListByMarket(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByMarket", reflect.TypeOf((*MockAMMService)(nil).ListByMarket), arg0, arg1, arg2) +} + +// ListByParty mocks base method. +func (m *MockAMMService) ListByParty(arg0 context.Context, arg1 string, arg2 entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListByParty", arg0, arg1, arg2) + ret0, _ := ret[0].([]entities.AMMPool) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ListByParty indicates an expected call of ListByParty. +func (mr *MockAMMServiceMockRecorder) ListByParty(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByParty", reflect.TypeOf((*MockAMMService)(nil).ListByParty), arg0, arg1, arg2) +} + +// ListByPool mocks base method. +func (m *MockAMMService) ListByPool(arg0 context.Context, arg1 string, arg2 entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListByPool", arg0, arg1, arg2) + ret0, _ := ret[0].([]entities.AMMPool) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ListByPool indicates an expected call of ListByPool. +func (mr *MockAMMServiceMockRecorder) ListByPool(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByPool", reflect.TypeOf((*MockAMMService)(nil).ListByPool), arg0, arg1, arg2) +} + +// ListByStatus mocks base method. +func (m *MockAMMService) ListByStatus(arg0 context.Context, arg1 entities.AMMStatus, arg2 entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListByStatus", arg0, arg1, arg2) + ret0, _ := ret[0].([]entities.AMMPool) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ListByStatus indicates an expected call of ListByStatus. +func (mr *MockAMMServiceMockRecorder) ListByStatus(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListByStatus", reflect.TypeOf((*MockAMMService)(nil).ListByStatus), arg0, arg1, arg2) +} + +// ListBySubAccount mocks base method. +func (m *MockAMMService) ListBySubAccount(arg0 context.Context, arg1 string, arg2 entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListBySubAccount", arg0, arg1, arg2) + ret0, _ := ret[0].([]entities.AMMPool) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// ListBySubAccount indicates an expected call of ListBySubAccount. +func (mr *MockAMMServiceMockRecorder) ListBySubAccount(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListBySubAccount", reflect.TypeOf((*MockAMMService)(nil).ListBySubAccount), arg0, arg1, arg2) +} diff --git a/datanode/api/server.go b/datanode/api/server.go index ea8e9912b52..af071ef6edd 100644 --- a/datanode/api/server.go +++ b/datanode/api/server.go @@ -117,6 +117,17 @@ type AssetService interface { GetAllWithCursorPagination(ctx context.Context, pagination entities.CursorPagination) ([]entities.Asset, entities.PageInfo, error) } +//go:generate go run github.com/golang/mock/mockgen -destination mocks/amm_service_mock.go -package mocks code.vegaprotocol.io/vega/datanode/api AMMService +type AMMService interface { + GetSubKeysForParties(ctx context.Context, partyIDs []string, marketIDs []string) ([]string, error) + ListAll(ctx context.Context, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) + ListByMarket(ctx context.Context, marketID string, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) + ListByParty(ctx context.Context, partyID string, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) + ListByPool(ctx context.Context, poolID string, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) + ListByStatus(ctx context.Context, status entities.AMMStatus, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) + ListBySubAccount(ctx context.Context, ammPartyID string, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) +} + // GRPCServer represent the grpc api provided by the vega node. type GRPCServer struct { Config @@ -180,6 +191,8 @@ type GRPCServer struct { gamesService *service.Games marginModesService *service.MarginModes timeWeightedNotionalPositionService *service.TimeWeightedNotionalPosition + gameScoreService *service.GameScore + ammPoolService *service.AMMPools eventObserver *eventObserver @@ -250,6 +263,8 @@ func NewGRPCServer( gameService *service.Games, marginModesService *service.MarginModes, timeWeightedNotionalPositionService *service.TimeWeightedNotionalPosition, + gameScoreService *service.GameScore, + ammPoolService *service.AMMPools, ) *GRPCServer { // setup logger log = log.Named(namedLogger) @@ -319,6 +334,8 @@ func NewGRPCServer( gamesService: gameService, marginModesService: marginModesService, timeWeightedNotionalPositionService: timeWeightedNotionalPositionService, + gameScoreService: gameScoreService, + ammPoolService: ammPoolService, eventObserver: &eventObserver{ log: log, @@ -515,8 +532,8 @@ func (g *GRPCServer) Start(ctx context.Context, lis net.Listener) error { partyService: g.partyService, riskService: g.riskService, positionService: g.positionService, - accountService: g.accountService, - rewardService: g.rewardService, + AccountService: g.accountService, + RewardService: g.rewardService, depositService: g.depositService, withdrawalService: g.withdrawalService, oracleSpecService: g.oracleSpecService, @@ -558,6 +575,8 @@ func (g *GRPCServer) Start(ctx context.Context, lis net.Listener) error { gamesService: g.gamesService, marginModesService: g.marginModesService, twNotionalPositionService: g.timeWeightedNotionalPositionService, + gameScoreService: g.gameScoreService, + 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..a375c9016e1 100644 --- a/datanode/api/trading_data_v2.go +++ b/datanode/api/trading_data_v2.go @@ -24,6 +24,7 @@ import ( "math" "math/rand" "reflect" + "slices" "sort" "strconv" "strings" @@ -31,6 +32,7 @@ import ( "code.vegaprotocol.io/vega/core/banking" "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/execution/amm" "code.vegaprotocol.io/vega/core/netparams" "code.vegaprotocol.io/vega/core/risk" "code.vegaprotocol.io/vega/core/types" @@ -57,6 +59,7 @@ import ( "github.com/georgysavva/scany/pgxscan" "github.com/pkg/errors" "github.com/shopspring/decimal" + "golang.org/x/exp/maps" "golang.org/x/sync/errgroup" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/proto" @@ -89,8 +92,8 @@ type TradingDataServiceV2 struct { partyService *service.Party riskService *service.Risk positionService *service.Position - accountService *service.Account - rewardService *service.Reward + AccountService *service.Account + RewardService *service.Reward depositService *service.Deposit withdrawalService *service.Withdrawal oracleSpecService *service.OracleSpec @@ -131,6 +134,12 @@ type TradingDataServiceV2 struct { gamesService *service.Games marginModesService *service.MarginModes twNotionalPositionService *service.TimeWeightedNotionalPosition + gameScoreService *service.GameScore + AMMPoolService AMMService +} + +func (t *TradingDataServiceV2) SetLogger(l *logging.Logger) { + t.log = l } func (t *TradingDataServiceV2) GetPartyVestingStats( @@ -146,12 +155,27 @@ func (t *TradingDataServiceV2) GetPartyVestingStats( return nil, formatE(err) } - return &v2.GetPartyVestingStatsResponse{ + res := &v2.GetPartyVestingStatsResponse{ PartyId: stats.PartyID.String(), EpochSeq: stats.AtEpoch, RewardBonusMultiplier: stats.RewardBonusMultiplier.String(), QuantumBalance: stats.QuantumBalance.String(), - }, nil + } + + // set minimum values if the summed values are zero + if stats.SummedRewardBonusMultiplier.IsZero() { + res.SummedRewardBonusMultiplier = res.RewardBonusMultiplier + } else { + res.SummedRewardBonusMultiplier = stats.SummedRewardBonusMultiplier.String() + } + + if stats.SummedQuantumBalance.IsZero() { + res.SummedQuantumBalance = res.QuantumBalance + } else { + res.SummedQuantumBalance = stats.SummedQuantumBalance.String() + } + + return res, nil } func (t *TradingDataServiceV2) GetVestingBalancesSummary( @@ -287,6 +311,102 @@ func (t *TradingDataServiceV2) ListFundingPayments(ctx context.Context, req *v2. }, nil } +func (t *TradingDataServiceV2) ListGamePartyScores(ctx context.Context, req *v2.ListGamePartyScoresRequest) (*v2.ListGamePartyScoresResponse, error) { + defer metrics.StartAPIRequestAndTimeGRPC("ListGamePartyScore")() + pagination, err := entities.CursorPaginationFromProto(req.Pagination) + if err != nil { + return nil, formatE(ErrInvalidPagination, err) + } + + var partyIDs []entities.PartyID + var teamIDs []entities.TeamID + var gameIDs []entities.GameID + var epochFromID *uint64 + var epochToID *uint64 + if req.Filter != nil { + partyIDs = make([]entities.PartyID, 0, len(req.Filter.PartyIds)) + for _, pid := range req.Filter.PartyIds { + partyIDs = append(partyIDs, entities.PartyID(pid)) + } + teamIDs = make([]entities.TeamID, 0, len(req.Filter.TeamIds)) + for _, tid := range req.Filter.TeamIds { + teamIDs = append(teamIDs, entities.TeamID(tid)) + } + + gameIDs = make([]entities.GameID, 0, len(req.Filter.GameIds)) + for _, gid := range req.Filter.GameIds { + gameIDs = append(gameIDs, entities.GameID(gid)) + } + epochFromID = req.Filter.EpochFrom + epochToID = req.Filter.EpochTo + } + + partyScores, pageInfo, err := t.gameScoreService.ListPartyScores( + ctx, gameIDs, partyIDs, teamIDs, epochFromID, epochToID, pagination) + if err != nil { + return nil, formatE(err) + } + + edges, err := makeEdges[*v2.GamePartyScoresEdge](partyScores) + if err != nil { + return nil, formatE(err) + } + + connection := &v2.GamePartyScoresConnection{ + Edges: edges, + PageInfo: pageInfo.ToProto(), + } + + return &v2.ListGamePartyScoresResponse{ + PartyScores: connection, + }, nil +} + +func (t *TradingDataServiceV2) ListGameTeamScores(ctx context.Context, req *v2.ListGameTeamScoresRequest) (*v2.ListGameTeamScoresResponse, error) { + defer metrics.StartAPIRequestAndTimeGRPC("ListGameTeamScores")() + pagination, err := entities.CursorPaginationFromProto(req.Pagination) + if err != nil { + return nil, formatE(ErrInvalidPagination, err) + } + var teamIDs []entities.TeamID + var gameIDs []entities.GameID + var epochFromID *uint64 + var epochToID *uint64 + if req.Filter != nil { + teamIDs = make([]entities.TeamID, 0, len(req.Filter.TeamIds)) + for _, tid := range req.Filter.TeamIds { + teamIDs = append(teamIDs, entities.TeamID(tid)) + } + + gameIDs = make([]entities.GameID, 0, len(req.Filter.GameIds)) + for _, gid := range req.Filter.GameIds { + gameIDs = append(gameIDs, entities.GameID(gid)) + } + epochFromID = req.Filter.EpochFrom + epochToID = req.Filter.EpochTo + } + + teamScores, pageInfo, err := t.gameScoreService.ListTeamScores( + ctx, gameIDs, teamIDs, epochFromID, epochToID, pagination) + if err != nil { + return nil, formatE(err) + } + + edges, err := makeEdges[*v2.GameTeamScoresEdge](teamScores) + if err != nil { + return nil, formatE(err) + } + + connection := &v2.GameTeamScoresConnection{ + Edges: edges, + PageInfo: pageInfo.ToProto(), + } + + return &v2.ListGameTeamScoresResponse{ + TeamScores: connection, + }, nil +} + // ListAccounts lists accounts matching the request. func (t *TradingDataServiceV2) ListAccounts(ctx context.Context, req *v2.ListAccountsRequest) (*v2.ListAccountsResponse, error) { defer metrics.StartAPIRequestAndTimeGRPC("ListAccountsV2")() @@ -296,6 +416,8 @@ func (t *TradingDataServiceV2) ListAccounts(ctx context.Context, req *v2.ListAcc return nil, formatE(ErrInvalidPagination, err) } + var partyPerDerivedKey map[string]string + if req.Filter != nil { marketIDs := NewVegaIDSlice(req.Filter.MarketIds...) if err := marketIDs.Ensure(); err != nil { @@ -307,7 +429,22 @@ func (t *TradingDataServiceV2) ListAccounts(ctx context.Context, req *v2.ListAcc if err := partyIDs.Ensure(); err != nil { return nil, formatE(err, errors.New("one or more party id is invalid")) } + req.Filter.PartyIds = partyIDs + + if includeDerivedParties := ptr.UnBox(req.IncludeDerivedParties); includeDerivedParties { + partyPerDerivedKey = map[string]string{} + for _, pid := range req.Filter.PartyIds { + derivedKeys, err := t.AMMPoolService.GetSubKeysForParties(ctx, []string{pid}, req.Filter.MarketIds) + if err != nil { + return nil, formatE(err) + } + req.Filter.PartyIds = append(req.Filter.PartyIds, derivedKeys...) + for _, did := range derivedKeys { + partyPerDerivedKey[did] = pid + } + } + } } filter, err := entities.AccountFilterFromProto(req.Filter) @@ -315,12 +452,12 @@ func (t *TradingDataServiceV2) ListAccounts(ctx context.Context, req *v2.ListAcc return nil, formatE(ErrInvalidFilter, err) } - accountBalances, pageInfo, err := t.accountService.QueryBalances(ctx, filter, pagination) + accountBalances, pageInfo, err := t.AccountService.QueryBalances(ctx, filter, pagination) if err != nil { return nil, formatE(ErrAccountServiceListAccounts, err) } - edges, err := makeEdges[*v2.AccountEdge](accountBalances) + edges, err := makeEdges[*v2.AccountEdge](accountBalances, partyPerDerivedKey) if err != nil { return nil, formatE(err) } @@ -341,13 +478,28 @@ func (t *TradingDataServiceV2) ObserveAccounts(req *v2.ObserveAccountsRequest, s ctx, cancel := context.WithCancel(srv.Context()) defer cancel() + partyPerDerivedKey := map[string]string{} + + if includeDerivedParties := ptr.UnBox(req.IncludeDerivedParties); includeDerivedParties { + subKeys, err := t.AMMPoolService.GetSubKeysForParties(ctx, []string{req.PartyId}, []string{req.MarketId}) + if err != nil { + return formatE(err) + } + // should really only be a single key, but just in case... + for _, sk := range subKeys { + partyPerDerivedKey[sk] = req.PartyId + } + } + // First get the 'initial image' of accounts matching the request and send those - if err := t.sendAccountsSnapshot(ctx, req, srv); err != nil { + if err := t.sendAccountsSnapshot(ctx, req, srv, partyPerDerivedKey); err != nil { return formatE(ErrFailedToSendSnapshot, err) } - accountsChan, ref := t.accountService.ObserveAccountBalances( - ctx, t.config.StreamRetries, req.MarketId, req.PartyId, req.Asset, req.Type) + partyPerDerivedKey[req.PartyId] = req.PartyId + + accountsChan, ref := t.AccountService.ObserveAccountBalances( + ctx, t.config.StreamRetries, req.MarketId, req.Asset, req.Type, partyPerDerivedKey) if t.log.GetLevel() == logging.DebugLevel { t.log.Debug("Accounts subscriber - new rpc stream", logging.Uint64("ref", ref)) @@ -356,7 +508,12 @@ func (t *TradingDataServiceV2) ObserveAccounts(req *v2.ObserveAccountsRequest, s return observeBatch(ctx, t.log, "Accounts", accountsChan, ref, func(accounts []entities.AccountBalance) error { protos := make([]*v2.AccountBalance, len(accounts)) for i := 0; i < len(accounts); i++ { - protos[i] = accounts[i].ToProto() + var parentPartyID *string + if party, ok := partyPerDerivedKey[accounts[i].PartyID.String()]; ok { + parentPartyID = &party + } + + protos[i] = accounts[i].ToProtoWithParent(parentPartyID) } batches := batch(protos, snapshotPageSize) @@ -373,8 +530,14 @@ func (t *TradingDataServiceV2) ObserveAccounts(req *v2.ObserveAccountsRequest, s }) } -func (t *TradingDataServiceV2) sendAccountsSnapshot(ctx context.Context, req *v2.ObserveAccountsRequest, srv v2.TradingDataService_ObserveAccountsServer) error { - filter := entities.AccountFilter{} +func (t *TradingDataServiceV2) sendAccountsSnapshot(ctx context.Context, + req *v2.ObserveAccountsRequest, + srv v2.TradingDataService_ObserveAccountsServer, + partyPerDerivedKey map[string]string, +) error { + filter := entities.AccountFilter{ + PartyIDs: entities.NewPartyIDSlice(maps.Keys(partyPerDerivedKey)...), + } if req.Asset != "" { filter.AssetID = entities.AssetID(req.Asset) } @@ -388,7 +551,7 @@ func (t *TradingDataServiceV2) sendAccountsSnapshot(ctx context.Context, req *v2 filter.AccountTypes = append(filter.AccountTypes, req.Type) } - accounts, pageInfo, err := t.accountService.QueryBalances(ctx, filter, entities.CursorPagination{}) + accounts, pageInfo, err := t.AccountService.QueryBalances(ctx, filter, entities.CursorPagination{}) if err != nil { return errors.Wrap(err, "fetching account balance initial image") } @@ -399,7 +562,12 @@ func (t *TradingDataServiceV2) sendAccountsSnapshot(ctx context.Context, req *v2 protos := make([]*v2.AccountBalance, len(accounts)) for i := 0; i < len(accounts); i++ { - protos[i] = accounts[i].ToProto() + var parentPartyID *string + if party, ok := partyPerDerivedKey[accounts[i].PartyID.String()]; ok { + parentPartyID = &party + } + + protos[i] = accounts[i].ToProtoWithParent(parentPartyID) } batches := batch(protos, snapshotPageSize) @@ -549,7 +717,7 @@ func (t *TradingDataServiceV2) ListBalanceChanges(ctx context.Context, req *v2.L return nil, formatE(ErrDateRangeValidationFailed, err) } - balances, pageInfo, err := t.accountService.QueryAggregatedBalances(ctx, filter, dateRange, pagination) + balances, pageInfo, err := t.AccountService.QueryAggregatedBalances(ctx, filter, dateRange, pagination) if err != nil { return nil, formatE(ErrAccountServiceGetBalances, err) } @@ -1458,13 +1626,42 @@ func (t *TradingDataServiceV2) ObservePositions(req *v2.ObservePositionsRequest, ctx, cancel := context.WithCancel(srv.Context()) defer cancel() - if err := t.sendPositionsSnapshot(ctx, req, srv); err != nil { + // handle derived parties + includeDerivedParties := ptr.UnBox(req.IncludeDerivedParties) + if includeDerivedParties && (req.PartyId == nil || len(*req.PartyId) <= 0) { + return formatE(newInvalidArgumentError("includeDerivedParties requires a partyId")) + } + + derivedParties := []string{} + if req.PartyId != nil && len(*req.PartyId) > 0 { + if includeDerivedParties { + partyIDs := []string{*req.PartyId} + + var marketIDs []string + if req.MarketId != nil && len(*req.MarketId) > 0 { + marketIDs = []string{*req.MarketId} + } + + derivedParties, err := t.AMMPoolService.GetSubKeysForParties(ctx, partyIDs, marketIDs) + if err != nil { + return formatE(err) + } + slices.Sort(derivedParties) + } + } + + if err := t.sendPositionsSnapshot(ctx, req, srv, derivedParties); err != nil { if !errors.Is(err, entities.ErrNotFound) { return formatE(ErrPositionServiceSendSnapshot, err) } } - positionsChan, ref := t.positionService.Observe(ctx, t.config.StreamRetries, ptr.UnBox(req.PartyId), ptr.UnBox(req.MarketId)) + // add the party to the derived parties + if req.PartyId != nil && len(*req.PartyId) > 0 { + derivedParties = append(derivedParties, *req.PartyId) + } + + positionsChan, ref := t.positionService.ObserveMany(ctx, t.config.StreamRetries, ptr.UnBox(req.MarketId), derivedParties...) if t.log.GetLevel() == logging.DebugLevel { t.log.Debug("Positions subscriber - new rpc stream", logging.Uint64("ref", ref)) @@ -1489,7 +1686,7 @@ func (t *TradingDataServiceV2) ObservePositions(req *v2.ObservePositionsRequest, }) } -func (t *TradingDataServiceV2) sendPositionsSnapshot(ctx context.Context, req *v2.ObservePositionsRequest, srv v2.TradingDataService_ObservePositionsServer) error { +func (t *TradingDataServiceV2) sendPositionsSnapshot(ctx context.Context, req *v2.ObservePositionsRequest, srv v2.TradingDataService_ObservePositionsServer, derivedParties []string) error { var ( positions []entities.Position err error @@ -1528,6 +1725,24 @@ func (t *TradingDataServiceV2) sendPositionsSnapshot(ctx context.Context, req *v } } + // finally handle derived parties + for _, v := range derivedParties { + if req.MarketId != nil { + position, err := t.positionService.GetByMarketAndParty(ctx, *req.MarketId, v) + if err != nil { + return errors.Wrap(err, "getting initial positions by market+party") + } + positions = append(positions, position) + continue + } + + derivedPartyPositions, err := t.positionService.GetByParty(ctx, entities.PartyID(v)) + if err != nil { + return errors.Wrap(err, "getting initial positions by party") + } + positions = append(positions, derivedPartyPositions...) + } + protos := make([]*vega.Position, len(positions)) for i := 0; i < len(positions); i++ { protos[i] = positions[i].ToProto() @@ -1639,7 +1854,7 @@ func (t *TradingDataServiceV2) ListMarginLevels(ctx context.Context, req *v2.Lis return nil, formatE(ErrRiskServiceGetMarginLevelsByID, err) } - edges, err := makeEdges[*v2.MarginEdge](marginLevels, ctx, t.accountService) + edges, err := makeEdges[*v2.MarginEdge](marginLevels, ctx, t.AccountService) if err != nil { return nil, formatE(err) } @@ -1667,7 +1882,7 @@ func (t *TradingDataServiceV2) ObserveMarginLevels(req *v2.ObserveMarginLevelsRe } return observe(ctx, t.log, "MarginLevel", marginLevelsChan, ref, func(ml entities.MarginLevels) error { - protoMl, err := ml.ToProto(ctx, t.accountService) + protoMl, err := ml.ToProto(ctx, t.AccountService) if err != nil { return errors.Wrap(err, "converting margin levels to proto") } @@ -1687,7 +1902,20 @@ func (t *TradingDataServiceV2) ListRewards(ctx context.Context, req *v2.ListRewa return nil, formatE(ErrInvalidPagination, err) } - rewards, pageInfo, err := t.rewardService.GetByCursor(ctx, &req.PartyId, req.AssetId, req.FromEpoch, req.ToEpoch, pagination, req.TeamId, req.GameId) + partyIDs := []string{req.PartyId} + var marketIDs []string + if req.MarketId != nil { + marketIDs = []string{*req.MarketId} + } + if includeDerivedParties := ptr.UnBox(req.IncludeDerivedParties); includeDerivedParties { + subKeys, err := t.AMMPoolService.GetSubKeysForParties(ctx, partyIDs, marketIDs) + if err != nil { + return nil, formatE(err) + } + partyIDs = append(partyIDs, subKeys...) + } + + rewards, pageInfo, err := t.RewardService.GetByCursor(ctx, partyIDs, req.AssetId, req.FromEpoch, req.ToEpoch, pagination, req.TeamId, req.GameId, req.MarketId) if err != nil { return nil, formatE(ErrGetRewards, err) } @@ -1711,7 +1939,20 @@ func (t *TradingDataServiceV2) ListRewards(ctx context.Context, req *v2.ListRewa func (t *TradingDataServiceV2) ListRewardSummaries(ctx context.Context, req *v2.ListRewardSummariesRequest) (*v2.ListRewardSummariesResponse, error) { defer metrics.StartAPIRequestAndTimeGRPC("ListRewardSummariesV2")() - summaries, err := t.rewardService.GetSummaries(ctx, req.PartyId, req.AssetId) + partyIDs := []string{} + if req.PartyId != nil { + partyIDs = []string{*req.PartyId} + } + + if includeDerivedParties := ptr.UnBox(req.IncludeDerivedParties); includeDerivedParties { + subKeys, err := t.AMMPoolService.GetSubKeysForParties(ctx, partyIDs, nil) + if err != nil { + return nil, formatE(err) + } + partyIDs = append(partyIDs, subKeys...) + } + + summaries, err := t.RewardService.GetSummaries(ctx, partyIDs, req.AssetId) if err != nil { return nil, formatE(ErrSummaryServiceGet, err) } @@ -1737,7 +1978,7 @@ func (t *TradingDataServiceV2) ListEpochRewardSummaries(ctx context.Context, req } filter := entities.RewardSummaryFilterFromProto(req.Filter) - summaries, pageInfo, err := t.rewardService.GetEpochRewardSummaries(ctx, filter, pagination) + summaries, pageInfo, err := t.RewardService.GetEpochRewardSummaries(ctx, filter, pagination) if err != nil { return nil, formatE(ErrSummaryServiceGet, err) } @@ -2258,8 +2499,10 @@ func (t *TradingDataServiceV2) ListPaidLiquidityFees(ctx context.Context, req *v } var marketID *entities.MarketID + var marketIDs []string if req.MarketId != nil { marketID = ptr.From(entities.MarketID(*req.MarketId)) + marketIDs = []string{*req.MarketId} } var assetID *entities.AssetID @@ -2267,7 +2510,18 @@ func (t *TradingDataServiceV2) ListPaidLiquidityFees(ctx context.Context, req *v assetID = ptr.From(entities.AssetID(*req.AssetId)) } - stats, pageInfo, err := t.paidLiquidityFeesStatsService.List(ctx, marketID, assetID, req.EpochSeq, req.PartyIds, pagination) + partyIDs := req.PartyIds + if req.IncludeDerivedParties != nil && *req.IncludeDerivedParties { + if len(partyIDs) == 0 { + return nil, formatE(ErrMissingPartyID) + } + subKeys, err := t.AMMPoolService.GetSubKeysForParties(ctx, partyIDs, marketIDs) + if err != nil { + return nil, formatE(ErrInvalidFilter, err) + } + partyIDs = append(partyIDs, subKeys...) + } + stats, pageInfo, err := t.paidLiquidityFeesStatsService.List(ctx, marketID, assetID, req.EpochSeq, partyIDs, pagination, req.EpochFrom, req.EpochTo) if err != nil { return nil, formatE(ErrListPaidLiquidityFees, err) } @@ -2444,7 +2698,7 @@ func (t *TradingDataServiceV2) GetTransfer(ctx context.Context, req *v2.GetTrans if err != nil { return nil, formatE(err) } - tp, err := transfer.ToProto(ctx, t.accountService) + tp, err := transfer.ToProto(ctx, t.AccountService) if err != nil { return nil, formatE(err) } @@ -2530,7 +2784,7 @@ func (t *TradingDataServiceV2) ListTransfers(ctx context.Context, req *v2.ListTr return nil, formatE(ErrTransferServiceGet, errors.Wrapf(err, "pubkey: %s", ptr.UnBox(req.Pubkey))) } - edges, err := makeEdges[*v2.TransferEdge](transfers, ctx, t.accountService) + edges, err := makeEdges[*v2.TransferEdge](transfers, ctx, t.AccountService) if err != nil { t.log.Error("Something went wrong making transfer edges", logging.Error(err)) return nil, formatE(err) @@ -3038,8 +3292,8 @@ func (t *TradingDataServiceV2) scaleFromMarketToAssetPrice( if err != nil { return nil, err } - - return price.Mul(price, priceFactor), nil + price, _ = num.UintFromDecimal(price.ToDecimal().Mul(priceFactor)) + return price, nil } func (t *TradingDataServiceV2) scaleDecimalFromMarketToAssetPrice( @@ -3057,22 +3311,23 @@ func (t *TradingDataServiceV2) scaleDecimalFromAssetToMarketPrice( func (t *TradingDataServiceV2) getMarketPriceFactor( ctx context.Context, mkt entities.Market, -) (*num.Uint, error) { +) (num.Decimal, error) { assetID, err := mkt.ToProto().GetAsset() if err != nil { - return nil, errors.Wrap(err, "getting asset from market") + return num.DecimalZero(), errors.Wrap(err, "getting asset from market") } asset, err := t.AssetService.GetByID(ctx, assetID) if err != nil { - return nil, errors.Wrapf(ErrAssetServiceGetByID, "assetID: %s", assetID) + return num.DecimalZero(), errors.Wrapf(ErrAssetServiceGetByID, "assetID: %s", assetID) } // scale the price if needed // price is expected in market decimal - priceFactor := num.NewUint(1) + priceFactor := num.DecimalOne() + // this could be negative, use decimal if exp := asset.Decimals - mkt.DecimalPlaces; exp != 0 { - priceFactor.Exp(num.NewUint(10), num.NewUint(uint64(exp))) + priceFactor = num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(exp))) } return priceFactor, nil } @@ -3271,6 +3526,9 @@ func (t *TradingDataServiceV2) EstimatePosition(ctx context.Context, req *v2.Est if err != nil { return nil, formatE(ErrMarketServiceGetByID, err) } + + cap, hasCap := mkt.HasCap() + collateralAvailable := marginAccountBalance crossMarginMode := req.MarginMode == types.MarginModeCrossMargin if crossMarginMode { @@ -3298,7 +3556,7 @@ func (t *TradingDataServiceV2) EstimatePosition(ctx context.Context, req *v2.Est return nil, err } - dPriceFactor := priceFactor.ToDecimal() + dPriceFactor := priceFactor buyOrders := make([]*risk.OrderInfo, 0, len(req.Orders)) sellOrders := make([]*risk.OrderInfo, 0, len(req.Orders)) @@ -3411,6 +3669,8 @@ func (t *TradingDataServiceV2) EstimatePosition(ctx context.Context, req *v2.Est req.MarginMode, dMarginFactor, auctionPrice, + cap, + avgEntryPrice, ) marginEstimate := &v2.MarginEstimate{ @@ -3474,6 +3734,36 @@ func (t *TradingDataServiceV2) EstimatePosition(ctx context.Context, req *v2.Est wWithSell = t.scaleDecimalFromAssetToMarketPrice(wWithSell, dPriceFactor) } + f := func(volume int64) (worst, best decimal.Decimal) { + // if party is long, then liquidation is 0 + if volume >= 0 { + return num.DecimalZero(), num.DecimalZero() + } + + // if its short we use the size of capPrice + return num.MustDecimalFromString(cap.MaxPrice), num.MustDecimalFromString(cap.MaxPrice) // can't fail coming from the DB + } + + // no worst or best case in this case, so just setting the same on boths + if hasCap && cap.FullyCollateralised != nil && *cap.FullyCollateralised { + // openVolume first + wPositionOnly, bPositionOnly = f(req.OpenVolume) + + // then including buyOrders + incBuyOrders := req.OpenVolume + for _, v := range buyOrders { + incBuyOrders += int64(v.TrueRemaining) + } + wWithBuy, bWithBuy = f(incBuyOrders) + + // then including sellOrders + incSellOrders := req.OpenVolume + for _, v := range sellOrders { + incSellOrders += int64(v.TrueRemaining) + } + wWithSell, bWithSell = f(incSellOrders) + } + liquidationEstimate := &v2.LiquidationEstimate{ WorstCase: &v2.LiquidationPrice{ OpenVolumeOnly: wPositionOnly.Round(0).String(), @@ -3506,6 +3796,8 @@ func (t *TradingDataServiceV2) computeMarginRange( auction bool, marginMode vega.MarginMode, marginFactor, auctionPrice num.Decimal, + cap *vega.FutureCap, + averageEntryPrice num.Decimal, ) (num.Decimal, num.Decimal, num.Decimal) { bOrders, sOrders := buyOrders, sellOrders orderMargin := num.DecimalZero() @@ -3521,6 +3813,7 @@ func (t *TradingDataServiceV2) computeMarginRange( } } sOrders = []*risk.OrderInfo{} + sNonMarketOrders := []*risk.OrderInfo{} for _, o := range sellOrders { if o.IsMarketOrder { @@ -3529,15 +3822,121 @@ func (t *TradingDataServiceV2) computeMarginRange( sNonMarketOrders = append(sNonMarketOrders, o) } } - orderMargin = risk.CalcOrderMarginIsolatedMode(openVolume, bNonMarketOrders, sNonMarketOrders, positionFactor, marginFactor, auctionPrice) + + // this is a special case for fully collateralised capped future markets + if cap != nil && cap.FullyCollateralised != nil && *cap.FullyCollateralised { + orderMargin = calcOrderMarginIsolatedModeCappedAndFullyCollateralised(bNonMarketOrders, sNonMarketOrders, cap) + } else { + orderMargin = risk.CalcOrderMarginIsolatedMode(openVolume, bNonMarketOrders, sNonMarketOrders, positionFactor, marginFactor, auctionPrice) + } } - worst := risk.CalculateMaintenanceMarginWithSlippageFactors(openVolume, bOrders, sOrders, marketObservable, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactors.Long, riskFactors.Short, fundingPaymentPerUnitPosition, auction, auctionPrice) - best := risk.CalculateMaintenanceMarginWithSlippageFactors(openVolume, bOrders, sOrders, marketObservable, positionFactor, num.DecimalZero(), num.DecimalZero(), riskFactors.Long, riskFactors.Short, fundingPaymentPerUnitPosition, auction, auctionPrice) + var worst, best num.Decimal + // this is a special case for fully collateralised capped future markets + if cap != nil && cap.FullyCollateralised != nil && *cap.FullyCollateralised { + worst = calcPositionMarginCappedAndFullyCollateralised(bOrders, sOrders, cap, openVolume, averageEntryPrice) + best = worst + } else { + worst = risk.CalculateMaintenanceMarginWithSlippageFactors(openVolume, bOrders, sOrders, marketObservable, positionFactor, linearSlippageFactor, quadraticSlippageFactor, riskFactors.Long, riskFactors.Short, fundingPaymentPerUnitPosition, auction, auctionPrice) + best = risk.CalculateMaintenanceMarginWithSlippageFactors(openVolume, bOrders, sOrders, marketObservable, positionFactor, num.DecimalZero(), num.DecimalZero(), riskFactors.Long, riskFactors.Short, fundingPaymentPerUnitPosition, auction, auctionPrice) + } return worst, best, orderMargin } +func calcPositionMarginCappedAndFullyCollateralised( + buyOrders []*risk.OrderInfo, + sellOrders []*risk.OrderInfo, + cap *vega.FutureCap, + openVolume int64, + openVolumeAverageEntryPrice decimal.Decimal, +) decimal.Decimal { + // get average entry price over all orders + // and the final volume. + // then if long: + // - averageEntryPrice * positionSize + // if short: + // - (priceCap - averageEntryPrice) * positionSize + + priceCap := num.MustDecimalFromString(cap.MaxPrice) + + positionSize := openVolume + totalVolume := openVolume + ongoing := openVolumeAverageEntryPrice.Mul(num.DecimalFromInt64(openVolume)) + for _, v := range buyOrders { + price := v.Price + if price.GreaterThan(priceCap) { + price = priceCap + } + + size := int64(v.TrueRemaining) + positionSize += size + totalVolume += size + ongoing = ongoing.Add(v.Price.Mul(num.DecimalFromInt64(size))) + } + + for _, v := range sellOrders { + price := v.Price + if price.GreaterThan(priceCap) { + price = priceCap + } + + size := int64(v.TrueRemaining) + positionSize -= size // only thing changing here really + totalVolume += size + ongoing = ongoing.Add(v.Price.Mul(num.DecimalFromInt64(size))) + } + + averageEntryPrice := ongoing.Div(num.DecimalFromInt64(totalVolume)) + + if positionSize < 0 { + // short position + positionSize = -positionSize + return priceCap.Sub(averageEntryPrice).Mul(num.DecimalFromInt64(positionSize)) + } + + return priceCap.Mul(num.DecimalFromInt64(positionSize)) +} + +func calcOrderMarginIsolatedModeCappedAndFullyCollateralised( + buyOrders []*risk.OrderInfo, + sellOrders []*risk.OrderInfo, + cap *vega.FutureCap, +) decimal.Decimal { + // long order margin: + // - price * positionSize + // short order marign: + // - (cappedPrice - price) * positionSize + + cappedPrice := num.MustDecimalFromString(cap.MaxPrice) + marginBuy, marginSell := num.DecimalZero(), num.DecimalZero() + + for _, v := range buyOrders { + price := v.Price + if v.Price.GreaterThan(cappedPrice) { + price = cappedPrice + } + + marginBuy.Add(price.Mul(num.DecimalFromInt64(int64(v.TrueRemaining)))) + } + + for _, v := range sellOrders { + price := v.Price + if v.Price.GreaterThan(cappedPrice) { + price = cappedPrice + } + + price = cappedPrice.Sub(price) + marginSell.Add(price.Mul(num.DecimalFromInt64(int64(v.TrueRemaining)))) + } + + if marginBuy.GreaterThan(marginSell) { + return marginBuy + } + + return marginSell +} + // ListNetworkParameters returns a list of network parameters. func (t *TradingDataServiceV2) ListNetworkParameters(ctx context.Context, req *v2.ListNetworkParametersRequest) (*v2.ListNetworkParametersResponse, error) { defer metrics.StartAPIRequestAndTimeGRPC("ListNetworkParametersV2")() @@ -4237,7 +4636,7 @@ func (t *TradingDataServiceV2) ListEntities(ctx context.Context, req *v2.ListEnt // query accounts := queryProtoEntities[*vega.Account](ctx, eg, txHash, - t.accountService.GetByTxHash, ErrAccountServiceGetByTxHash) + t.AccountService.GetByTxHash, ErrAccountServiceGetByTxHash) orders := queryProtoEntities[*vega.Order](ctx, eg, txHash, t.orderService.GetByTxHash, ErrOrderServiceGetByTxHash) @@ -4246,7 +4645,7 @@ func (t *TradingDataServiceV2) ListEntities(ctx context.Context, req *v2.ListEnt t.positionService.GetByTxHash, ErrPositionsGetByTxHash) balances := queryProtoEntities[*v2.AccountBalance](ctx, eg, txHash, - t.accountService.GetBalancesByTxHash, ErrAccountServiceGetBalancesByTxHash) + t.AccountService.GetBalancesByTxHash, ErrAccountServiceGetBalancesByTxHash) votes := queryProtoEntities[*vega.Vote](ctx, eg, txHash, t.governanceService.GetVotesByTxHash, ErrVotesGetByTxHash) @@ -4267,7 +4666,7 @@ func (t *TradingDataServiceV2) ListEntities(ctx context.Context, req *v2.ListEnt t.partyService.GetByTxHash, ErrPartyServiceGetByTxHash) rewards := queryProtoEntities[*vega.Reward](ctx, eg, txHash, - t.rewardService.GetByTxHash, ErrRewardsGetByTxHash) + t.RewardService.GetByTxHash, ErrRewardsGetByTxHash) deposits := queryProtoEntities[*vega.Deposit](ctx, eg, txHash, t.depositService.GetByTxHash, ErrDepositsGetByTxHash) @@ -4309,7 +4708,7 @@ func (t *TradingDataServiceV2) ListEntities(ctx context.Context, req *v2.ListEnt ledgerEntries := queryAndMapEntities(ctx, eg, txHash, t.ledgerService.GetByTxHash, func(item entities.LedgerEntry) (*vega.LedgerEntry, error) { - return item.ToProto(ctx, t.accountService) + return item.ToProto(ctx, t.AccountService) }, ErrLedgerEntriesGetByTxHash, ) @@ -4317,7 +4716,7 @@ func (t *TradingDataServiceV2) ListEntities(ctx context.Context, req *v2.ListEnt transfers := queryAndMapEntities(ctx, eg, txHash, t.transfersService.GetByTxHash, func(item entities.Transfer) (*v1.Transfer, error) { - return item.ToProto(ctx, t.accountService) + return item.ToProto(ctx, t.AccountService) }, ErrTransfersGetByTxHash, ) @@ -4325,7 +4724,7 @@ func (t *TradingDataServiceV2) ListEntities(ctx context.Context, req *v2.ListEnt marginLevels := queryAndMapEntities(ctx, eg, txHash, t.riskService.GetByTxHash, func(item entities.MarginLevels) (*vega.MarginLevels, error) { - return item.ToProto(ctx, t.accountService) + return item.ToProto(ctx, t.AccountService) }, ErrMarginLevelsGetByTxHash, ) @@ -4957,7 +5356,7 @@ func (t *TradingDataServiceV2) GetFeesStats(ctx context.Context, req *v2.GetFees assetID = ptr.From(entities.AssetID(*req.AssetId)) } - stats, err := t.feesStatsService.GetFeesStats(ctx, marketID, assetID, req.EpochSeq, req.PartyId) + stats, err := t.feesStatsService.GetFeesStats(ctx, marketID, assetID, req.EpochSeq, req.PartyId, req.EpochFrom, req.EpochTo) if err != nil { return nil, formatE(ErrGetFeesStats, err) } @@ -5117,6 +5516,7 @@ func (t *TradingDataServiceV2) EstimateTransferFee(ctx context.Context, req *v2. accumulatedDiscount, req.FromAccount, req.FromAccountType, + req.FromAmmKey, req.ToAccount, ) @@ -5246,3 +5646,158 @@ func (t *TradingDataServiceV2) GetTimeWeightedNotionalPosition(ctx context.Conte TimeWeightedNotionalPosition: pos.ToProto(), }, nil } + +func (t *TradingDataServiceV2) ListAMMs(ctx context.Context, req *v2.ListAMMsRequest) (*v2.ListAMMsResponse, error) { + defer metrics.StartAPIRequestAndTimeGRPC("ListAMMs")() + + 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, *req.PartyId, pagination) + } else if req.MarketId != nil { + pools, pageInfo, err = t.AMMPoolService.ListByMarket(ctx, *req.MarketId, pagination) + } else if req.Id != nil { + pools, pageInfo, err = t.AMMPoolService.ListByPool(ctx, *req.Id, pagination) + } else if req.AmmPartyId != nil { + pools, pageInfo, err = t.AMMPoolService.ListBySubAccount(ctx, *req.AmmPartyId, pagination) + } else if req.Status != nil { + pools, pageInfo, err = t.AMMPoolService.ListByStatus(ctx, entities.AMMStatus(*req.Status), pagination) + } else { + pools, pageInfo, err = t.AMMPoolService.ListAll(ctx, pagination) + } + + if err != nil { + return nil, formatE(ErrListAMMPools, err) + } + + edges, err := makeEdges[*v2.AMMEdge](pools) + if err != nil { + return nil, formatE(err) + } + + return &v2.ListAMMsResponse{ + Amms: &v2.AMMConnection{ + Edges: edges, + PageInfo: pageInfo.ToProto(), + }, + }, nil +} + +func (t *TradingDataServiceV2) EstimateAMMBounds(ctx context.Context, req *v2.EstimateAMMBoundsRequest) (*v2.EstimateAMMBoundsResponse, error) { + defer metrics.StartAPIRequestAndTimeGRPC("EstimateAMMBounds")() + + if req.MarketId == "" { + return nil, formatE(ErrInvalidMarketID) + } + + basePrice, overflow := num.UintFromString(req.BasePrice, 10) + if overflow || basePrice.IsNegative() { + return nil, formatE(ErrInvalidBasePrice) + } + + var upperPrice *num.Uint + if req.UpperPrice != nil { + upperP, overflow := num.UintFromString(*req.UpperPrice, 10) + if overflow || upperP.IsNegative() || upperP.LTE(basePrice) { + return nil, formatE(ErrInvalidUpperPrice) + } + upperPrice = upperP + } + + var lowerPrice *num.Uint + if req.LowerPrice != nil { + lowerP, overflow := num.UintFromString(*req.LowerPrice, 10) + if overflow || lowerP.IsNegative() || lowerP.GTE(basePrice) { + return nil, formatE(ErrInvalidLowerPrice) + } + lowerPrice = lowerP + } + + var leverageLowerPrice, leverageUpperPrice *num.Decimal + if req.LeverageAtLowerPrice != nil { + llPrice, err := num.DecimalFromString(*req.LeverageAtLowerPrice) + if err != nil || llPrice.IsNegative() { + return nil, formatE(ErrInvalidLeverageAtLowerPrice, err) + } + leverageLowerPrice = &llPrice + } + + if req.LeverageAtUpperPrice != nil { + luPrice, err := num.DecimalFromString(*req.LeverageAtUpperPrice) + if err != nil || luPrice.IsNegative() { + return nil, formatE(ErrInvalidLeverageAtUpperPrice, err) + } + leverageUpperPrice = &luPrice + } + + commitmentAmount, overflow := num.UintFromString(req.CommitmentAmount, 10) + if overflow || commitmentAmount.IsNegative() { + return nil, formatE(ErrInvalidCommitmentAmount) + } + + if lowerPrice == nil && upperPrice == nil { + return nil, formatE(ErrInvalidLowerPrice) + } + + // TODO Karel - make the market service and risk factor serices calls concurent + market, err := t.MarketsService.GetByID(ctx, req.MarketId) + if err != nil { + return nil, formatE(ErrEstimateAMMBounds, err) + } + + if market.TradableInstrument.MarginCalculator == nil || + market.TradableInstrument.MarginCalculator.ScalingFactors == nil { + return nil, formatE(ErrEstimateAMMBounds) + } + + if market.LinearSlippageFactor == nil { + return nil, formatE(ErrEstimateAMMBounds) + } + + initialMargin := num.DecimalFromFloat(market.TradableInstrument.MarginCalculator.ScalingFactors.InitialMargin) + linearSlippageFactor := *market.LinearSlippageFactor + + riskFactor, err := t.RiskFactorService.GetMarketRiskFactors(ctx, req.MarketId) + if err != nil { + return nil, formatE(ErrEstimateAMMBounds, err) + } + if leverageLowerPrice == nil { + leverageLowerPrice = &riskFactor.Short + } + if leverageUpperPrice == nil { + leverageUpperPrice = &riskFactor.Long + } + + sqrt := amm.NewSqrter() + + estimatedBounds := amm.EstimateBounds( + sqrt, + lowerPrice, + basePrice, + upperPrice, + *leverageLowerPrice, + *leverageUpperPrice, + commitmentAmount, + linearSlippageFactor, + initialMargin, + riskFactor.Short, + riskFactor.Long, + ) + + return &v2.EstimateAMMBoundsResponse{ + PositionSizeAtUpper: estimatedBounds.PositionSizeAtUpper.String(), + PositionSizeAtLower: estimatedBounds.PositionSizeAtLower.String(), + LossOnCommitmentAtUpper: estimatedBounds.LossOnCommitmentAtUpper.String(), + LossOnCommitmentAtLower: estimatedBounds.LossOnCommitmentAtLower.String(), + LiquidationPriceAtUpper: estimatedBounds.LiquidationPriceAtUpper.String(), + LiquidationPriceAtLower: estimatedBounds.LiquidationPriceAtLower.String(), + }, nil +} diff --git a/datanode/api/trading_data_v2_test.go b/datanode/api/trading_data_v2_test.go index 50c5f20b174..4319ecc7e7d 100644 --- a/datanode/api/trading_data_v2_test.go +++ b/datanode/api/trading_data_v2_test.go @@ -23,22 +23,30 @@ import ( "fmt" "io" "math" + "slices" "sort" "strconv" "strings" + "sync" "testing" + "time" "code.vegaprotocol.io/vega/datanode/api" "code.vegaprotocol.io/vega/datanode/api/mocks" "code.vegaprotocol.io/vega/datanode/entities" "code.vegaprotocol.io/vega/datanode/networkhistory/segment" + "code.vegaprotocol.io/vega/datanode/service" + smocks "code.vegaprotocol.io/vega/datanode/service/mocks" "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" + "code.vegaprotocol.io/vega/logging" v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2" "code.vegaprotocol.io/vega/protos/vega" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "golang.org/x/exp/maps" "google.golang.org/genproto/googleapis/api/httpbody" "google.golang.org/grpc/metadata" ) @@ -793,6 +801,541 @@ func TestEstimatePosition(t *testing.T) { } } +func TestListAccounts(t *testing.T) { + ctrl := gomock.NewController(t) + accountStore := smocks.NewMockAccountStore(ctrl) + balanceStore := smocks.NewMockBalanceStore(ctrl) + ammSvc := mocks.NewMockAMMService(ctrl) + + apiService := api.TradingDataServiceV2{ + AccountService: service.NewAccount(accountStore, balanceStore, logging.NewTestLogger()), + AMMPoolService: ammSvc, + } + + ctx := context.Background() + + req := &v2.ListAccountsRequest{ + Filter: &v2.AccountFilter{ + AssetId: "asset1", + PartyIds: []string{"90421f905ab72919671caca4ffb891ba8b253a4d506e1c0223745268edf4416d", "03f49799559c8fd87859edba4b95d40a22e93dedee64f9d7bdc586fa6bbb90e9"}, + MarketIds: []string{"a7878862705cf303cae4ecc9e6cc60781672a9eb5b29eb62bb88b880821340ea", "af56a491ee1dc0576d8bf28e11d936eb744e9976ae0046c2ec824e2beea98ea0"}, + }, + } + + // without derived keys + { + expect := []entities.AccountBalance{ + { + Account: &entities.Account{ + PartyID: "90421f905ab72919671caca4ffb891ba8b253a4d506e1c0223745268edf4416d", + AssetID: "asset1", + }, + }, + { + Account: &entities.Account{ + PartyID: "03f49799559c8fd87859edba4b95d40a22e93dedee64f9d7bdc586fa6bbb90e9", + AssetID: "asset1", + }, + }, + } + + accountFilter := entities.AccountFilter{ + AssetID: entities.AssetID(req.Filter.AssetId), + PartyIDs: entities.NewPartyIDSlice(req.Filter.PartyIds...), + MarketIDs: entities.NewMarketIDSlice(req.Filter.MarketIds...), + } + + // ammSvc.EXPECT().GetSubKeysForParties(gomock.Any(), gomock.Any(), gomock.Any()).MaxTimes(1).Return(nil, nil) + accountStore.EXPECT().QueryBalances(gomock.Any(), accountFilter, gomock.Any()).Times(1).Return(expect, entities.PageInfo{}, nil) + + resp, err := apiService.ListAccounts(ctx, req) + require.NoError(t, err) + require.Len(t, resp.Accounts.Edges, 2) + require.Equal(t, expect[0].ToProto(), resp.Accounts.Edges[0].Node) + require.Equal(t, expect[1].ToProto(), resp.Accounts.Edges[1].Node) + } + + // now test with derived keys + { + req.IncludeDerivedParties = ptr.From(true) + + expect := []entities.AccountBalance{ + { + Account: &entities.Account{ + PartyID: "90421f905ab72919671caca4ffb891ba8b253a4d506e1c0223745268edf4416d", + AssetID: "asset1", + }, + }, + { + Account: &entities.Account{ + PartyID: "03f49799559c8fd87859edba4b95d40a22e93dedee64f9d7bdc586fa6bbb90e9", + AssetID: "asset1", + }, + }, + } + + partyPerDerivedKey := map[string]string{ + "653f9a9850852ca541f20464893536e7986be91c4c364788f6d273fb452778ba": "90421f905ab72919671caca4ffb891ba8b253a4d506e1c0223745268edf4416d", + "79b3aaa5ff0933408cf8f1bcb0b1006cd7bc259d76d400721744e8edc12f2929": "03f49799559c8fd87859edba4b95d40a22e93dedee64f9d7bdc586fa6bbb90e9", + "35c2dc44b391a5f27ace705b554cd78ba42412c3d2597ceba39642f49ebf5d2b": "90421f905ab72919671caca4ffb891ba8b253a4d506e1c0223745268edf4416d", + "161c1c424215cff4f32154871c225dc9760bcac1d4d6783deeaacf7f8b6861ab": "03f49799559c8fd87859edba4b95d40a22e93dedee64f9d7bdc586fa6bbb90e9", + } + + ammSvc.EXPECT().GetSubKeysForParties(gomock.Any(), gomock.Any(), gomock.Any()).Times(len(expect)).DoAndReturn(func(_ context.Context, partyIDs []string, _ []string) ([]string, error) { + if len(partyIDs) == 0 { + return nil, nil + } + ret := make([]string, 0, 2) + for dk, pid := range partyPerDerivedKey { + if pid == partyIDs[0] { + ret = append(ret, dk) + } + } + return ret, nil + }) + for derivedKey := range partyPerDerivedKey { + expect = append(expect, entities.AccountBalance{ + Account: &entities.Account{ + PartyID: entities.PartyID(derivedKey), + AssetID: "asset1", + }, + }) + } + + accountStore.EXPECT().QueryBalances(gomock.Any(), gomock.Any(), gomock.Any()). + Do(func(ctx context.Context, filter entities.AccountFilter, pageInfo entities.CursorPagination) { + var expectPartyIDs []string + for _, e := range expect { + expectPartyIDs = append(expectPartyIDs, e.PartyID.String()) + } + + var gotPartyIDs []string + for _, p := range filter.PartyIDs { + gotPartyIDs = append(gotPartyIDs, p.String()) + } + + slices.Sort(expectPartyIDs) + slices.Sort(gotPartyIDs) + require.Zero(t, slices.Compare(expectPartyIDs, gotPartyIDs)) + }).Times(1).Return(expect, entities.PageInfo{}, nil) + + resp, err := apiService.ListAccounts(ctx, req) + require.NoError(t, err) + require.Len(t, resp.Accounts.Edges, 6) + + for i := range expect { + require.Equal(t, expect[i].ToProto().Owner, resp.Accounts.Edges[i].Node.Owner) + + if party, ok := partyPerDerivedKey[expect[i].PartyID.String()]; ok { + require.NotNil(t, resp.Accounts.Edges[i].Node.ParentPartyId) + require.Equal(t, party, *resp.Accounts.Edges[i].Node.ParentPartyId) + } + } + } +} + +func TestObserveAccountBalances(t *testing.T) { + ctrl := gomock.NewController(t) + accountStore := smocks.NewMockAccountStore(ctrl) + balanceStore := smocks.NewMockBalanceStore(ctrl) + ammSvc := mocks.NewMockAMMService(ctrl) + + apiService := api.TradingDataServiceV2{ + AccountService: service.NewAccount(accountStore, balanceStore, logging.NewTestLogger()), + AMMPoolService: ammSvc, + } + + apiService.SetLogger(logging.NewTestLogger()) + + ctx := context.Background() + + req := &v2.ObserveAccountsRequest{ + MarketId: "a7878862705cf303cae4ecc9e6cc60781672a9eb5b29eb62bb88b880821340ea", + PartyId: "90421f905ab72919671caca4ffb891ba8b253a4d506e1c0223745268edf4416d", + Asset: "asset1", + } + + // without derived keys + { + expect := []entities.AccountBalance{ + { + Account: &entities.Account{ + PartyID: entities.PartyID(req.PartyId), + AssetID: entities.AssetID(req.Asset), + MarketID: entities.MarketID(req.MarketId), + Type: vega.AccountType_ACCOUNT_TYPE_GENERAL, + }, + }, + { + Account: &entities.Account{ + PartyID: entities.PartyID(req.PartyId), + AssetID: entities.AssetID(req.Asset), + MarketID: entities.MarketID(req.MarketId), + Type: vega.AccountType_ACCOUNT_TYPE_MARGIN, + }, + }, + { + Account: &entities.Account{ + PartyID: entities.PartyID(req.PartyId), + AssetID: entities.AssetID(req.Asset), + MarketID: entities.MarketID(req.MarketId), + Type: vega.AccountType_ACCOUNT_TYPE_BOND, + }, + }, + } + + balanceStore.EXPECT().Flush(gomock.Any()).Return(expect[1:], nil).Times(1) + + accountFilter := entities.AccountFilter{ + AssetID: "asset1", + PartyIDs: entities.NewPartyIDSlice(req.PartyId), + MarketIDs: entities.NewMarketIDSlice(req.MarketId), + } + + accountStore.EXPECT().QueryBalances(gomock.Any(), accountFilter, gomock.Any()).Times(1).Return(expect[:1], entities.PageInfo{}, nil) + + srvCtx, cancel := context.WithCancel(ctx) + res := mockObserveAccountServer{ + mockServerStream: mockServerStream{ctx: srvCtx}, + send: func(oar *v2.ObserveAccountsResponse) error { + switch res := oar.Response.(type) { + case *v2.ObserveAccountsResponse_Snapshot: + require.Len(t, res.Snapshot.Accounts, 1) + require.Equal(t, expect[0].ToProto(), res.Snapshot.Accounts[0]) + case *v2.ObserveAccountsResponse_Updates: + require.Equal(t, len(expect[1:]), len(res.Updates.Accounts)) + require.Equal(t, expect[1].ToProto().Owner, res.Updates.Accounts[0].Owner) + require.Equal(t, expect[1].ToProto().Type, res.Updates.Accounts[0].Type) + require.Equal(t, expect[2].ToProto().Owner, res.Updates.Accounts[1].Owner) + require.Equal(t, expect[2].ToProto().Type, res.Updates.Accounts[1].Type) + cancel() + default: + t.Fatalf("unexpected response type: %T", oar.Response) + } + return nil + }, + } + + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + apiService.ObserveAccounts(req, res) + }() + + time.Sleep(1 * time.Second) + err := apiService.AccountService.Flush(ctx) + require.NoError(t, err) + wg.Wait() + } + + // now test with derived keys + { + req.IncludeDerivedParties = ptr.From(true) + + expect := []entities.AccountBalance{ + { + Account: &entities.Account{ + PartyID: entities.PartyID(req.PartyId), + AssetID: entities.AssetID(req.Asset), + MarketID: entities.MarketID(req.MarketId), + Type: vega.AccountType_ACCOUNT_TYPE_GENERAL, + }, + }, + { + Account: &entities.Account{ + PartyID: entities.PartyID(req.PartyId), + AssetID: entities.AssetID(req.Asset), + MarketID: entities.MarketID(req.MarketId), + Type: vega.AccountType_ACCOUNT_TYPE_MARGIN, + }, + }, + { + Account: &entities.Account{ + PartyID: entities.PartyID(req.PartyId), + AssetID: entities.AssetID(req.Asset), + MarketID: entities.MarketID(req.MarketId), + Type: vega.AccountType_ACCOUNT_TYPE_BOND, + }, + }, + } + + partyPerDerivedKey := map[string]string{ + "653f9a9850852ca541f20464893536e7986be91c4c364788f6d273fb452778ba": req.PartyId, + } + ammSvc.EXPECT().GetSubKeysForParties(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(maps.Keys(partyPerDerivedKey), nil) + + for derivedKey := range partyPerDerivedKey { + expect = append(expect, entities.AccountBalance{ + Account: &entities.Account{ + PartyID: entities.PartyID(derivedKey), + AssetID: entities.AssetID(req.Asset), + MarketID: entities.MarketID(req.MarketId), + Type: vega.AccountType_ACCOUNT_TYPE_GENERAL, + }, + }) + } + balanceStore.EXPECT().Flush(gomock.Any()).Return(expect[3:], nil).Times(1) + + accountFilter := entities.AccountFilter{ + AssetID: "asset1", + PartyIDs: entities.NewPartyIDSlice(append(maps.Keys(partyPerDerivedKey), req.PartyId)...), + MarketIDs: entities.NewMarketIDSlice(req.MarketId), + } + + accountStore.EXPECT().QueryBalances(gomock.Any(), accountFilter, gomock.Any()).Times(1).Return(expect[:3], entities.PageInfo{}, nil) + + srvCtx, cancel := context.WithCancel(ctx) + res := mockObserveAccountServer{ + mockServerStream: mockServerStream{ctx: srvCtx}, + send: func(oar *v2.ObserveAccountsResponse) error { + switch res := oar.Response.(type) { + case *v2.ObserveAccountsResponse_Snapshot: + require.Len(t, res.Snapshot.Accounts, 3) + require.Equal(t, expect[0].ToProto(), res.Snapshot.Accounts[0]) + require.Equal(t, expect[1].ToProto(), res.Snapshot.Accounts[1]) + require.Equal(t, expect[2].ToProto(), res.Snapshot.Accounts[2]) + case *v2.ObserveAccountsResponse_Updates: + require.Equal(t, len(expect[3:]), len(res.Updates.Accounts)) + require.Equal(t, expect[3].ToProto().Owner, res.Updates.Accounts[0].Owner) + require.Equal(t, expect[3].ToProto().Type, res.Updates.Accounts[0].Type) + cancel() + default: + t.Fatalf("unexpected response type: %T", oar.Response) + } + return nil + }, + } + + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + apiService.ObserveAccounts(req, res) + }() + + time.Sleep(1 * time.Second) + err := apiService.AccountService.Flush(ctx) + require.NoError(t, err) + wg.Wait() + } +} + +func TestListRewards(t *testing.T) { + ctrl := gomock.NewController(t) + marketStore := smocks.NewMockMarketStore(ctrl) + rewardStore := smocks.NewMockRewardStore(ctrl) + ammSvc := mocks.NewMockAMMService(ctrl) + + apiService := api.TradingDataServiceV2{ + MarketsService: service.NewMarkets(marketStore), + RewardService: service.NewReward(rewardStore, logging.NewTestLogger()), + AMMPoolService: ammSvc, + } + + ctx := context.Background() + + req := &v2.ListRewardsRequest{ + PartyId: "90421f905ab72919671caca4ffb891ba8b253a4d506e1c0223745268edf4416d", + } + + // without derived keys + { + expect := []entities.Reward{ + { + PartyID: entities.PartyID(req.PartyId), + }, + } + + pagination := entities.DefaultCursorPagination(true) + + rewardStore.EXPECT().GetByCursor(ctx, + []string{req.PartyId}, req.AssetId, req.FromEpoch, req.ToEpoch, pagination, req.TeamId, req.GameId, req.MarketId). + Times(1).Return(expect, entities.PageInfo{}, nil) + + resp, err := apiService.ListRewards(ctx, req) + require.NoError(t, err) + require.Len(t, resp.Rewards.Edges, 1) + require.Equal(t, expect[0].ToProto().PartyId, resp.Rewards.Edges[0].Node.PartyId) + } + + // now test with derived keys + { + req.IncludeDerivedParties = ptr.From(true) + + expect := []entities.Reward{ + { + PartyID: entities.PartyID(req.PartyId), + }, + { + PartyID: entities.PartyID("653f9a9850852ca541f20464893536e7986be91c4c364788f6d273fb452778ba"), + }, + { + PartyID: entities.PartyID("35c2dc44b391a5f27ace705b554cd78ba42412c3d2597ceba39642f49ebf5d2b"), + }, + } + + pagination := entities.DefaultCursorPagination(true) + + ammSvc.EXPECT().GetSubKeysForParties(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes().Return([]string{ + "653f9a9850852ca541f20464893536e7986be91c4c364788f6d273fb452778ba", + "35c2dc44b391a5f27ace705b554cd78ba42412c3d2597ceba39642f49ebf5d2b", + }, nil) + + rewardStore.EXPECT().GetByCursor(ctx, gomock.Any(), req.AssetId, req.FromEpoch, req.ToEpoch, + pagination, req.TeamId, req.GameId, req.MarketId). + Do(func(_ context.Context, gotPartyIDs []string, _ *string, _, _ *uint64, _ entities.CursorPagination, _, _, _ *string) { + expectPartyIDs := []string{expect[0].PartyID.String(), expect[1].PartyID.String(), expect[2].PartyID.String()} + + slices.Sort(expectPartyIDs) + slices.Sort(gotPartyIDs) + require.Zero(t, slices.Compare(expectPartyIDs, gotPartyIDs)) + }). + Times(1).Return(expect, entities.PageInfo{}, nil) + + resp, err := apiService.ListRewards(ctx, req) + require.NoError(t, err) + require.Len(t, resp.Rewards.Edges, 3) + require.Equal(t, expect[0].ToProto().PartyId, resp.Rewards.Edges[0].Node.PartyId) + require.Equal(t, expect[1].ToProto().PartyId, resp.Rewards.Edges[1].Node.PartyId) + require.Equal(t, expect[2].ToProto().PartyId, resp.Rewards.Edges[2].Node.PartyId) + } +} + +func TestListRewardSummaries(t *testing.T) { + ctrl := gomock.NewController(t) + marketStore := smocks.NewMockMarketStore(ctrl) + rewardStore := smocks.NewMockRewardStore(ctrl) + ammSvc := mocks.NewMockAMMService(ctrl) + + apiService := api.TradingDataServiceV2{ + MarketsService: service.NewMarkets(marketStore), + RewardService: service.NewReward(rewardStore, logging.NewTestLogger()), + AMMPoolService: ammSvc, + } + + ctx := context.Background() + + t.Run("without party id", func(t *testing.T) { + req := &v2.ListRewardSummariesRequest{ + AssetId: ptr.From("asset1"), + } + + expect := []entities.RewardSummary{ + { + PartyID: entities.PartyID("random-party"), + AssetID: entities.AssetID(*req.AssetId), + Amount: num.NewDecimalFromFloat(200), + }, + } + + rewardStore.EXPECT().GetSummaries(ctx, []string{}, req.AssetId). + Times(1).Return(expect, nil) + + resp, err := apiService.ListRewardSummaries(ctx, req) + require.NoError(t, err) + require.Len(t, resp.Summaries, 1) + require.Equal(t, expect[0].ToProto(), resp.Summaries[0]) + }) + + t.Run("with derived keys without party", func(t *testing.T) { + req := &v2.ListRewardSummariesRequest{ + AssetId: ptr.From("asset1"), + IncludeDerivedParties: ptr.From(true), + } + + expect := []entities.RewardSummary{ + { + PartyID: entities.PartyID("random-party"), + AssetID: entities.AssetID(*req.AssetId), + Amount: num.NewDecimalFromFloat(200), + }, + } + + ammSvc.EXPECT().GetSubKeysForParties(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return(nil, nil) + rewardStore.EXPECT().GetSummaries(ctx, []string{}, req.AssetId). + Times(1).Return(expect, nil) + + resp, err := apiService.ListRewardSummaries(ctx, req) + require.NoError(t, err) + require.Len(t, resp.Summaries, 1) + require.Equal(t, expect[0].ToProto(), resp.Summaries[0]) + }) + + t.Run("without derived keys with party", func(t *testing.T) { + req := &v2.ListRewardSummariesRequest{ + PartyId: ptr.From("90421f905ab72919671caca4ffb891ba8b253a4d506e1c0223745268edf4416d"), + AssetId: ptr.From("asset1"), + } + + expect := []entities.RewardSummary{ + { + PartyID: entities.PartyID(*req.PartyId), + AssetID: entities.AssetID(*req.AssetId), + Amount: num.NewDecimalFromFloat(200), + }, + } + + rewardStore.EXPECT().GetSummaries(ctx, []string{*req.PartyId}, req.AssetId). + Times(1).Return(expect, nil) + + resp, err := apiService.ListRewardSummaries(ctx, req) + require.NoError(t, err) + require.Len(t, resp.Summaries, 1) + require.Equal(t, expect[0].ToProto(), resp.Summaries[0]) + }) + + t.Run("with derived keys and party", func(t *testing.T) { + req := &v2.ListRewardSummariesRequest{ + PartyId: ptr.From("90421f905ab72919671caca4ffb891ba8b253a4d506e1c0223745268edf4416d"), + AssetId: ptr.From("asset1"), + IncludeDerivedParties: ptr.From(true), + } + + expect := []entities.RewardSummary{ + { + PartyID: entities.PartyID(*req.PartyId), + AssetID: entities.AssetID(*req.AssetId), + Amount: num.NewDecimalFromFloat(200), + }, + { + PartyID: entities.PartyID("653f9a9850852ca541f20464893536e7986be91c4c364788f6d273fb452778ba"), + AssetID: entities.AssetID(*req.AssetId), + Amount: num.NewDecimalFromFloat(150), + }, + { + PartyID: entities.PartyID("35c2dc44b391a5f27ace705b554cd78ba42412c3d2597ceba39642f49ebf5d2b"), + AssetID: entities.AssetID(*req.AssetId), + Amount: num.NewDecimalFromFloat(130), + }, + } + + ammSvc.EXPECT().GetSubKeysForParties(gomock.Any(), gomock.Any(), gomock.Any()).Times(1).Return([]string{ + "653f9a9850852ca541f20464893536e7986be91c4c364788f6d273fb452778ba", + "35c2dc44b391a5f27ace705b554cd78ba42412c3d2597ceba39642f49ebf5d2b", + }, nil) + + rewardStore.EXPECT().GetSummaries(ctx, gomock.Any(), req.AssetId). + Do(func(_ context.Context, gotPartyIDs []string, _ *string) { + var expectPartyIDs []string + for _, e := range expect { + expectPartyIDs = append(expectPartyIDs, e.PartyID.String()) + } + + slices.Sort(expectPartyIDs) + slices.Sort(gotPartyIDs) + require.Zero(t, slices.Compare(expectPartyIDs, gotPartyIDs)) + }).Times(1).Return(expect, nil) + + resp, err := apiService.ListRewardSummaries(ctx, req) + require.NoError(t, err) + require.Len(t, resp.Summaries, 3) + require.Equal(t, expect[0].ToProto(), resp.Summaries[0]) + require.Equal(t, expect[1].ToProto(), resp.Summaries[1]) + require.Equal(t, expect[2].ToProto(), resp.Summaries[2]) + }) +} + //nolint:unparam func floatToStringWithDp(value float64, dp int) string { return fmt.Sprintf("%f", value*math.Pow10(dp)) @@ -942,3 +1485,62 @@ func getMarketOrderNotional(marketObservable float64, orders []*v2.OrderInfo, pr } return notional } + +type mockObserveAccountServer struct { + mockServerStream + send func(*v2.ObserveAccountsResponse) error +} + +func (m mockObserveAccountServer) Send(resp *v2.ObserveAccountsResponse) error { + if m.send != nil { + return m.send(resp) + } + return nil +} + +type mockServerStream struct { + ctx context.Context + recvMsg func(m interface{}) error + sendMsg func(m interface{}) error + setHeader func(md metadata.MD) error + sendHeader func(md metadata.MD) error + setTrailer func(md metadata.MD) +} + +func (m mockServerStream) Context() context.Context { + return m.ctx +} + +func (m mockServerStream) SendMsg(msg interface{}) error { + if m.sendMsg != nil { + return m.sendMsg(msg) + } + return nil +} + +func (m mockServerStream) RecvMsg(msg interface{}) error { + if m.recvMsg != nil { + return m.recvMsg(msg) + } + return nil +} + +func (m mockServerStream) SetHeader(md metadata.MD) error { + if m.setHeader != nil { + return m.setHeader(md) + } + return nil +} + +func (m mockServerStream) SendHeader(md metadata.MD) error { + if m.sendHeader != nil { + return m.sendHeader(md) + } + return nil +} + +func (m mockServerStream) SetTrailer(md metadata.MD) { + if m.setTrailer != nil { + m.setTrailer(md) + } +} diff --git a/datanode/api/trading_test.go b/datanode/api/trading_test.go index d0f2c6c6b57..4fd6399d708 100644 --- a/datanode/api/trading_test.go +++ b/datanode/api/trading_test.go @@ -18,7 +18,6 @@ package api_test import ( "context" "fmt" - "io" "net" "testing" "time" @@ -40,8 +39,6 @@ import ( "github.com/golang/mock/gomock" "github.com/golang/protobuf/proto" - "github.com/jackc/pgconn" - "github.com/jackc/pgx/v4" "github.com/pkg/errors" "github.com/stretchr/testify/assert" "google.golang.org/grpc" @@ -98,9 +95,8 @@ func getTestGRPCServer(t *testing.T, ctx context.Context) (tidy func(), conn *gr conf.CandlesV2.CandleStore.DefaultCandleIntervals = "" - sqlConn := &sqlstore.ConnectionSource{ - Connection: dummyConnection{}, - } + sqlConn := &sqlstore.ConnectionSource{} + sqlConn.ToggleTest() // ensure calls to query and copyTo do not fail bro, err := broker.New(ctx, logging.NewTestLogger(), conf.Broker, "", eventSource) if err != nil { @@ -143,7 +139,6 @@ func getTestGRPCServer(t *testing.T, ctx context.Context) (tidy func(), conn *gr sqlKeyRotationsService := service.NewKeyRotations(sqlstore.NewKeyRotations(sqlConn)) sqlEthereumKeyRotationService := service.NewEthereumKeyRotation(sqlstore.NewEthereumKeyRotations(sqlConn), logger) sqlNodeService := service.NewNode(sqlstore.NewNode(sqlConn)) - sqlMarketDepthService := service.NewMarketDepth(sqlOrderService, logger) sqlLedgerService := service.NewLedger(sqlstore.NewLedger(sqlConn), logger) sqlProtocolUpgradeService := service.NewProtocolUpgrade(sqlstore.NewProtocolUpgradeProposals(sqlConn), logger) sqlCoreSnapshotService := service.NewSnapshotData(sqlstore.NewCoreSnapshotData(sqlConn)) @@ -165,6 +160,9 @@ 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)) + gameScoreService := service.NewGameScore(sqlstore.NewGameScores(sqlConn), logger) + ammPoolsService := service.NewAMMPools(sqlstore.NewAMMPools(sqlConn)) + sqlMarketDepthService := service.NewMarketDepth(service.NewDefaultConfig().MarketDepth, sqlOrderService, ammPoolsService, nil, nil, nil, nil, logger) g := api.NewGRPCServer( logger, @@ -225,6 +223,8 @@ func getTestGRPCServer(t *testing.T, ctx context.Context) (tidy func(), conn *gr gameService, marginModesService, timeWeightedNotionPositionService, + gameScoreService, + ammPoolsService, ) if g == nil { err = fmt.Errorf("failed to create gRPC server") @@ -253,18 +253,6 @@ func getTestGRPCServer(t *testing.T, ctx context.Context) (tidy func(), conn *gr return tidy, conn, mockCoreServiceClient, err } -type dummyConnection struct { - sqlstore.Connection -} - -func (d dummyConnection) Query(context.Context, string, ...interface{}) (pgx.Rows, error) { - return nil, pgx.ErrNoRows -} - -func (d dummyConnection) CopyTo(context.Context, io.Writer, string, ...any) (pgconn.CommandTag, error) { - return pgconn.CommandTag{}, nil -} - func TestSubmitTransaction(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() diff --git a/datanode/broker/convert.go b/datanode/broker/convert.go index 3b21289d6ff..dde445330f9 100644 --- a/datanode/broker/convert.go +++ b/datanode/broker/convert.go @@ -196,6 +196,10 @@ 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_GAME_SCORES: + return events.GameScoresEventFromStream(ctx, be) + case eventspb.BusEventType_BUS_EVENT_TYPE_AMM: + return events.AMMPoolEventFromStream(ctx, be) } return nil diff --git a/datanode/broker/sqlstore_broker.go b/datanode/broker/sqlstore_broker.go index 5b4b373bbbe..4fba4e607de 100644 --- a/datanode/broker/sqlstore_broker.go +++ b/datanode/broker/sqlstore_broker.go @@ -18,7 +18,6 @@ package broker import ( "context" "fmt" - "reflect" "time" "code.vegaprotocol.io/vega/core/events" @@ -34,6 +33,7 @@ type SQLBrokerSubscriber interface { Flush(ctx context.Context) error Push(ctx context.Context, val events.Event) error Types() []events.Type + Name() string } type SQLStoreEventBroker interface { @@ -126,7 +126,7 @@ func (b *SQLStoreBroker) Receive(ctx context.Context) error { return err } - dbContext, err := b.transactionManager.WithConnection(context.Background()) + dbContext, err := b.transactionManager.WithConnection(ctx) if err != nil { return err } @@ -228,14 +228,6 @@ func (b *SQLStoreBroker) processBlock(ctx context.Context, dbContext context.Con betweenBlocks := false refreshMaterializedViews := false for { - // Do a pre-check on ctx.Done() since select() cases are randomized, this reduces - // the number of things we'll keep trying to handle after we are cancelled. - select { - case <-ctx.Done(): - return nil, ctx.Err() - default: - } - blockTimer.stopTimer() select { case <-ctx.Done(): @@ -325,8 +317,7 @@ func (b *SQLStoreBroker) processBlock(ctx context.Context, dbContext context.Con func (b *SQLStoreBroker) flushAllSubscribers(blockCtx context.Context) error { for _, subscriber := range b.subscribers { - subName := reflect.TypeOf(subscriber).Elem().Name() - timer := metrics.NewTimeCounter(subName) + timer := metrics.NewTimeCounter(subscriber.Name()) err := subscriber.Flush(blockCtx) timer.FlushTimeCounterAdd() if err != nil { @@ -367,8 +358,7 @@ func (b *SQLStoreBroker) handleEvent(ctx context.Context, e events.Event) error } func (b *SQLStoreBroker) push(ctx context.Context, sub SQLBrokerSubscriber, e events.Event) error { - subName := reflect.TypeOf(sub).Elem().Name() - timer := metrics.NewTimeCounter("sql", subName, e.Type().String()) + timer := metrics.NewTimeCounter("sql", sub.Name(), e.Type().String()) err := sub.Push(ctx, e) timer.EventTimeCounterAdd() diff --git a/datanode/broker/sqlstore_broker_test.go b/datanode/broker/sqlstore_broker_test.go index ab7f8096108..f09e58409e9 100644 --- a/datanode/broker/sqlstore_broker_test.go +++ b/datanode/broker/sqlstore_broker_test.go @@ -584,6 +584,10 @@ func (t *testSQLBrokerSubscriber) Types() []events.Type { return []events.Type{t.eventType} } +func (_ *testSQLBrokerSubscriber) Name() string { + return "testSQLBrokerSubscriber" +} + type blockEventSource struct { vegaTime time.Time blockHeight uint64 diff --git a/datanode/entities/account_balance.go b/datanode/entities/account_balance.go index e562dbca5e4..9f7b7058445 100644 --- a/datanode/entities/account_balance.go +++ b/datanode/entities/account_balance.go @@ -42,9 +42,27 @@ func (ab AccountBalance) ToProto() *v2.AccountBalance { } } -func (ab AccountBalance) ToProtoEdge(_ ...any) (*v2.AccountEdge, error) { +func (ab AccountBalance) ToProtoWithParent(parentPartyID *string) *v2.AccountBalance { + proto := ab.ToProto() + proto.ParentPartyId = parentPartyID + return proto +} + +func (ab AccountBalance) ToProtoEdge(args ...any) (*v2.AccountEdge, error) { + var parentPartyID *string + if len(args) > 0 { + perPartyDerivedKey, ok := args[0].(map[string]string) + if !ok { + return nil, fmt.Errorf("expected argument of type map[string]string, got %T", args[0]) + } + + if party, isDerivedKey := perPartyDerivedKey[ab.PartyID.String()]; isDerivedKey { + parentPartyID = &party + } + } + return &v2.AccountEdge{ - Node: ab.ToProto(), + Node: ab.ToProtoWithParent(parentPartyID), Cursor: ab.Cursor().Encode(), }, nil } diff --git a/datanode/entities/amm_pool.go b/datanode/entities/amm_pool.go new file mode 100644 index 00000000000..ce7eae4ebce --- /dev/null +++ b/datanode/entities/amm_pool.go @@ -0,0 +1,262 @@ +// 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" + "code.vegaprotocol.io/vega/libs/ptr" + 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 { + ID AMMPoolID + PartyID PartyID + MarketID MarketID + AmmPartyID PartyID + Commitment num.Decimal + Status AMMStatus + StatusReason AMMStatusReason + ParametersBase num.Decimal + ParametersLowerBound *num.Decimal + ParametersUpperBound *num.Decimal + ParametersLeverageAtLowerBound *num.Decimal + ParametersLeverageAtUpperBound *num.Decimal + ProposedFee *num.Decimal + CreatedAt time.Time + LastUpdated time.Time + LowerVirtualLiquidity num.Decimal + LowerTheoreticalPosition num.Decimal + UpperVirtualLiquidity num.Decimal + UpperTheoreticalPosition num.Decimal +} + +type AMMPoolsFilter interface { + *PartyID | *MarketID | *AMMPoolID | *AMMStatus + + // 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.AMM, vegaTime time.Time) (AMMPool, error) { + var ( + parametersBase, + commitment num.Decimal + parametersLowerBound, + parametersUpperBound, fee *num.Decimal + err error + ) + partyID := PartyID(pool.PartyId) + marketID := MarketID(pool.MarketId) + poolID := AMMPoolID(pool.Id) + ammPartyID := PartyID(pool.AmmPartyId) + status := AMMStatus(pool.Status) + statusReason := AMMStatusReason(pool.StatusReason) + + params := pool.Parameters + if params == nil { + return AMMPool{}, fmt.Errorf("missing AMM parameters") + } + + if commitment, err = num.DecimalFromString(pool.Commitment); err != nil { + return AMMPool{}, err + } + + if parametersBase, err = num.DecimalFromString(params.Base); err != nil { + return AMMPool{}, err + } + + if params.LowerBound != nil { + v, err := num.DecimalFromString(*params.LowerBound) + if err != nil { + return AMMPool{}, err + } + parametersLowerBound = &v + } + + if params.UpperBound != nil { + v, err := num.DecimalFromString(*params.UpperBound) + if err != nil { + return AMMPool{}, err + } + parametersUpperBound = &v + } + + var lowerLeverage, upperLeverage *num.Decimal + if pool.Parameters.LeverageAtLowerBound != nil { + v, err := num.DecimalFromString(*pool.Parameters.LeverageAtLowerBound) + if err != nil { + return AMMPool{}, err + } + lowerLeverage = &v + } + + if pool.Parameters.LeverageAtUpperBound != nil { + v, err := num.DecimalFromString(*pool.Parameters.LeverageAtUpperBound) + if err != nil { + return AMMPool{}, err + } + upperLeverage = &v + } + + if len(pool.ProposedFee) > 0 { + fd, err := num.DecimalFromString(pool.ProposedFee) + if err != nil { + return AMMPool{}, err + } + fee = &fd + } + + var lowerL, upperL, lowerPv, upperPv num.Decimal + if pool.LowerCurve != nil { + lowerL, err = num.DecimalFromString(pool.LowerCurve.VirtualLiquidity) + if err != nil { + return AMMPool{}, err + } + + lowerPv, err = num.DecimalFromString(pool.LowerCurve.TheoreticalPosition) + if err != nil { + return AMMPool{}, err + } + } + + if pool.UpperCurve != nil { + upperL, err = num.DecimalFromString(pool.UpperCurve.VirtualLiquidity) + if err != nil { + return AMMPool{}, err + } + + upperPv, err = num.DecimalFromString(pool.UpperCurve.TheoreticalPosition) + if err != nil { + return AMMPool{}, err + } + } + + return AMMPool{ + PartyID: partyID, + MarketID: marketID, + ID: poolID, + AmmPartyID: ammPartyID, + Commitment: commitment, + Status: status, + StatusReason: statusReason, + ParametersBase: parametersBase, + ParametersLowerBound: parametersLowerBound, + ParametersUpperBound: parametersUpperBound, + ParametersLeverageAtLowerBound: lowerLeverage, + ParametersLeverageAtUpperBound: upperLeverage, + ProposedFee: fee, + CreatedAt: vegaTime, + LastUpdated: vegaTime, + LowerVirtualLiquidity: lowerL, + LowerTheoreticalPosition: lowerPv, + UpperVirtualLiquidity: upperL, + UpperTheoreticalPosition: upperPv, + }, nil +} + +func (p AMMPool) ToProto() *eventspb.AMM { + var lowerBound, upperBound, lowerLeverage, upperLeverage *string + var fee string + + if p.ParametersLowerBound != nil { + lowerBound = ptr.From(p.ParametersLowerBound.String()) + } + + if p.ParametersUpperBound != nil { + upperBound = ptr.From(p.ParametersUpperBound.String()) + } + + if p.ParametersLeverageAtLowerBound != nil { + lowerLeverage = ptr.From(p.ParametersLeverageAtLowerBound.String()) + } + + if p.ParametersLeverageAtUpperBound != nil { + upperLeverage = ptr.From(p.ParametersLeverageAtUpperBound.String()) + } + if p.ProposedFee != nil { + fee = p.ProposedFee.String() + } + + return &eventspb.AMM{ + PartyId: p.PartyID.String(), + MarketId: p.MarketID.String(), + Id: p.ID.String(), + AmmPartyId: p.AmmPartyID.String(), + Commitment: p.Commitment.String(), + Status: eventspb.AMM_Status(p.Status), + StatusReason: eventspb.AMM_StatusReason(p.StatusReason), + ProposedFee: fee, + Parameters: &eventspb.AMM_ConcentratedLiquidityParameters{ + Base: p.ParametersBase.String(), + LowerBound: lowerBound, + UpperBound: upperBound, + LeverageAtLowerBound: lowerLeverage, + LeverageAtUpperBound: upperLeverage, + }, + } +} + +type AMMPoolCursor struct { + CreatedAt time.Time + PartyID PartyID + MarketID MarketID + ID AMMPoolID + AMMPartyID PartyID +} + +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, + ID: p.ID, + AMMPartyID: p.AmmPartyID, + } + return NewCursor(pc.String()) +} + +func (p AMMPool) ToProtoEdge(_ ...any) (*v2.AMMEdge, error) { + return &v2.AMMEdge{ + Node: p.ToProto(), + Cursor: p.Cursor().Encode(), + }, nil +} diff --git a/datanode/entities/entities.go b/datanode/entities/entities.go index 801b49f361c..e9e6fa2af27 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 | GamePartyScore | GameTeamScore | AMMPool } type PagedEntity[T proto.Message] interface { diff --git a/datanode/entities/enums.go b/datanode/entities/enums.go index eb3474a46fa..62479ddfe32 100644 --- a/datanode/entities/enums.go +++ b/datanode/entities/enums.go @@ -388,6 +388,7 @@ const ( MarketTradingModeMonitoringAuction = MarketTradingMode(vega.Market_TRADING_MODE_MONITORING_AUCTION) MarketTradingModeNoTrading = MarketTradingMode(vega.Market_TRADING_MODE_NO_TRADING) MarketTradingModeSuspendedViaGovernance = MarketTradingMode(vega.Market_TRADING_MODE_SUSPENDED_VIA_GOVERNANCE) + MarketTradingModelLongBlockAuction = MarketTradingMode(vega.Market_TRADING_MODE_LONG_BLOCK_AUCTION) ) func (m MarketTradingMode) EncodeText(_ *pgtype.ConnInfo, buf []byte) ([]byte, error) { @@ -1065,6 +1066,72 @@ func (m *MarginMode) DecodeText(_ *pgtype.ConnInfo, src []byte) error { return nil } +type AMMStatus eventspb.AMM_Status + +const ( + AMMStatusUnspecified = AMMStatus(eventspb.AMM_STATUS_UNSPECIFIED) + AMMStatusActive = AMMStatus(eventspb.AMM_STATUS_ACTIVE) + AMMStatusRejected = AMMStatus(eventspb.AMM_STATUS_REJECTED) + AMMStatusCancelled = AMMStatus(eventspb.AMM_STATUS_CANCELLED) + AMMStatusStopped = AMMStatus(eventspb.AMM_STATUS_STOPPED) + AMMStatusReduceOnly = AMMStatus(eventspb.AMM_STATUS_REDUCE_ONLY) +) + +func (s AMMStatus) EncodeText(_ *pgtype.ConnInfo, buf []byte) ([]byte, error) { + status, ok := eventspb.AMM_Status_name[int32(s)] + if !ok { + return buf, fmt.Errorf("unknown AMM pool status: %v", s) + } + return append(buf, []byte(status)...), nil +} + +func (s *AMMStatus) DecodeText(_ *pgtype.ConnInfo, src []byte) error { + val, ok := eventspb.AMM_Status_value[string(src)] + if !ok { + return fmt.Errorf("unknown AMM pool status: %s", src) + } + *s = AMMStatus(val) + return nil +} + +func (s *AMMStatus) 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 AMMStatusReason eventspb.AMM_StatusReason + +const ( + AMMStatusReasonUnspecified = AMMStatusReason(eventspb.AMM_STATUS_REASON_UNSPECIFIED) + AMMStatusReasonCancelledByParty = AMMStatusReason(eventspb.AMM_STATUS_REASON_CANCELLED_BY_PARTY) + AMMStatusReasonCannotFillCommitment = AMMStatusReason(eventspb.AMM_STATUS_REASON_CANNOT_FILL_COMMITMENT) + AMMStatusReasonPartyAlreadyOwnsAPool = AMMStatusReason(eventspb.AMM_STATUS_REASON_PARTY_ALREADY_OWNS_AMM_FOR_MARKET) + AMMStatusReasonPartyClosedOut = AMMStatusReason(eventspb.AMM_STATUS_REASON_PARTY_CLOSED_OUT) + AMMStatusReasonMarketClosed = AMMStatusReason(eventspb.AMM_STATUS_REASON_MARKET_CLOSED) + AMMStatusReasonCommitmentTooLow = AMMStatusReason(eventspb.AMM_STATUS_REASON_COMMITMENT_TOO_LOW) + AMMStatusReasonCannotRebase = AMMStatusReason(eventspb.AMM_STATUS_REASON_CANNOT_REBASE) +) + +func (s AMMStatusReason) EncodeText(_ *pgtype.ConnInfo, buf []byte) ([]byte, error) { + status, ok := eventspb.AMM_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 *AMMStatusReason) DecodeText(_ *pgtype.ConnInfo, src []byte) error { + val, ok := eventspb.AMM_StatusReason_value[string(src)] + if !ok { + return fmt.Errorf("unknown AMM pool status reason: %s", src) + } + *s = AMMStatusReason(val) + return nil +} + type ProtoEnum interface { GetEnums() map[int32]string } diff --git a/datanode/entities/game_scores.go b/datanode/entities/game_scores.go new file mode 100644 index 00000000000..944eff9b488 --- /dev/null +++ b/datanode/entities/game_scores.go @@ -0,0 +1,217 @@ +// 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" + + "github.com/shopspring/decimal" +) + +type GamePartyScore struct { + GameID GameID + TeamID *TeamID + EpochID int64 + PartyID PartyID + Score decimal.Decimal + StakingBalance decimal.Decimal + OpenVolume decimal.Decimal + TotalFeesPaid decimal.Decimal + IsEligible bool + Rank *uint64 + VegaTime time.Time +} + +func (pgs GamePartyScore) ToProto() *eventspb.GamePartyScore { + var teamID *string + if pgs.TeamID != nil { + tid := pgs.TeamID.String() + teamID = &tid + } + return &eventspb.GamePartyScore{ + GameId: pgs.GameID.String(), + Party: pgs.PartyID.String(), + Epoch: pgs.EpochID, + TeamId: teamID, + Score: pgs.Score.String(), + StakingBalance: pgs.StakingBalance.String(), + OpenVolume: pgs.OpenVolume.String(), + TotalFeesPaid: pgs.TotalFeesPaid.String(), + IsEligible: pgs.IsEligible, + Rank: pgs.Rank, + Time: pgs.VegaTime.UnixNano(), + } +} + +type GameTeamScore struct { + GameID GameID + TeamID TeamID + EpochID int64 + Score decimal.Decimal + VegaTime time.Time +} + +func (pgs GameTeamScore) ToProto() *eventspb.GameTeamScore { + return &eventspb.GameTeamScore{ + GameId: pgs.GameID.String(), + Epoch: pgs.EpochID, + TeamId: pgs.TeamID.String(), + Score: pgs.Score.String(), + Time: pgs.VegaTime.UnixNano(), + } +} + +func GameScoresFromProto(gs *eventspb.GameScores, txHash TxHash, vegaTime time.Time, seqNum uint64) ([]GameTeamScore, []GamePartyScore, error) { + ts := make([]GameTeamScore, 0, len(gs.TeamScores)) + ps := []GamePartyScore{} + for _, gsTeam := range gs.TeamScores { + score, err := num.DecimalFromString(gsTeam.Score) + if err != nil { + return nil, nil, err + } + ts = append(ts, GameTeamScore{ + GameID: (ID[_Game])(gsTeam.GameId), + TeamID: ID[_Team](gsTeam.TeamId), + EpochID: gsTeam.Epoch, + Score: score, + VegaTime: vegaTime, + }) + } + for _, gsParty := range gs.PartyScores { + score, err := num.DecimalFromString(gsParty.Score) + if err != nil { + return nil, nil, err + } + var stakingBalance num.Decimal + if len(gsParty.StakingBalance) > 0 { + stakingBalance, err = num.DecimalFromString(gsParty.StakingBalance) + if err != nil { + return nil, nil, err + } + } + var openVolume num.Decimal + if len(gsParty.OpenVolume) > 0 { + openVolume, err = num.DecimalFromString(gsParty.OpenVolume) + if err != nil { + return nil, nil, err + } + } + var totalFeesPaid num.Decimal + if len(gsParty.TotalFeesPaid) > 0 { + totalFeesPaid, err = num.DecimalFromString(gsParty.TotalFeesPaid) + if err != nil { + return nil, nil, err + } + } + ps = append(ps, GamePartyScore{ + GameID: (ID[_Game])(gsParty.GameId), + EpochID: gsParty.Epoch, + PartyID: ID[_Party](gsParty.Party), + Score: score, + StakingBalance: stakingBalance, + OpenVolume: openVolume, + TotalFeesPaid: totalFeesPaid, + IsEligible: gsParty.IsEligible, + VegaTime: vegaTime, + }) + } + + return ts, ps, nil +} + +func (pgs GamePartyScore) Cursor() *Cursor { + cursor := PartyGameScoreCursor{ + GameID: pgs.GameID.String(), + PartyID: pgs.PartyID.String(), + EpochID: pgs.EpochID, + VegaTime: pgs.VegaTime, + } + return NewCursor(cursor.String()) +} + +func (pgs GamePartyScore) ToProtoEdge(_ ...any) (*v2.GamePartyScoresEdge, error) { + return &v2.GamePartyScoresEdge{ + Node: pgs.ToProto(), + Cursor: pgs.Cursor().Encode(), + }, nil +} + +func (pgs GameTeamScore) Cursor() *Cursor { + cursor := TeamGameScoreCursor{ + GameID: pgs.GameID.String(), + TeamID: pgs.TeamID.String(), + EpochID: pgs.EpochID, + VegaTime: pgs.VegaTime, + } + return NewCursor(cursor.String()) +} + +func (pgs GameTeamScore) ToProtoEdge(_ ...any) (*v2.GameTeamScoresEdge, error) { + return &v2.GameTeamScoresEdge{ + Node: pgs.ToProto(), + Cursor: pgs.Cursor().Encode(), + }, nil +} + +type PartyGameScoreCursor struct { + GameID string `json:"game_id"` + PartyID string `json:"party_id"` + EpochID int64 `json:"epoch_id"` + VegaTime time.Time `json:"vega_time"` +} + +func (pg PartyGameScoreCursor) String() string { + bs, err := json.Marshal(pg) + if err != nil { + panic(fmt.Errorf("marshalling party game cursor: %w", err)) + } + return string(bs) +} + +func (pg *PartyGameScoreCursor) Parse(cursorString string) error { + if cursorString == "" { + return nil + } + return json.Unmarshal([]byte(cursorString), pg) +} + +type TeamGameScoreCursor struct { + GameID string `json:"game_id"` + TeamID string `json:"team_id"` + EpochID int64 `json:"epoch_id"` + VegaTime time.Time `json:"vega_time"` +} + +func (pg TeamGameScoreCursor) String() string { + bs, err := json.Marshal(pg) + if err != nil { + panic(fmt.Errorf("marshalling team game score cursor: %w", err)) + } + return string(bs) +} + +func (pg *TeamGameScoreCursor) Parse(cursorString string) error { + if cursorString == "" { + return nil + } + return json.Unmarshal([]byte(cursorString), pg) +} 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/entities/market.go b/datanode/entities/market.go index dba19da6030..122317cac84 100644 --- a/datanode/entities/market.go +++ b/datanode/entities/market.go @@ -35,6 +35,14 @@ type _Market struct{} type MarketID = ID[_Market] +func NewMarketIDSlice(ids ...string) []MarketID { + res := make([]MarketID, 0, len(ids)) + for _, v := range ids { + res = append(res, MarketID(v)) + } + return res +} + type Market struct { ID MarketID TxHash TxHash @@ -62,6 +70,19 @@ type Market struct { LiquidationStrategy LiquidationStrategy MarkPriceConfiguration *CompositePriceConfiguration TickSize *decimal.Decimal + EnableTXReordering bool +} + +func (m *Market) HasCap() (cap *vega.FutureCap, hasCap bool) { + if inst := m.TradableInstrument.Instrument; inst != nil { + if fut := inst.GetFuture(); fut != nil { + if cap := fut.GetCap(); cap != nil { + return cap, true + } + } + } + + return nil, false } type MarketCursor struct { @@ -205,6 +226,7 @@ func NewMarketFromProto(market *vega.Market, txHash TxHash, vegaTime time.Time) LiquidationStrategy: liqStrat, MarkPriceConfiguration: mpc, TickSize: &tickSize, + EnableTXReordering: market.EnableTransactionReordering, }, nil } @@ -271,6 +293,7 @@ func (m Market) ToProto() *vega.Market { LiquidationStrategy: m.LiquidationStrategy.IntoProto(), MarkPriceConfiguration: m.MarkPriceConfiguration.CompositePriceConfiguration, TickSize: m.TickSize.String(), + EnableTransactionReordering: m.EnableTXReordering, } } diff --git a/datanode/entities/market_depth.go b/datanode/entities/market_depth.go index 96b6d32cbd1..7ae98f2ca30 100644 --- a/datanode/entities/market_depth.go +++ b/datanode/entities/market_depth.go @@ -31,6 +31,10 @@ type PriceLevel struct { TotalOrders uint64 // How much volume is at this level TotalVolume uint64 + // How much volume from AMM's are at this level + TotalAMMVolume uint64 + // How much estimated volume from AMM's are at this level + TotalEstimatedAMMVolume uint64 // What side of the book is this level Side types.Side } @@ -69,17 +73,21 @@ func (md *MarketDepth) ToProto(limit uint64) *vega.MarketDepth { // Copy the data across for index, pl := range md.BuySide[:buyLimit] { buyPtr[index] = &types.PriceLevel{ - Volume: pl.TotalVolume, - NumberOfOrders: pl.TotalOrders, - Price: pl.Price.Clone(), + Volume: pl.TotalVolume, + NumberOfOrders: pl.TotalOrders, + Price: pl.Price.Clone(), + AMMVolume: pl.TotalAMMVolume, + AMMVolumeEstimated: pl.TotalEstimatedAMMVolume, } } for index, pl := range md.SellSide[:sellLimit] { sellPtr[index] = &types.PriceLevel{ - Volume: pl.TotalVolume, - NumberOfOrders: pl.TotalOrders, - Price: pl.Price.Clone(), + Volume: pl.TotalVolume, + NumberOfOrders: pl.TotalOrders, + Price: pl.Price.Clone(), + AMMVolume: pl.TotalAMMVolume, + AMMVolumeEstimated: pl.TotalEstimatedAMMVolume, } } @@ -91,7 +99,11 @@ func (md *MarketDepth) ToProto(limit uint64) *vega.MarketDepth { } } -func (md *MarketDepth) AddOrderUpdate(order *types.Order) { +func (md *MarketDepth) AddAMMOrder(order *types.Order, estimated bool) { + md.addOrder(order, estimated) +} + +func (md *MarketDepth) AddOrderUpdate(order *types.Order, estimated bool) { // Do we know about this order already? originalOrder := md.orderExists(order.ID) if originalOrder != nil { @@ -103,13 +115,13 @@ func (md *MarketDepth) AddOrderUpdate(order *types.Order) { order.Status == types.OrderStatusPartiallyFilled || order.Status == types.OrderStatusRejected || order.Status == types.OrderStatusParked { - md.removeOrder(originalOrder) + md.removeOrder(originalOrder, estimated) } else { md.updateOrder(originalOrder, order) } } else { if order.TrueRemaining() > 0 && order.Status == types.OrderStatusActive { - md.addOrder(order) + md.addOrder(order, estimated) } } } @@ -118,7 +130,7 @@ func (md *MarketDepth) orderExists(orderID string) *types.Order { return md.LiveOrders[orderID] } -func (md *MarketDepth) addOrder(order *types.Order) { +func (md *MarketDepth) addOrder(order *types.Order, estimated bool) { // Cache the orderID orderCopy := order.Clone() md.LiveOrders[order.ID] = orderCopy @@ -127,7 +139,13 @@ func (md *MarketDepth) addOrder(order *types.Order) { pl := md.GetPriceLevel(order.Side, order.Price) if pl == nil { - pl = md.createNewPriceLevel(order) + pl = md.createNewPriceLevel(order, estimated) + } else if order.GeneratedOffbook { + if estimated { + pl.TotalEstimatedAMMVolume += order.TrueRemaining() + } else { + pl.TotalAMMVolume += order.TrueRemaining() + } } else { pl.TotalOrders++ pl.TotalVolume += order.TrueRemaining() @@ -135,7 +153,7 @@ func (md *MarketDepth) addOrder(order *types.Order) { md.Changes = append(md.Changes, pl) } -func (md *MarketDepth) removeOrder(order *types.Order) error { +func (md *MarketDepth) removeOrder(order *types.Order, estimated bool) error { // Find the price level pl := md.GetPriceLevel(order.Side, order.Price) @@ -143,8 +161,16 @@ func (md *MarketDepth) removeOrder(order *types.Order) error { return errors.New("unknown pricelevel") } // Update the values - pl.TotalOrders-- - pl.TotalVolume -= order.TrueRemaining() + if order.GeneratedOffbook { + if estimated { + pl.TotalEstimatedAMMVolume -= order.TrueRemaining() + } else { + pl.TotalAMMVolume -= order.TrueRemaining() + } + } else { + pl.TotalOrders-- + pl.TotalVolume -= order.TrueRemaining() + } // See if we can remove this price level if pl.TotalOrders == 0 { @@ -162,7 +188,7 @@ func (md *MarketDepth) updateOrder(originalOrder, newOrder *types.Order) { // If the price is the same, we can update the original order if originalOrder.Price.EQ(newOrder.Price) { if newOrder.TrueRemaining() == 0 { - md.removeOrder(newOrder) + md.removeOrder(newOrder, false) } else { // Update pl := md.GetPriceLevel(originalOrder.Side, originalOrder.Price) @@ -175,19 +201,28 @@ func (md *MarketDepth) updateOrder(originalOrder, newOrder *types.Order) { md.Changes = append(md.Changes, pl) } } else { - md.removeOrder(originalOrder) + md.removeOrder(originalOrder, false) if newOrder.TrueRemaining() > 0 { - md.addOrder(newOrder) + md.addOrder(newOrder, false) } } } -func (md *MarketDepth) createNewPriceLevel(order *types.Order) *PriceLevel { +func (md *MarketDepth) createNewPriceLevel(order *types.Order, estimated bool) *PriceLevel { pl := &PriceLevel{ - Price: order.Price.Clone(), - TotalOrders: 1, - TotalVolume: order.TrueRemaining(), - Side: order.Side, + Price: order.Price.Clone(), + Side: order.Side, + } + + if order.GeneratedOffbook { + if estimated { + pl.TotalEstimatedAMMVolume = order.TrueRemaining() + } else { + pl.TotalAMMVolume = order.TrueRemaining() + } + } else { + pl.TotalOrders = 1 + pl.TotalVolume = order.TrueRemaining() } if order.Side == types.SideBuy { diff --git a/datanode/entities/marketdata.go b/datanode/entities/marketdata.go index 4cf657e573a..e916ac65a23 100644 --- a/datanode/entities/marketdata.go +++ b/datanode/entities/marketdata.go @@ -307,7 +307,7 @@ func priceMonitoringBoundsMatches(bounds, other []*types.PriceMonitoringBounds) if bound.MinValidPrice != other[i].MinValidPrice || bound.MaxValidPrice != other[i].MaxValidPrice || - bound.ReferencePrice != other[i].ReferencePrice { + bound.ReferencePrice != other[i].ReferencePrice || bound.Active != other[i].Active { return false } diff --git a/datanode/entities/party.go b/datanode/entities/party.go index 442a4ecc0a1..fceb217e8a8 100644 --- a/datanode/entities/party.go +++ b/datanode/entities/party.go @@ -28,6 +28,14 @@ type _Party struct{} type PartyID = ID[_Party] +func NewPartyIDSlice(ids ...string) []PartyID { + res := make([]PartyID, 0, len(ids)) + for _, v := range ids { + res = append(res, PartyID(v)) + } + return res +} + type Party struct { ID PartyID TxHash TxHash diff --git a/datanode/entities/time_weighted_notional_position.go b/datanode/entities/time_weighted_notional_position.go index c4d0f398e2f..cb6be8f6a62 100644 --- a/datanode/entities/time_weighted_notional_position.go +++ b/datanode/entities/time_weighted_notional_position.go @@ -16,9 +16,9 @@ package entities import ( - "strconv" "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" ) @@ -28,12 +28,12 @@ type TimeWeightedNotionalPosition struct { AssetID AssetID PartyID PartyID GameID GameID - TimeWeightedNotionalPosition uint64 + TimeWeightedNotionalPosition num.Decimal VegaTime time.Time } func TimeWeightedNotionalPositionFromProto(event *eventspb.TimeWeightedNotionalPositionUpdated, vegaTime time.Time) (*TimeWeightedNotionalPosition, error) { - twNotionalPosition, err := strconv.ParseUint(event.TimeWeightedNotionalPosition, 10, 64) + twNotionalPosition, err := num.DecimalFromString(event.TimeWeightedNotionalPosition) if err != nil { return nil, err } @@ -53,7 +53,7 @@ func (tw *TimeWeightedNotionalPosition) ToProto() *v2.TimeWeightedNotionalPositi PartyId: tw.PartyID.String(), GameId: tw.GameID.String(), AtEpoch: tw.EpochSeq, - TimeWeightedNotionalPosition: strconv.FormatUint(tw.TimeWeightedNotionalPosition, 10), + TimeWeightedNotionalPosition: tw.TimeWeightedNotionalPosition.String(), LastUpdated: tw.VegaTime.UnixNano(), } } diff --git a/datanode/entities/vesting.go b/datanode/entities/vesting.go index 8e77b828814..232422e9357 100644 --- a/datanode/entities/vesting.go +++ b/datanode/entities/vesting.go @@ -31,11 +31,13 @@ type ( } PartyVestingStats struct { - RewardBonusMultiplier num.Decimal - QuantumBalance num.Decimal - PartyID PartyID - VegaTime time.Time - AtEpoch uint64 + RewardBonusMultiplier num.Decimal + QuantumBalance num.Decimal + SummedRewardBonusMultiplier num.Decimal + SummedQuantumBalance num.Decimal + PartyID PartyID + VegaTime time.Time + AtEpoch uint64 } ) @@ -50,13 +52,23 @@ func NewVestingStatsFromProto(vestingStatsProto *eventspb.VestingStatsUpdated, v if err != nil { return nil, fmt.Errorf("could not convert quantum balance to decimal: %w", err) } + summedMultiplier, err := num.DecimalFromString(stat.SummedRewardBonusMultiplier) + if err != nil { + return nil, fmt.Errorf("could not convert summed reward bonus multiplier to decimal: %w", err) + } + summedQuantumBalance, err := num.DecimalFromString(stat.SummedQuantumBalance) + if err != nil { + return nil, fmt.Errorf("could not convert summed quantum balance to decimal: %w", err) + } partyStats = append(partyStats, &PartyVestingStats{ - RewardBonusMultiplier: multiplier, - QuantumBalance: quantumBalance, - PartyID: PartyID(stat.PartyId), - VegaTime: vegaTime, - AtEpoch: vestingStatsProto.AtEpoch, + RewardBonusMultiplier: multiplier, + QuantumBalance: quantumBalance, + SummedRewardBonusMultiplier: summedMultiplier, + SummedQuantumBalance: summedQuantumBalance, + PartyID: PartyID(stat.PartyId), + VegaTime: vegaTime, + AtEpoch: vestingStatsProto.AtEpoch, }) } diff --git a/datanode/gateway/graphql/game_scores_resolver.go b/datanode/gateway/graphql/game_scores_resolver.go new file mode 100644 index 00000000000..9816bff0761 --- /dev/null +++ b/datanode/gateway/graphql/game_scores_resolver.go @@ -0,0 +1,47 @@ +// 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 gql + +import ( + "context" + + v1 "code.vegaprotocol.io/vega/protos/vega/events/v1" +) + +type ( + gamePartyScoresResolver VegaResolverRoot + gameTeamScoresResolver VegaResolverRoot +) + +func (g *gamePartyScoresResolver) EpochID(_ context.Context, obj *v1.GamePartyScore) (int, error) { + return int(obj.Epoch), nil +} + +func (g *gamePartyScoresResolver) PartyID(_ context.Context, obj *v1.GamePartyScore) (string, error) { + return obj.Party, nil +} + +func (g *gamePartyScoresResolver) Rank(_ context.Context, obj *v1.GamePartyScore) (*int, error) { + if obj.Rank == nil { + return nil, nil + } + rank := int(*obj.Rank) + return &rank, nil +} + +func (g *gameTeamScoresResolver) EpochID(ctx context.Context, obj *v1.GameTeamScore) (int, error) { + return int(obj.Epoch), nil +} diff --git a/datanode/gateway/graphql/generated.go b/datanode/gateway/graphql/generated.go index 9aa9598017e..c5273eddc8a 100644 --- a/datanode/gateway/graphql/generated.go +++ b/datanode/gateway/graphql/generated.go @@ -85,6 +85,8 @@ type ResolverRoot interface { Future() FutureResolver FutureProduct() FutureProductResolver Game() GameResolver + GamePartyScore() GamePartyScoreResolver + GameTeamScore() GameTeamScoreResolver IcebergOrder() IcebergOrderResolver Instrument() InstrumentResolver InstrumentConfiguration() InstrumentConfigurationResolver @@ -195,6 +197,28 @@ type DirectiveRoot struct { } type ComplexityRoot struct { + AMM struct { + AmmPartyId func(childComplexity int) int + Commitment func(childComplexity int) int + Id func(childComplexity int) int + MarketId func(childComplexity int) int + Parameters func(childComplexity int) int + PartyId func(childComplexity int) int + ProposedFee func(childComplexity int) int + Status func(childComplexity int) int + StatusReason func(childComplexity int) int + } + + AMMConnection struct { + Edges func(childComplexity int) int + PageInfo func(childComplexity int) int + } + + AMMEdge struct { + Cursor func(childComplexity int) int + Node func(childComplexity int) int + } + AbstractMarginLevels struct { Asset func(childComplexity int) int CollateralReleaseLevel func(childComplexity int) int @@ -208,11 +232,12 @@ type ComplexityRoot struct { } AccountBalance struct { - Asset func(childComplexity int) int - Balance func(childComplexity int) int - Market func(childComplexity int) int - Party func(childComplexity int) int - Type func(childComplexity int) int + Asset func(childComplexity int) int + Balance func(childComplexity int) int + Market func(childComplexity int) int + ParentPartyID func(childComplexity int) int + Party func(childComplexity int) int + Type func(childComplexity int) int } AccountDetails struct { @@ -434,6 +459,14 @@ type ComplexityRoot struct { PriceSources func(childComplexity int) int } + ConcentratedLiquidityParameters struct { + Base func(childComplexity int) int + LeverageAtLowerBound func(childComplexity int) int + LeverageAtUpperBound func(childComplexity int) int + LowerBound func(childComplexity int) int + UpperBound func(childComplexity int) int + } + Condition struct { Operator func(childComplexity int) int Value func(childComplexity int) int @@ -745,6 +778,15 @@ type ComplexityRoot struct { ReceiverAddress func(childComplexity int) int } + EstimatedAMMBounds struct { + LiquidationPriceAtLower func(childComplexity int) int + LiquidationPriceAtUpper func(childComplexity int) int + LossOnCommitmentAtLower func(childComplexity int) int + LossOnCommitmentAtUpper func(childComplexity int) int + PositionSizeAtLower func(childComplexity int) int + PositionSizeAtUpper func(childComplexity int) int + } + EstimatedTransferFee struct { Discount func(childComplexity int) int Fee func(childComplexity int) int @@ -902,6 +944,7 @@ type ComplexityRoot struct { } Future struct { + Cap func(childComplexity int) int DataSourceSpecBinding func(childComplexity int) int DataSourceSpecForSettlementData func(childComplexity int) int DataSourceSpecForTradingTermination func(childComplexity int) int @@ -909,7 +952,14 @@ type ComplexityRoot struct { SettlementAsset func(childComplexity int) int } + FutureCap struct { + BinarySettlement func(childComplexity int) int + FullyCollateralised func(childComplexity int) int + MaxPrice func(childComplexity int) int + } + FutureProduct struct { + Cap func(childComplexity int) int DataSourceSpecBinding func(childComplexity int) int DataSourceSpecForSettlementData func(childComplexity int) int DataSourceSpecForTradingTermination func(childComplexity int) int @@ -930,6 +980,48 @@ type ComplexityRoot struct { Node func(childComplexity int) int } + GamePartyScore struct { + EpochID func(childComplexity int) int + GameId func(childComplexity int) int + IsEligible func(childComplexity int) int + OpenVolume func(childComplexity int) int + PartyID func(childComplexity int) int + Rank func(childComplexity int) int + Score func(childComplexity int) int + StakingBalance func(childComplexity int) int + TeamId func(childComplexity int) int + Time func(childComplexity int) int + TotalFeesPaid func(childComplexity int) int + } + + GamePartyScoreConnection struct { + Edges func(childComplexity int) int + PageInfo func(childComplexity int) int + } + + GamePartyScoreEdge struct { + Cursor func(childComplexity int) int + Node func(childComplexity int) int + } + + GameTeamScore struct { + EpochID func(childComplexity int) int + GameId func(childComplexity int) int + Score func(childComplexity int) int + TeamId func(childComplexity int) int + Time func(childComplexity int) int + } + + GameTeamScoreConnection struct { + Edges func(childComplexity int) int + PageInfo func(childComplexity int) int + } + + GameTeamScoreEdge struct { + Cursor func(childComplexity int) int + Node func(childComplexity int) int + } + GamesConnection struct { Edges func(childComplexity int) int PageInfo func(childComplexity int) int @@ -1156,6 +1248,7 @@ type ComplexityRoot struct { LogNormalRiskModel struct { Params func(childComplexity int) int RiskAversionParameter func(childComplexity int) int + RiskFactorOverride func(childComplexity int) int Tau func(childComplexity int) int } @@ -1171,7 +1264,8 @@ type ComplexityRoot struct { } MarginCalculator struct { - ScalingFactors func(childComplexity int) int + FullyCollateralised func(childComplexity int) int + ScalingFactors func(childComplexity int) int } MarginConnection struct { @@ -1218,11 +1312,12 @@ type ComplexityRoot struct { } Market struct { - AccountsConnection func(childComplexity int, partyID *string, pagination *v2.Pagination) int + AccountsConnection func(childComplexity int, partyID *string, pagination *v2.Pagination, includeDerivedParties *bool) int CandlesConnection func(childComplexity int, since string, to *string, interval vega.Interval, pagination *v2.Pagination) int Data func(childComplexity int) int DecimalPlaces func(childComplexity int) int Depth func(childComplexity int, maxDepth *int) int + EnableTxReordering func(childComplexity int) int Fees func(childComplexity int) int Id func(childComplexity int) int InsurancePoolFraction func(childComplexity int) int @@ -1398,6 +1493,7 @@ type ComplexityRoot struct { NewMarket struct { DecimalPlaces func(childComplexity int) int + EnableTxReordering func(childComplexity int) int Instrument func(childComplexity int) int LinearSlippageFactor func(childComplexity int) int LiquidationStrategy func(childComplexity int) int @@ -1415,6 +1511,7 @@ type ComplexityRoot struct { } NewSpotMarket struct { + EnableTxReordering func(childComplexity int) int Instrument func(childComplexity int) int LiquidityFeeSettings func(childComplexity int) int LiquiditySLAParams func(childComplexity int) int @@ -1738,7 +1835,7 @@ type ComplexityRoot struct { } Party struct { - AccountsConnection func(childComplexity int, marketID *string, assetID *string, typeArg *vega.AccountType, pagination *v2.Pagination) int + AccountsConnection func(childComplexity int, marketID *string, assetID *string, typeArg *vega.AccountType, pagination *v2.Pagination, includeDerivedParties *bool) int ActivityStreak func(childComplexity int, epoch *int) int DelegationsConnection func(childComplexity int, nodeID *string, pagination *v2.Pagination) int DepositsConnection func(childComplexity int, dateRange *v2.DateRange, pagination *v2.Pagination) int @@ -1749,8 +1846,8 @@ type ComplexityRoot struct { OrdersConnection func(childComplexity int, pagination *v2.Pagination, filter *OrderByMarketIdsFilter) int PositionsConnection func(childComplexity int, market *string, pagination *v2.Pagination) int ProposalsConnection func(childComplexity int, proposalType *v2.ListGovernanceDataRequest_Type, inState *vega.Proposal_State, pagination *v2.Pagination) int - RewardSummaries func(childComplexity int, assetID *string) int - RewardsConnection func(childComplexity int, assetID *string, pagination *v2.Pagination, fromEpoch *int, toEpoch *int, teamID *string, gameID *string) int + RewardSummaries func(childComplexity int, assetID *string, includeDerivedParties *bool) int + RewardsConnection func(childComplexity int, assetID *string, pagination *v2.Pagination, fromEpoch *int, toEpoch *int, teamID *string, gameID *string, includeDerivedParties *bool, marketID *string) int StakingSummary func(childComplexity int, pagination *v2.Pagination) int TradesConnection func(childComplexity int, marketID *string, dataRange *v2.DateRange, pagination *v2.Pagination) int TransfersConnection func(childComplexity int, direction *TransferDirection, pagination *v2.Pagination, isReward *bool, fromEpoch *int, toEpoch *int, status *v1.Transfer_Status, scope *v2.ListTransfersRequest_Scope, gameID *string, fromAccountType *vega.AccountType, toAccountType *vega.AccountType) int @@ -1840,9 +1937,11 @@ type ComplexityRoot struct { } PartyVestingStats struct { - EpochSeq func(childComplexity int) int - QuantumBalance func(childComplexity int) int - RewardBonusMultiplier func(childComplexity int) int + EpochSeq func(childComplexity int) int + QuantumBalance func(childComplexity int) int + RewardBonusMultiplier func(childComplexity int) int + SummedQuantumBalance func(childComplexity int) int + SummedRewardBonusMultiplier func(childComplexity int) int } PeggedOrder struct { @@ -1944,12 +2043,15 @@ type ComplexityRoot struct { } PriceLevel struct { - NumberOfOrders func(childComplexity int) int - Price func(childComplexity int) int - Volume func(childComplexity int) int + AmmVolume func(childComplexity int) int + AmmVolumeEstimated func(childComplexity int) int + NumberOfOrders func(childComplexity int) int + Price func(childComplexity int) int + Volume func(childComplexity int) int } PriceMonitoringBounds struct { + Active func(childComplexity int) int MaxValidPrice func(childComplexity int) int MinValidPrice func(childComplexity int) int ReferencePrice func(childComplexity int) int @@ -2103,6 +2205,7 @@ type ComplexityRoot struct { } Query struct { + Amms func(childComplexity int, id *string, partyID *string, marketID *string, ammPartyID *string, status *v1.AMM_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 @@ -2119,16 +2222,19 @@ type ComplexityRoot struct { Erc20MultiSigSignerRemovedBundles func(childComplexity int, nodeID string, submitter *string, epochSeq *string, chainID *string, pagination *v2.Pagination) int Erc20SetAssetLimitsBundle func(childComplexity int, proposalID string) int Erc20WithdrawalApproval func(childComplexity int, withdrawalID string) int + EstimateAMMBounds func(childComplexity int, basePrice string, upperPrice *string, lowerPrice *string, leverageAtUpperPrice *string, leverageAtLowerPrice *string, commitmentAmount string, marketID string) int EstimateFees func(childComplexity int, marketID string, partyID string, price *string, size string, side vega.Side, timeInForce vega.Order_TimeInForce, expiration *int64, typeArg vega.Order_Type) int EstimateOrder func(childComplexity int, marketID string, partyID string, price *string, size string, side vega.Side, timeInForce vega.Order_TimeInForce, expiration *int64, typeArg vega.Order_Type) int EstimatePosition func(childComplexity int, marketID string, openVolume string, averageEntryPrice string, orders []*v2.OrderInfo, marginAccountBalance string, generalAccountBalance string, orderMarginAccountBalance string, marginMode vega.MarginMode, marginFactor *string, includeRequiredPositionMarginInAvailableCollateral *bool, scaleLiquidationPriceToMarketDecimals *bool) int EstimateTransferFee func(childComplexity int, fromAccount string, fromAccountType vega.AccountType, toAccount string, amount string, assetID string) int EthereumKeyRotations func(childComplexity int, nodeID *string) int - FeesStats func(childComplexity int, marketID *string, assetID *string, epoch *int, partyID *string) int + FeesStats func(childComplexity int, marketID *string, assetID *string, epoch *int, partyID *string, epochFrom *int, epochTo *int) int FeesStatsForParty func(childComplexity int, partyID string, assetID *string, fromEpoch *int, toEpoch *int) int FundingPayments func(childComplexity int, partyID string, marketID *string, pagination *v2.Pagination) int FundingPeriodDataPoints func(childComplexity int, marketID string, dateRange *v2.DateRange, source *v1.FundingPeriodDataPoint_Source, pagination *v2.Pagination) int FundingPeriods func(childComplexity int, marketID string, dateRange *v2.DateRange, pagination *v2.Pagination) int + GamePartyScores func(childComplexity int, filter *GamePartyScoreFilter, pagination *v2.Pagination) int + GameTeamScores func(childComplexity int, filter *GameTeamScoreFilter, pagination *v2.Pagination) int Games func(childComplexity int, gameID *string, epochFrom *int, epochTo *int, entityScope *vega.EntityScope, teamID *string, partyID *string, pagination *v2.Pagination) int GetMarketDataHistoryConnectionByID func(childComplexity int, id string, start *int64, end *int64, pagination *v2.Pagination) int KeyRotationsConnection func(childComplexity int, id *string, pagination *v2.Pagination) int @@ -2152,7 +2258,7 @@ type ComplexityRoot struct { OrderByID func(childComplexity int, id string, version *int) int OrderByReference func(childComplexity int, reference string) int OrderVersionsConnection func(childComplexity int, orderID *string, pagination *v2.Pagination) int - PaidLiquidityFees func(childComplexity int, marketID *string, assetID *string, epoch *int, partyIDs []string) int + PaidLiquidityFees func(childComplexity int, marketID *string, assetID *string, epoch *int, partyIDs []string, includeDerivedParties *bool, epochFrom *int, epochTo *int) int PartiesConnection func(childComplexity int, id *string, pagination *v2.Pagination) int PartiesProfilesConnection func(childComplexity int, ids []string, pagination *v2.Pagination) int Party func(childComplexity int, id string) int @@ -2201,6 +2307,7 @@ type ComplexityRoot struct { RecurringGovernanceTransfer struct { DispatchStrategy func(childComplexity int) int EndEpoch func(childComplexity int) int + Factor func(childComplexity int) int StartEpoch func(childComplexity int) int } @@ -2317,7 +2424,7 @@ type ComplexityRoot struct { RewardSummary struct { Amount func(childComplexity int) int Asset func(childComplexity int) int - RewardsConnection func(childComplexity int, assetID *string, pagination *v2.Pagination) int + RewardsConnection func(childComplexity int, assetID *string, pagination *v2.Pagination, includeDerivedParties *bool) int } RewardSummaryConnection struct { @@ -2341,6 +2448,11 @@ type ComplexityRoot struct { Short func(childComplexity int) int } + RiskFactorOverride struct { + Long func(childComplexity int) int + Short func(childComplexity int) int + } + ScalingFactors struct { CollateralRelease func(childComplexity int) int InitialMargin func(childComplexity int) int @@ -2488,7 +2600,7 @@ type ComplexityRoot struct { } Subscription struct { - Accounts func(childComplexity int, marketID *string, partyID *string, assetID *string, typeArg *vega.AccountType) int + Accounts func(childComplexity int, marketID *string, partyID *string, assetID *string, typeArg *vega.AccountType, includeDerivedParties *bool) int BusEvents func(childComplexity int, types []BusEventType, marketID *string, partyID *string, batchSize int) int Candles func(childComplexity int, marketID string, interval vega.Interval) int LiquidityProvisions func(childComplexity int, partyID *string, marketID *string) int @@ -2497,7 +2609,7 @@ type ComplexityRoot struct { MarketsDepth func(childComplexity int, marketIds []string) int MarketsDepthUpdate func(childComplexity int, marketIds []string) int Orders func(childComplexity int, filter *OrderByMarketAndPartyIdsFilter) int - Positions func(childComplexity int, partyID *string, marketID *string) int + Positions func(childComplexity int, partyID *string, marketID *string, includeDerivedParties *bool) int Proposals func(childComplexity int, partyID *string) int Trades func(childComplexity int, marketID *string, partyID *string) int TradesStream func(childComplexity int, filter TradesSubscriptionFilter) int @@ -2819,6 +2931,7 @@ type ComplexityRoot struct { } UpdateMarketConfiguration struct { + EnableTxReordering func(childComplexity int) int Instrument func(childComplexity int) int LinearSlippageFactor func(childComplexity int) int LiquidationStrategy func(childComplexity int) int @@ -2883,6 +2996,7 @@ type ComplexityRoot struct { } UpdateSpotMarketConfiguration struct { + EnableTxReordering func(childComplexity int) int Instrument func(childComplexity int) int LiquidityFeeSettings func(childComplexity int) int LiquiditySLAParams func(childComplexity int) int @@ -2980,6 +3094,7 @@ type AccountBalanceResolver interface { Market(ctx context.Context, obj *v2.AccountBalance) (*vega.Market, error) Party(ctx context.Context, obj *v2.AccountBalance) (*vega.Party, error) + ParentPartyID(ctx context.Context, obj *v2.AccountBalance) (*vega.Party, error) } type AccountDetailsResolver interface { PartyID(ctx context.Context, obj *vega.AccountDetails) (*string, error) @@ -3164,6 +3279,15 @@ type GameResolver interface { NumberOfParticipants(ctx context.Context, obj *v2.Game) (int, error) Entities(ctx context.Context, obj *v2.Game) ([]GameEntity, error) } +type GamePartyScoreResolver interface { + EpochID(ctx context.Context, obj *v1.GamePartyScore) (int, error) + PartyID(ctx context.Context, obj *v1.GamePartyScore) (string, error) + + Rank(ctx context.Context, obj *v1.GamePartyScore) (*int, error) +} +type GameTeamScoreResolver interface { + EpochID(ctx context.Context, obj *v1.GameTeamScore) (int, error) +} type IcebergOrderResolver interface { PeakSize(ctx context.Context, obj *vega.IcebergOrder) (string, error) MinimumVisibleSize(ctx context.Context, obj *vega.IcebergOrder) (string, error) @@ -3235,7 +3359,7 @@ type MarketResolver interface { Proposal(ctx context.Context, obj *vega.Market) (*vega.GovernanceData, error) MarketProposal(ctx context.Context, obj *vega.Market) (ProposalNode, error) OrdersConnection(ctx context.Context, obj *vega.Market, pagination *v2.Pagination, filter *OrderByPartyIdsFilter) (*v2.OrderConnection, error) - AccountsConnection(ctx context.Context, obj *vega.Market, partyID *string, pagination *v2.Pagination) (*v2.AccountsConnection, error) + AccountsConnection(ctx context.Context, obj *vega.Market, partyID *string, pagination *v2.Pagination, includeDerivedParties *bool) (*v2.AccountsConnection, error) TradesConnection(ctx context.Context, obj *vega.Market, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.TradeConnection, error) Depth(ctx context.Context, obj *vega.Market, maxDepth *int) (*vega.MarketDepth, error) CandlesConnection(ctx context.Context, obj *vega.Market, since string, to *string, interval vega.Interval, pagination *v2.Pagination) (*v2.CandleDataConnection, error) @@ -3246,6 +3370,8 @@ type MarketResolver interface { RiskFactors(ctx context.Context, obj *vega.Market) (*vega.RiskFactor, error) LiquiditySLAParameters(ctx context.Context, obj *vega.Market) (*vega.LiquiditySLAParameters, error) + + EnableTxReordering(ctx context.Context, obj *vega.Market) (bool, error) } type MarketDataResolver interface { Market(ctx context.Context, obj *vega.MarketData) (*vega.Market, error) @@ -3314,6 +3440,7 @@ type NewMarketResolver interface { LiquidationStrategy(ctx context.Context, obj *vega.NewMarket) (*vega.LiquidationStrategy, error) MarkPriceConfiguration(ctx context.Context, obj *vega.NewMarket) (*vega.CompositePriceConfiguration, error) TickSize(ctx context.Context, obj *vega.NewMarket) (string, error) + EnableTxReordering(ctx context.Context, obj *vega.NewMarket) (bool, error) } type NewSpotMarketResolver interface { Instrument(ctx context.Context, obj *vega.NewSpotMarket) (*vega.InstrumentConfiguration, error) @@ -3326,6 +3453,7 @@ type NewSpotMarketResolver interface { LiquiditySLAParams(ctx context.Context, obj *vega.NewSpotMarket) (*vega.LiquiditySLAParameters, error) LiquidityFeeSettings(ctx context.Context, obj *vega.NewSpotMarket) (*vega.LiquidityFeeSettings, error) TickSize(ctx context.Context, obj *vega.NewSpotMarket) (string, error) + EnableTxReordering(ctx context.Context, obj *vega.NewSpotMarket) (bool, error) } type NewTransferResolver interface { Source(ctx context.Context, obj *vega.NewTransfer) (string, error) @@ -3424,7 +3552,7 @@ type PaidLiquidityFeesResolver interface { type PartyResolver interface { OrdersConnection(ctx context.Context, obj *vega.Party, pagination *v2.Pagination, filter *OrderByMarketIdsFilter) (*v2.OrderConnection, error) TradesConnection(ctx context.Context, obj *vega.Party, marketID *string, dataRange *v2.DateRange, pagination *v2.Pagination) (*v2.TradeConnection, error) - AccountsConnection(ctx context.Context, obj *vega.Party, marketID *string, assetID *string, typeArg *vega.AccountType, pagination *v2.Pagination) (*v2.AccountsConnection, error) + AccountsConnection(ctx context.Context, obj *vega.Party, marketID *string, assetID *string, typeArg *vega.AccountType, pagination *v2.Pagination, includeDerivedParties *bool) (*v2.AccountsConnection, error) PositionsConnection(ctx context.Context, obj *vega.Party, market *string, pagination *v2.Pagination) (*v2.PositionConnection, error) MarginsConnection(ctx context.Context, obj *vega.Party, marketID *string, pagination *v2.Pagination) (*v2.MarginConnection, error) ProposalsConnection(ctx context.Context, obj *vega.Party, proposalType *v2.ListGovernanceDataRequest_Type, inState *vega.Proposal_State, pagination *v2.Pagination) (*v2.GovernanceDataConnection, error) @@ -3435,8 +3563,8 @@ type PartyResolver interface { LiquidityProvisionsConnection(ctx context.Context, obj *vega.Party, marketID *string, reference *string, live *bool, pagination *v2.Pagination) (*v2.LiquidityProvisionsConnection, error) DelegationsConnection(ctx context.Context, obj *vega.Party, nodeID *string, pagination *v2.Pagination) (*v2.DelegationsConnection, error) StakingSummary(ctx context.Context, obj *vega.Party, pagination *v2.Pagination) (*StakingSummary, error) - RewardsConnection(ctx context.Context, obj *vega.Party, assetID *string, pagination *v2.Pagination, fromEpoch *int, toEpoch *int, teamID *string, gameID *string) (*v2.RewardsConnection, error) - RewardSummaries(ctx context.Context, obj *vega.Party, assetID *string) ([]*vega.RewardSummary, error) + RewardsConnection(ctx context.Context, obj *vega.Party, assetID *string, pagination *v2.Pagination, fromEpoch *int, toEpoch *int, teamID *string, gameID *string, includeDerivedParties *bool, marketID *string) (*v2.RewardsConnection, error) + RewardSummaries(ctx context.Context, obj *vega.Party, assetID *string, includeDerivedParties *bool) ([]*vega.RewardSummary, error) TransfersConnection(ctx context.Context, obj *vega.Party, direction *TransferDirection, pagination *v2.Pagination, isReward *bool, fromEpoch *int, toEpoch *int, status *v1.Transfer_Status, scope *v2.ListTransfersRequest_Scope, gameID *string, fromAccountType *vega.AccountType, toAccountType *vega.AccountType) (*v2.TransferConnection, error) ActivityStreak(ctx context.Context, obj *vega.Party, epoch *int) (*v1.PartyActivityStreak, error) VestingBalancesSummary(ctx context.Context, obj *vega.Party, assetID *string) (*v2.GetVestingBalancesSummaryResponse, error) @@ -3504,6 +3632,8 @@ type PositionUpdateResolver interface { } type PriceLevelResolver interface { Volume(ctx context.Context, obj *vega.PriceLevel) (string, error) + AmmVolume(ctx context.Context, obj *vega.PriceLevel) (string, error) + AmmVolumeEstimated(ctx context.Context, obj *vega.PriceLevel) (string, error) NumberOfOrders(ctx context.Context, obj *vega.PriceLevel) (string, error) } type ProposalResolver interface { @@ -3551,6 +3681,7 @@ type QuantumVolumesPerEpochResolver interface { Epoch(ctx context.Context, obj *v2.QuantumVolumesPerEpoch) (int, error) } type QueryResolver interface { + Amms(ctx context.Context, id *string, partyID *string, marketID *string, ammPartyID *string, status *v1.AMM_Status, pagination *v2.Pagination) (*v2.AMMConnection, 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) @@ -3570,9 +3701,10 @@ type QueryResolver interface { EstimateOrder(ctx context.Context, marketID string, partyID string, price *string, size string, side vega.Side, timeInForce vega.Order_TimeInForce, expiration *int64, typeArg vega.Order_Type) (*OrderEstimate, error) EstimateFees(ctx context.Context, marketID string, partyID string, price *string, size string, side vega.Side, timeInForce vega.Order_TimeInForce, expiration *int64, typeArg vega.Order_Type) (*FeeEstimate, error) EstimatePosition(ctx context.Context, marketID string, openVolume string, averageEntryPrice string, orders []*v2.OrderInfo, marginAccountBalance string, generalAccountBalance string, orderMarginAccountBalance string, marginMode vega.MarginMode, marginFactor *string, includeRequiredPositionMarginInAvailableCollateral *bool, scaleLiquidationPriceToMarketDecimals *bool) (*PositionEstimate, error) + EstimateAMMBounds(ctx context.Context, basePrice string, upperPrice *string, lowerPrice *string, leverageAtUpperPrice *string, leverageAtLowerPrice *string, commitmentAmount string, marketID string) (*v2.EstimateAMMBoundsResponse, error) EthereumKeyRotations(ctx context.Context, nodeID *string) (*v2.EthereumKeyRotationsConnection, error) EstimateTransferFee(ctx context.Context, fromAccount string, fromAccountType vega.AccountType, toAccount string, amount string, assetID string) (*v2.EstimateTransferFeeResponse, error) - FeesStats(ctx context.Context, marketID *string, assetID *string, epoch *int, partyID *string) (*v1.FeesStats, error) + FeesStats(ctx context.Context, marketID *string, assetID *string, epoch *int, partyID *string, epochFrom *int, epochTo *int) (*v1.FeesStats, error) FeesStatsForParty(ctx context.Context, partyID string, assetID *string, fromEpoch *int, toEpoch *int) ([]*v2.FeesStatsForParty, error) FundingPayments(ctx context.Context, partyID string, marketID *string, pagination *v2.Pagination) (*v2.FundingPaymentConnection, error) FundingPeriods(ctx context.Context, marketID string, dateRange *v2.DateRange, pagination *v2.Pagination) (*v2.FundingPeriodConnection, error) @@ -3600,7 +3732,7 @@ type QueryResolver interface { OrderByID(ctx context.Context, id string, version *int) (*vega.Order, error) OrderByReference(ctx context.Context, reference string) (*vega.Order, error) OrderVersionsConnection(ctx context.Context, orderID *string, pagination *v2.Pagination) (*v2.OrderConnection, error) - PaidLiquidityFees(ctx context.Context, marketID *string, assetID *string, epoch *int, partyIDs []string) (*v2.PaidLiquidityFeesConnection, error) + PaidLiquidityFees(ctx context.Context, marketID *string, assetID *string, epoch *int, partyIDs []string, includeDerivedParties *bool, epochFrom *int, epochTo *int) (*v2.PaidLiquidityFeesConnection, error) PartiesConnection(ctx context.Context, id *string, pagination *v2.Pagination) (*v2.PartyConnection, error) PartiesProfilesConnection(ctx context.Context, ids []string, pagination *v2.Pagination) (*v2.PartiesProfilesConnection, error) Party(ctx context.Context, id string) (*vega.Party, error) @@ -3615,6 +3747,8 @@ type QueryResolver interface { Statistics(ctx context.Context) (*v12.Statistics, error) StopOrder(ctx context.Context, id string) (*v1.StopOrderEvent, error) StopOrders(ctx context.Context, filter *v2.StopOrderFilter, pagination *v2.Pagination) (*v2.StopOrderConnection, error) + GameTeamScores(ctx context.Context, filter *GameTeamScoreFilter, pagination *v2.Pagination) (*v2.GameTeamScoresConnection, error) + GamePartyScores(ctx context.Context, filter *GamePartyScoreFilter, pagination *v2.Pagination) (*v2.GamePartyScoresConnection, error) SuccessorMarkets(ctx context.Context, marketID string, fullHistory *bool, pagination *v2.Pagination) (*v2.SuccessorMarketConnection, error) Teams(ctx context.Context, teamID *string, partyID *string, pagination *v2.Pagination) (*v2.TeamConnection, error) TeamsStatistics(ctx context.Context, teamID *string, aggregationEpochs *int, pagination *v2.Pagination) (*v2.TeamsStatisticsConnection, error) @@ -3673,7 +3807,7 @@ type RewardResolver interface { type RewardSummaryResolver interface { Asset(ctx context.Context, obj *vega.RewardSummary) (*vega.Asset, error) - RewardsConnection(ctx context.Context, obj *vega.RewardSummary, assetID *string, pagination *v2.Pagination) (*v2.RewardsConnection, error) + RewardsConnection(ctx context.Context, obj *vega.RewardSummary, assetID *string, pagination *v2.Pagination, includeDerivedParties *bool) (*v2.RewardsConnection, error) } type SpotResolver interface { BaseAsset(ctx context.Context, obj *vega.Spot) (*vega.Asset, error) @@ -3734,7 +3868,7 @@ type StopOrderResolver interface { SizeOverrideValue(ctx context.Context, obj *v1.StopOrderEvent) (*string, error) } type SubscriptionResolver interface { - Accounts(ctx context.Context, marketID *string, partyID *string, assetID *string, typeArg *vega.AccountType) (<-chan []*v2.AccountBalance, error) + Accounts(ctx context.Context, marketID *string, partyID *string, assetID *string, typeArg *vega.AccountType, includeDerivedParties *bool) (<-chan []*v2.AccountBalance, error) BusEvents(ctx context.Context, types []BusEventType, marketID *string, partyID *string, batchSize int) (<-chan []*BusEvent, error) Candles(ctx context.Context, marketID string, interval vega.Interval) (<-chan *v2.Candle, error) LiquidityProvisions(ctx context.Context, partyID *string, marketID *string) (<-chan []*vega.LiquidityProvision, error) @@ -3743,7 +3877,7 @@ type SubscriptionResolver interface { MarketsDepth(ctx context.Context, marketIds []string) (<-chan []*vega.MarketDepth, error) MarketsDepthUpdate(ctx context.Context, marketIds []string) (<-chan []*vega.MarketDepthUpdate, error) Orders(ctx context.Context, filter *OrderByMarketAndPartyIdsFilter) (<-chan []*vega.Order, error) - Positions(ctx context.Context, partyID *string, marketID *string) (<-chan []*vega.Position, error) + Positions(ctx context.Context, partyID *string, marketID *string, includeDerivedParties *bool) (<-chan []*vega.Position, error) Proposals(ctx context.Context, partyID *string) (<-chan *vega.GovernanceData, error) Trades(ctx context.Context, marketID *string, partyID *string) (<-chan []*vega.Trade, error) TradesStream(ctx context.Context, filter TradesSubscriptionFilter) (<-chan []*vega.Trade, error) @@ -3822,6 +3956,8 @@ type UpdateMarketConfigurationResolver interface { PriceMonitoringParameters(ctx context.Context, obj *vega.UpdateMarketConfiguration) (*PriceMonitoringParameters, error) LiquidityMonitoringParameters(ctx context.Context, obj *vega.UpdateMarketConfiguration) (*LiquidityMonitoringParameters, error) RiskParameters(ctx context.Context, obj *vega.UpdateMarketConfiguration) (UpdateMarketRiskParameters, error) + + EnableTxReordering(ctx context.Context, obj *vega.UpdateMarketConfiguration) (bool, error) } type UpdateMarketStateResolver interface { Market(ctx context.Context, obj *vega.UpdateMarketState) (*vega.Market, error) @@ -3847,6 +3983,8 @@ type UpdateSpotMarketConfigurationResolver interface { TargetStakeParameters(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (*TargetStakeParameters, error) RiskParameters(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (RiskModel, error) LiquiditySLAParams(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (*vega.LiquiditySLAParameters, error) + + EnableTxReordering(ctx context.Context, obj *vega.UpdateSpotMarketConfiguration) (bool, error) } type UpdateVolumeDiscountProgramResolver interface { BenefitTiers(ctx context.Context, obj *vega.UpdateVolumeDiscountProgram) ([]*vega.VolumeBenefitTier, error) @@ -3921,6 +4059,97 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in _ = ec switch typeName + "." + field { + case "AMM.ammPartyId": + if e.complexity.AMM.AmmPartyId == nil { + break + } + + return e.complexity.AMM.AmmPartyId(childComplexity), true + + case "AMM.commitment": + if e.complexity.AMM.Commitment == nil { + break + } + + return e.complexity.AMM.Commitment(childComplexity), true + + case "AMM.id": + if e.complexity.AMM.Id == nil { + break + } + + return e.complexity.AMM.Id(childComplexity), true + + case "AMM.marketId": + if e.complexity.AMM.MarketId == nil { + break + } + + return e.complexity.AMM.MarketId(childComplexity), true + + case "AMM.parameters": + if e.complexity.AMM.Parameters == nil { + break + } + + return e.complexity.AMM.Parameters(childComplexity), true + + case "AMM.partyId": + if e.complexity.AMM.PartyId == nil { + break + } + + return e.complexity.AMM.PartyId(childComplexity), true + + case "AMM.proposedFee": + if e.complexity.AMM.ProposedFee == nil { + break + } + + return e.complexity.AMM.ProposedFee(childComplexity), true + + case "AMM.status": + if e.complexity.AMM.Status == nil { + break + } + + return e.complexity.AMM.Status(childComplexity), true + + case "AMM.statusReason": + if e.complexity.AMM.StatusReason == nil { + break + } + + return e.complexity.AMM.StatusReason(childComplexity), true + + case "AMMConnection.edges": + if e.complexity.AMMConnection.Edges == nil { + break + } + + return e.complexity.AMMConnection.Edges(childComplexity), true + + case "AMMConnection.pageInfo": + if e.complexity.AMMConnection.PageInfo == nil { + break + } + + return e.complexity.AMMConnection.PageInfo(childComplexity), true + + case "AMMEdge.cursor": + if e.complexity.AMMEdge.Cursor == nil { + break + } + + return e.complexity.AMMEdge.Cursor(childComplexity), true + + case "AMMEdge.node": + if e.complexity.AMMEdge.Node == nil { + break + } + + return e.complexity.AMMEdge.Node(childComplexity), true + case "AbstractMarginLevels.asset": if e.complexity.AbstractMarginLevels.Asset == nil { break @@ -4005,6 +4234,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.AccountBalance.Market(childComplexity), true + case "AccountBalance.parentPartyId": + if e.complexity.AccountBalance.ParentPartyID == nil { + break + } + + return e.complexity.AccountBalance.ParentPartyID(childComplexity), true + case "AccountBalance.party": if e.complexity.AccountBalance.Party == nil { break @@ -4922,6 +5158,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.leverageAtLowerBound": + if e.complexity.ConcentratedLiquidityParameters.LeverageAtLowerBound == nil { + break + } + + return e.complexity.ConcentratedLiquidityParameters.LeverageAtLowerBound(childComplexity), true + + case "ConcentratedLiquidityParameters.leverageAtUpperBound": + if e.complexity.ConcentratedLiquidityParameters.LeverageAtUpperBound == nil { + break + } + + return e.complexity.ConcentratedLiquidityParameters.LeverageAtUpperBound(childComplexity), true + + case "ConcentratedLiquidityParameters.lowerBound": + if e.complexity.ConcentratedLiquidityParameters.LowerBound == nil { + break + } + + return e.complexity.ConcentratedLiquidityParameters.LowerBound(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 @@ -6164,6 +6435,48 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Erc20WithdrawalDetails.ReceiverAddress(childComplexity), true + case "EstimatedAMMBounds.liquidationPriceAtLower": + if e.complexity.EstimatedAMMBounds.LiquidationPriceAtLower == nil { + break + } + + return e.complexity.EstimatedAMMBounds.LiquidationPriceAtLower(childComplexity), true + + case "EstimatedAMMBounds.liquidationPriceAtUpper": + if e.complexity.EstimatedAMMBounds.LiquidationPriceAtUpper == nil { + break + } + + return e.complexity.EstimatedAMMBounds.LiquidationPriceAtUpper(childComplexity), true + + case "EstimatedAMMBounds.lossOnCommitmentAtLower": + if e.complexity.EstimatedAMMBounds.LossOnCommitmentAtLower == nil { + break + } + + return e.complexity.EstimatedAMMBounds.LossOnCommitmentAtLower(childComplexity), true + + case "EstimatedAMMBounds.lossOnCommitmentAtUpper": + if e.complexity.EstimatedAMMBounds.LossOnCommitmentAtUpper == nil { + break + } + + return e.complexity.EstimatedAMMBounds.LossOnCommitmentAtUpper(childComplexity), true + + case "EstimatedAMMBounds.positionSizeAtLower": + if e.complexity.EstimatedAMMBounds.PositionSizeAtLower == nil { + break + } + + return e.complexity.EstimatedAMMBounds.PositionSizeAtLower(childComplexity), true + + case "EstimatedAMMBounds.positionSizeAtUpper": + if e.complexity.EstimatedAMMBounds.PositionSizeAtUpper == nil { + break + } + + return e.complexity.EstimatedAMMBounds.PositionSizeAtUpper(childComplexity), true + case "EstimatedTransferFee.discount": if e.complexity.EstimatedTransferFee.Discount == nil { break @@ -6731,6 +7044,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.FundingPeriodEdge.Node(childComplexity), true + case "Future.cap": + if e.complexity.Future.Cap == nil { + break + } + + return e.complexity.Future.Cap(childComplexity), true + case "Future.dataSourceSpecBinding": if e.complexity.Future.DataSourceSpecBinding == nil { break @@ -6766,6 +7086,34 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Future.SettlementAsset(childComplexity), true + case "FutureCap.binarySettlement": + if e.complexity.FutureCap.BinarySettlement == nil { + break + } + + return e.complexity.FutureCap.BinarySettlement(childComplexity), true + + case "FutureCap.fullyCollateralised": + if e.complexity.FutureCap.FullyCollateralised == nil { + break + } + + return e.complexity.FutureCap.FullyCollateralised(childComplexity), true + + case "FutureCap.maxPrice": + if e.complexity.FutureCap.MaxPrice == nil { + break + } + + return e.complexity.FutureCap.MaxPrice(childComplexity), true + + case "FutureProduct.cap": + if e.complexity.FutureProduct.Cap == nil { + break + } + + return e.complexity.FutureProduct.Cap(childComplexity), true + case "FutureProduct.dataSourceSpecBinding": if e.complexity.FutureProduct.DataSourceSpecBinding == nil { break @@ -6850,6 +7198,174 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.GameEdge.Node(childComplexity), true + case "GamePartyScore.epochId": + if e.complexity.GamePartyScore.EpochID == nil { + break + } + + return e.complexity.GamePartyScore.EpochID(childComplexity), true + + case "GamePartyScore.gameId": + if e.complexity.GamePartyScore.GameId == nil { + break + } + + return e.complexity.GamePartyScore.GameId(childComplexity), true + + case "GamePartyScore.isEligible": + if e.complexity.GamePartyScore.IsEligible == nil { + break + } + + return e.complexity.GamePartyScore.IsEligible(childComplexity), true + + case "GamePartyScore.openVolume": + if e.complexity.GamePartyScore.OpenVolume == nil { + break + } + + return e.complexity.GamePartyScore.OpenVolume(childComplexity), true + + case "GamePartyScore.partyId": + if e.complexity.GamePartyScore.PartyID == nil { + break + } + + return e.complexity.GamePartyScore.PartyID(childComplexity), true + + case "GamePartyScore.rank": + if e.complexity.GamePartyScore.Rank == nil { + break + } + + return e.complexity.GamePartyScore.Rank(childComplexity), true + + case "GamePartyScore.score": + if e.complexity.GamePartyScore.Score == nil { + break + } + + return e.complexity.GamePartyScore.Score(childComplexity), true + + case "GamePartyScore.stakingBalance": + if e.complexity.GamePartyScore.StakingBalance == nil { + break + } + + return e.complexity.GamePartyScore.StakingBalance(childComplexity), true + + case "GamePartyScore.teamId": + if e.complexity.GamePartyScore.TeamId == nil { + break + } + + return e.complexity.GamePartyScore.TeamId(childComplexity), true + + case "GamePartyScore.time": + if e.complexity.GamePartyScore.Time == nil { + break + } + + return e.complexity.GamePartyScore.Time(childComplexity), true + + case "GamePartyScore.totalFeesPaid": + if e.complexity.GamePartyScore.TotalFeesPaid == nil { + break + } + + return e.complexity.GamePartyScore.TotalFeesPaid(childComplexity), true + + case "GamePartyScoreConnection.edges": + if e.complexity.GamePartyScoreConnection.Edges == nil { + break + } + + return e.complexity.GamePartyScoreConnection.Edges(childComplexity), true + + case "GamePartyScoreConnection.pageInfo": + if e.complexity.GamePartyScoreConnection.PageInfo == nil { + break + } + + return e.complexity.GamePartyScoreConnection.PageInfo(childComplexity), true + + case "GamePartyScoreEdge.cursor": + if e.complexity.GamePartyScoreEdge.Cursor == nil { + break + } + + return e.complexity.GamePartyScoreEdge.Cursor(childComplexity), true + + case "GamePartyScoreEdge.node": + if e.complexity.GamePartyScoreEdge.Node == nil { + break + } + + return e.complexity.GamePartyScoreEdge.Node(childComplexity), true + + case "GameTeamScore.epochId": + if e.complexity.GameTeamScore.EpochID == nil { + break + } + + return e.complexity.GameTeamScore.EpochID(childComplexity), true + + case "GameTeamScore.gameId": + if e.complexity.GameTeamScore.GameId == nil { + break + } + + return e.complexity.GameTeamScore.GameId(childComplexity), true + + case "GameTeamScore.score": + if e.complexity.GameTeamScore.Score == nil { + break + } + + return e.complexity.GameTeamScore.Score(childComplexity), true + + case "GameTeamScore.teamId": + if e.complexity.GameTeamScore.TeamId == nil { + break + } + + return e.complexity.GameTeamScore.TeamId(childComplexity), true + + case "GameTeamScore.time": + if e.complexity.GameTeamScore.Time == nil { + break + } + + return e.complexity.GameTeamScore.Time(childComplexity), true + + case "GameTeamScoreConnection.edges": + if e.complexity.GameTeamScoreConnection.Edges == nil { + break + } + + return e.complexity.GameTeamScoreConnection.Edges(childComplexity), true + + case "GameTeamScoreConnection.pageInfo": + if e.complexity.GameTeamScoreConnection.PageInfo == nil { + break + } + + return e.complexity.GameTeamScoreConnection.PageInfo(childComplexity), true + + case "GameTeamScoreEdge.cursor": + if e.complexity.GameTeamScoreEdge.Cursor == nil { + break + } + + return e.complexity.GameTeamScoreEdge.Cursor(childComplexity), true + + case "GameTeamScoreEdge.node": + if e.complexity.GameTeamScoreEdge.Node == nil { + break + } + + return e.complexity.GameTeamScoreEdge.Node(childComplexity), true + case "GamesConnection.edges": if e.complexity.GamesConnection.Edges == nil { break @@ -7732,6 +8248,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.LogNormalRiskModel.RiskAversionParameter(childComplexity), true + case "LogNormalRiskModel.riskFactorOverride": + if e.complexity.LogNormalRiskModel.RiskFactorOverride == nil { + break + } + + return e.complexity.LogNormalRiskModel.RiskFactorOverride(childComplexity), true + case "LogNormalRiskModel.tau": if e.complexity.LogNormalRiskModel.Tau == nil { break @@ -7774,6 +8297,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.MakerFeesGenerated.Taker(childComplexity), true + case "MarginCalculator.fullyCollateralised": + if e.complexity.MarginCalculator.FullyCollateralised == nil { + break + } + + return e.complexity.MarginCalculator.FullyCollateralised(childComplexity), true + case "MarginCalculator.scalingFactors": if e.complexity.MarginCalculator.ScalingFactors == nil { break @@ -7987,7 +8517,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Market.AccountsConnection(childComplexity, args["partyId"].(*string), args["pagination"].(*v2.Pagination)), true + return e.complexity.Market.AccountsConnection(childComplexity, args["partyId"].(*string), args["pagination"].(*v2.Pagination), args["includeDerivedParties"].(*bool)), true case "Market.candlesConnection": if e.complexity.Market.CandlesConnection == nil { @@ -8027,6 +8557,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Market.Depth(childComplexity, args["maxDepth"].(*int)), true + case "Market.enableTxReordering": + if e.complexity.Market.EnableTxReordering == nil { + break + } + + return e.complexity.Market.EnableTxReordering(childComplexity), true + case "Market.fees": if e.complexity.Market.Fees == nil { break @@ -8852,6 +9389,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.NewMarket.DecimalPlaces(childComplexity), true + case "NewMarket.enableTxReordering": + if e.complexity.NewMarket.EnableTxReordering == nil { + break + } + + return e.complexity.NewMarket.EnableTxReordering(childComplexity), true + case "NewMarket.instrument": if e.complexity.NewMarket.Instrument == nil { break @@ -8950,6 +9494,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.NewMarket.TickSize(childComplexity), true + case "NewSpotMarket.enableTxReordering": + if e.complexity.NewSpotMarket.EnableTxReordering == nil { + break + } + + return e.complexity.NewSpotMarket.EnableTxReordering(childComplexity), true + case "NewSpotMarket.instrument": if e.complexity.NewSpotMarket.Instrument == nil { break @@ -10480,7 +11031,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Party.AccountsConnection(childComplexity, args["marketId"].(*string), args["assetId"].(*string), args["type"].(*vega.AccountType), args["pagination"].(*v2.Pagination)), true + return e.complexity.Party.AccountsConnection(childComplexity, args["marketId"].(*string), args["assetId"].(*string), args["type"].(*vega.AccountType), args["pagination"].(*v2.Pagination), args["includeDerivedParties"].(*bool)), true case "Party.activityStreak": if e.complexity.Party.ActivityStreak == nil { @@ -10607,7 +11158,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Party.RewardSummaries(childComplexity, args["assetId"].(*string)), true + return e.complexity.Party.RewardSummaries(childComplexity, args["assetId"].(*string), args["includeDerivedParties"].(*bool)), true case "Party.rewardsConnection": if e.complexity.Party.RewardsConnection == nil { @@ -10619,7 +11170,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Party.RewardsConnection(childComplexity, args["assetId"].(*string), args["pagination"].(*v2.Pagination), args["fromEpoch"].(*int), args["toEpoch"].(*int), args["teamId"].(*string), args["gameId"].(*string)), true + return e.complexity.Party.RewardsConnection(childComplexity, args["assetId"].(*string), args["pagination"].(*v2.Pagination), args["fromEpoch"].(*int), args["toEpoch"].(*int), args["teamId"].(*string), args["gameId"].(*string), args["includeDerivedParties"].(*bool), args["marketId"].(*string)), true case "Party.stakingSummary": if e.complexity.Party.StakingSummary == nil { @@ -11001,6 +11552,20 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.PartyVestingStats.RewardBonusMultiplier(childComplexity), true + case "PartyVestingStats.summedQuantumBalance": + if e.complexity.PartyVestingStats.SummedQuantumBalance == nil { + break + } + + return e.complexity.PartyVestingStats.SummedQuantumBalance(childComplexity), true + + case "PartyVestingStats.summedRewardBonusMultiplier": + if e.complexity.PartyVestingStats.SummedRewardBonusMultiplier == nil { + break + } + + return e.complexity.PartyVestingStats.SummedRewardBonusMultiplier(childComplexity), true + case "PeggedOrder.offset": if e.complexity.PeggedOrder.Offset == nil { break @@ -11482,6 +12047,20 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.PositionUpdate.UpdatedAt(childComplexity), true + case "PriceLevel.ammVolume": + if e.complexity.PriceLevel.AmmVolume == nil { + break + } + + return e.complexity.PriceLevel.AmmVolume(childComplexity), true + + case "PriceLevel.ammVolumeEstimated": + if e.complexity.PriceLevel.AmmVolumeEstimated == nil { + break + } + + return e.complexity.PriceLevel.AmmVolumeEstimated(childComplexity), true + case "PriceLevel.numberOfOrders": if e.complexity.PriceLevel.NumberOfOrders == nil { break @@ -11503,6 +12082,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.PriceLevel.Volume(childComplexity), true + case "PriceMonitoringBounds.active": + if e.complexity.PriceMonitoringBounds.Active == nil { + break + } + + return e.complexity.PriceMonitoringBounds.Active(childComplexity), true + case "PriceMonitoringBounds.maxValidPrice": if e.complexity.PriceMonitoringBounds.MaxValidPrice == nil { break @@ -12070,6 +12656,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.QuantumVolumesPerEpoch.TotalQuantumVolumes(childComplexity), true + case "Query.amms": + if e.complexity.Query.Amms == nil { + break + } + + args, err := ec.field_Query_amms_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.Amms(childComplexity, args["id"].(*string), args["partyId"].(*string), args["marketId"].(*string), args["ammPartyId"].(*string), args["status"].(*v1.AMM_Status), args["pagination"].(*v2.Pagination)), true + case "Query.asset": if e.complexity.Query.Asset == nil { break @@ -12252,6 +12850,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Query.Erc20WithdrawalApproval(childComplexity, args["withdrawalId"].(string)), true + case "Query.estimateAMMBounds": + if e.complexity.Query.EstimateAMMBounds == nil { + break + } + + args, err := ec.field_Query_estimateAMMBounds_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.EstimateAMMBounds(childComplexity, args["basePrice"].(string), args["upperPrice"].(*string), args["lowerPrice"].(*string), args["leverageAtUpperPrice"].(*string), args["leverageAtLowerPrice"].(*string), args["commitmentAmount"].(string), args["marketId"].(string)), true + case "Query.estimateFees": if e.complexity.Query.EstimateFees == nil { break @@ -12322,7 +12932,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.FeesStats(childComplexity, args["marketId"].(*string), args["assetId"].(*string), args["epoch"].(*int), args["partyId"].(*string)), true + return e.complexity.Query.FeesStats(childComplexity, args["marketId"].(*string), args["assetId"].(*string), args["epoch"].(*int), args["partyId"].(*string), args["epochFrom"].(*int), args["epochTo"].(*int)), true case "Query.feesStatsForParty": if e.complexity.Query.FeesStatsForParty == nil { @@ -12372,6 +12982,30 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.Query.FundingPeriods(childComplexity, args["marketId"].(string), args["dateRange"].(*v2.DateRange), args["pagination"].(*v2.Pagination)), true + case "Query.gamePartyScores": + if e.complexity.Query.GamePartyScores == nil { + break + } + + args, err := ec.field_Query_gamePartyScores_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.GamePartyScores(childComplexity, args["filter"].(*GamePartyScoreFilter), args["pagination"].(*v2.Pagination)), true + + case "Query.gameTeamScores": + if e.complexity.Query.GameTeamScores == nil { + break + } + + args, err := ec.field_Query_gameTeamScores_args(context.TODO(), rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.GameTeamScores(childComplexity, args["filter"].(*GameTeamScoreFilter), args["pagination"].(*v2.Pagination)), true + case "Query.games": if e.complexity.Query.Games == nil { break @@ -12638,7 +13272,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Query.PaidLiquidityFees(childComplexity, args["marketId"].(*string), args["assetId"].(*string), args["epoch"].(*int), args["partyIDs"].([]string)), true + return e.complexity.Query.PaidLiquidityFees(childComplexity, args["marketId"].(*string), args["assetId"].(*string), args["epoch"].(*int), args["partyIDs"].([]string), args["includeDerivedParties"].(*bool), args["epochFrom"].(*int), args["epochTo"].(*int)), true case "Query.partiesConnection": if e.complexity.Query.PartiesConnection == nil { @@ -13048,6 +13682,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.RecurringGovernanceTransfer.EndEpoch(childComplexity), true + case "RecurringGovernanceTransfer.factor": + if e.complexity.RecurringGovernanceTransfer.Factor == nil { + break + } + + return e.complexity.RecurringGovernanceTransfer.Factor(childComplexity), true + case "RecurringGovernanceTransfer.startEpoch": if e.complexity.RecurringGovernanceTransfer.StartEpoch == nil { break @@ -13534,7 +14175,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.RewardSummary.RewardsConnection(childComplexity, args["assetId"].(*string), args["pagination"].(*v2.Pagination)), true + return e.complexity.RewardSummary.RewardsConnection(childComplexity, args["assetId"].(*string), args["pagination"].(*v2.Pagination), args["includeDerivedParties"].(*bool)), true case "RewardSummaryConnection.edges": if e.complexity.RewardSummaryConnection.Edges == nil { @@ -13599,6 +14240,20 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.RiskFactor.Short(childComplexity), true + case "RiskFactorOverride.long": + if e.complexity.RiskFactorOverride.Long == nil { + break + } + + return e.complexity.RiskFactorOverride.Long(childComplexity), true + + case "RiskFactorOverride.short": + if e.complexity.RiskFactorOverride.Short == nil { + break + } + + return e.complexity.RiskFactorOverride.Short(childComplexity), true + case "ScalingFactors.collateralRelease": if e.complexity.ScalingFactors.CollateralRelease == nil { break @@ -14216,7 +14871,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Subscription.Accounts(childComplexity, args["marketId"].(*string), args["partyId"].(*string), args["assetId"].(*string), args["type"].(*vega.AccountType)), true + return e.complexity.Subscription.Accounts(childComplexity, args["marketId"].(*string), args["partyId"].(*string), args["assetId"].(*string), args["type"].(*vega.AccountType), args["includeDerivedParties"].(*bool)), true case "Subscription.busEvents": if e.complexity.Subscription.BusEvents == nil { @@ -14324,7 +14979,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return 0, false } - return e.complexity.Subscription.Positions(childComplexity, args["partyId"].(*string), args["marketId"].(*string)), true + return e.complexity.Subscription.Positions(childComplexity, args["partyId"].(*string), args["marketId"].(*string), args["includeDerivedParties"].(*bool)), true case "Subscription.proposals": if e.complexity.Subscription.Proposals == nil { @@ -15585,6 +16240,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.UpdateMarket.UpdateMarketConfiguration(childComplexity), true + case "UpdateMarketConfiguration.enableTxReordering": + if e.complexity.UpdateMarketConfiguration.EnableTxReordering == nil { + break + } + + return e.complexity.UpdateMarketConfiguration.EnableTxReordering(childComplexity), true + case "UpdateMarketConfiguration.instrument": if e.complexity.UpdateMarketConfiguration.Instrument == nil { break @@ -15844,6 +16506,13 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in return e.complexity.UpdateSpotMarket.UpdateSpotMarketConfiguration(childComplexity), true + case "UpdateSpotMarketConfiguration.enableTxReordering": + if e.complexity.UpdateSpotMarketConfiguration.EnableTxReordering == nil { + break + } + + return e.complexity.UpdateSpotMarketConfiguration.EnableTxReordering(childComplexity), true + case "UpdateSpotMarketConfiguration.instrument": if e.complexity.UpdateSpotMarketConfiguration.Instrument == nil { break @@ -16225,6 +16894,8 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { inputUnmarshalMap := graphql.BuildUnmarshalerMap( ec.unmarshalInputAccountFilter, ec.unmarshalInputDateRange, + ec.unmarshalInputGamePartyScoreFilter, + ec.unmarshalInputGameTeamScoreFilter, ec.unmarshalInputLedgerEntryFilter, ec.unmarshalInputOrderByMarketAndPartyIdsFilter, ec.unmarshalInputOrderByMarketIdsFilter, @@ -16424,6 +17095,15 @@ func (ec *executionContext) field_Market_accountsConnection_args(ctx context.Con } } args["pagination"] = arg1 + var arg2 *bool + if tmp, ok := rawArgs["includeDerivedParties"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDerivedParties")) + arg2, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDerivedParties"] = arg2 return args, nil } @@ -16700,6 +17380,15 @@ func (ec *executionContext) field_Party_accountsConnection_args(ctx context.Cont } } args["pagination"] = arg3 + var arg4 *bool + if tmp, ok := rawArgs["includeDerivedParties"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDerivedParties")) + arg4, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDerivedParties"] = arg4 return args, nil } @@ -16967,6 +17656,15 @@ func (ec *executionContext) field_Party_rewardSummaries_args(ctx context.Context } } args["assetId"] = arg0 + var arg1 *bool + if tmp, ok := rawArgs["includeDerivedParties"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDerivedParties")) + arg1, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDerivedParties"] = arg1 return args, nil } @@ -17027,6 +17725,24 @@ func (ec *executionContext) field_Party_rewardsConnection_args(ctx context.Conte } } args["gameId"] = arg5 + var arg6 *bool + if tmp, ok := rawArgs["includeDerivedParties"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDerivedParties")) + arg6, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDerivedParties"] = arg6 + var arg7 *string + if tmp, ok := rawArgs["marketId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketId")) + arg7, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["marketId"] = arg7 return args, nil } @@ -17258,6 +17974,66 @@ func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs return args, nil } +func (ec *executionContext) field_Query_amms_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["id"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) + arg0, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["id"] = arg0 + var arg1 *string + if tmp, ok := rawArgs["partyId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partyId")) + arg1, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["partyId"] = arg1 + var arg2 *string + if tmp, ok := rawArgs["marketId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketId")) + arg2, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["marketId"] = arg2 + var arg3 *string + if tmp, ok := rawArgs["ammPartyId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("ammPartyId")) + arg3, err = ec.unmarshalOID2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["ammPartyId"] = arg3 + var arg4 *v1.AMM_Status + if tmp, ok := rawArgs["status"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("status")) + arg4, err = ec.unmarshalOAMMStatus2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_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{}{} @@ -17594,6 +18370,75 @@ func (ec *executionContext) field_Query_erc20WithdrawalApproval_args(ctx context return args, nil } +func (ec *executionContext) field_Query_estimateAMMBounds_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["basePrice"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("basePrice")) + arg0, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["basePrice"] = arg0 + var arg1 *string + if tmp, ok := rawArgs["upperPrice"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("upperPrice")) + arg1, err = ec.unmarshalOString2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["upperPrice"] = arg1 + var arg2 *string + if tmp, ok := rawArgs["lowerPrice"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("lowerPrice")) + arg2, err = ec.unmarshalOString2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["lowerPrice"] = arg2 + var arg3 *string + if tmp, ok := rawArgs["leverageAtUpperPrice"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("leverageAtUpperPrice")) + arg3, err = ec.unmarshalOString2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["leverageAtUpperPrice"] = arg3 + var arg4 *string + if tmp, ok := rawArgs["leverageAtLowerPrice"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("leverageAtLowerPrice")) + arg4, err = ec.unmarshalOString2ᚖstring(ctx, tmp) + if err != nil { + return nil, err + } + } + args["leverageAtLowerPrice"] = arg4 + var arg5 string + if tmp, ok := rawArgs["commitmentAmount"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("commitmentAmount")) + arg5, err = ec.unmarshalNString2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["commitmentAmount"] = arg5 + var arg6 string + if tmp, ok := rawArgs["marketId"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("marketId")) + arg6, err = ec.unmarshalNID2string(ctx, tmp) + if err != nil { + return nil, err + } + } + args["marketId"] = arg6 + return args, nil +} + func (ec *executionContext) field_Query_estimateFees_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -18002,6 +18847,24 @@ func (ec *executionContext) field_Query_feesStats_args(ctx context.Context, rawA } } args["partyId"] = arg3 + var arg4 *int + if tmp, ok := rawArgs["epochFrom"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("epochFrom")) + arg4, err = ec.unmarshalOInt2ᚖint(ctx, tmp) + if err != nil { + return nil, err + } + } + args["epochFrom"] = arg4 + var arg5 *int + if tmp, ok := rawArgs["epochTo"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("epochTo")) + arg5, err = ec.unmarshalOInt2ᚖint(ctx, tmp) + if err != nil { + return nil, err + } + } + args["epochTo"] = arg5 return args, nil } @@ -18113,6 +18976,54 @@ func (ec *executionContext) field_Query_fundingPeriods_args(ctx context.Context, return args, nil } +func (ec *executionContext) field_Query_gamePartyScores_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 *GamePartyScoreFilter + if tmp, ok := rawArgs["filter"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("filter")) + arg0, err = ec.unmarshalOGamePartyScoreFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐGamePartyScoreFilter(ctx, tmp) + if err != nil { + return nil, err + } + } + args["filter"] = arg0 + var arg1 *v2.Pagination + if tmp, ok := rawArgs["pagination"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) + arg1, err = ec.unmarshalOPagination2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPagination(ctx, tmp) + if err != nil { + return nil, err + } + } + args["pagination"] = arg1 + return args, nil +} + +func (ec *executionContext) field_Query_gameTeamScores_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { + var err error + args := map[string]interface{}{} + var arg0 *GameTeamScoreFilter + if tmp, ok := rawArgs["filter"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("filter")) + arg0, err = ec.unmarshalOGameTeamScoreFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐGameTeamScoreFilter(ctx, tmp) + if err != nil { + return nil, err + } + } + args["filter"] = arg0 + var arg1 *v2.Pagination + if tmp, ok := rawArgs["pagination"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("pagination")) + arg1, err = ec.unmarshalOPagination2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPagination(ctx, tmp) + if err != nil { + return nil, err + } + } + args["pagination"] = arg1 + return args, nil +} + func (ec *executionContext) field_Query_games_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { var err error args := map[string]interface{}{} @@ -18617,6 +19528,33 @@ func (ec *executionContext) field_Query_paidLiquidityFees_args(ctx context.Conte } } args["partyIDs"] = arg3 + var arg4 *bool + if tmp, ok := rawArgs["includeDerivedParties"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDerivedParties")) + arg4, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDerivedParties"] = arg4 + var arg5 *int + if tmp, ok := rawArgs["epochFrom"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("epochFrom")) + arg5, err = ec.unmarshalOInt2ᚖint(ctx, tmp) + if err != nil { + return nil, err + } + } + args["epochFrom"] = arg5 + var arg6 *int + if tmp, ok := rawArgs["epochTo"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("epochTo")) + arg6, err = ec.unmarshalOInt2ᚖint(ctx, tmp) + if err != nil { + return nil, err + } + } + args["epochTo"] = arg6 return args, nil } @@ -19505,6 +20443,15 @@ func (ec *executionContext) field_RewardSummary_rewardsConnection_args(ctx conte } } args["pagination"] = arg1 + var arg2 *bool + if tmp, ok := rawArgs["includeDerivedParties"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDerivedParties")) + arg2, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDerivedParties"] = arg2 return args, nil } @@ -19562,6 +20509,15 @@ func (ec *executionContext) field_Subscription_accounts_args(ctx context.Context } } args["type"] = arg3 + var arg4 *bool + if tmp, ok := rawArgs["includeDerivedParties"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDerivedParties")) + arg4, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDerivedParties"] = arg4 return args, nil } @@ -19760,6 +20716,15 @@ func (ec *executionContext) field_Subscription_positions_args(ctx context.Contex } } args["marketId"] = arg1 + var arg2 *bool + if tmp, ok := rawArgs["includeDerivedParties"]; ok { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDerivedParties")) + arg2, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + if err != nil { + return nil, err + } + } + args["includeDerivedParties"] = arg2 return args, nil } @@ -19879,8 +20844,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) _AMM_id(ctx context.Context, field graphql.CollectedField, obj *v1.AMM) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMM_id(ctx, field) if err != nil { return graphql.Null } @@ -19893,7 +20858,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.Id, nil }) if err != nil { ec.Error(ctx, err) @@ -19905,90 +20870,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_AMM_id(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMM", 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) _AMM_partyId(ctx context.Context, field graphql.CollectedField, obj *v1.AMM) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMM_partyId(ctx, field) if err != nil { return graphql.Null } @@ -20001,7 +20902,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.PartyId, nil }) if err != nil { ec.Error(ctx, err) @@ -20013,58 +20914,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_AMM_partyId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMM", 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) _AMM_marketId(ctx context.Context, field graphql.CollectedField, obj *v1.AMM) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMM_marketId(ctx, field) if err != nil { return graphql.Null } @@ -20077,7 +20946,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.MarketId, nil }) if err != nil { ec.Error(ctx, err) @@ -20091,24 +20960,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_AMM_marketId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMM", 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) _AMM_ammPartyId(ctx context.Context, field graphql.CollectedField, obj *v1.AMM) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMM_ammPartyId(ctx, field) if err != nil { return graphql.Null } @@ -20121,7 +20990,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.AmmPartyId, nil }) if err != nil { ec.Error(ctx, err) @@ -20138,9 +21007,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_AMM_ammPartyId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMM", Field: field, IsMethod: false, IsResolver: false, @@ -20151,8 +21020,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) _AMM_commitment(ctx context.Context, field graphql.CollectedField, obj *v1.AMM) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMM_commitment(ctx, field) if err != nil { return graphql.Null } @@ -20165,7 +21034,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 +21051,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_AMM_commitment(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMM", Field: field, IsMethod: false, IsResolver: false, @@ -20195,8 +21064,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) _AMM_parameters(ctx context.Context, field graphql.CollectedField, obj *v1.AMM) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMM_parameters(ctx, field) if err != nil { return graphql.Null } @@ -20209,7 +21078,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 +21090,38 @@ func (ec *executionContext) _AbstractMarginLevels_orderMarginLevel(ctx context.C } return graphql.Null } - res := resTmp.(string) + res := resTmp.(*v1.AMM_ConcentratedLiquidityParameters) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNConcentratedLiquidityParameters2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_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_AMM_parameters(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMM", 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 "leverageAtUpperBound": + return ec.fieldContext_ConcentratedLiquidityParameters_leverageAtUpperBound(ctx, field) + case "leverageAtLowerBound": + return ec.fieldContext_ConcentratedLiquidityParameters_leverageAtLowerBound(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) _AMM_status(ctx context.Context, field graphql.CollectedField, obj *v1.AMM) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMM_status(ctx, field) if err != nil { return graphql.Null } @@ -20253,7 +21134,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 +21146,26 @@ func (ec *executionContext) _AbstractMarginLevels_collateralReleaseLevel(ctx con } return graphql.Null } - res := resTmp.(string) + res := resTmp.(v1.AMM_Status) fc.Result = res - return ec.marshalNString2string(ctx, field.Selections, res) + return ec.marshalNAMMStatus2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_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_AMM_status(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMM", 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 AMMStatus 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) _AMM_statusReason(ctx context.Context, field graphql.CollectedField, obj *v1.AMM) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMM_statusReason(ctx, field) if err != nil { return graphql.Null } @@ -20297,7 +21178,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 +21190,26 @@ func (ec *executionContext) _AbstractMarginLevels_marginMode(ctx context.Context } return graphql.Null } - res := resTmp.(vega.MarginMode) + res := resTmp.(v1.AMM_StatusReason) fc.Result = res - return ec.marshalNMarginMode2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐMarginMode(ctx, field.Selections, res) + return ec.marshalNAMMStatusReason2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_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_AMM_statusReason(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMM", 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 AMMStatusReason 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) _AMM_proposedFee(ctx context.Context, field graphql.CollectedField, obj *v1.AMM) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMM_proposedFee(ctx, field) if err != nil { return graphql.Null } @@ -20341,26 +21222,23 @@ 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.ProposedFee, 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) + return ec.marshalOString2string(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_AMM_proposedFee(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AbstractMarginLevels", + Object: "AMM", Field: field, IsMethod: false, IsResolver: false, @@ -20371,8 +21249,8 @@ func (ec *executionContext) fieldContext_AbstractMarginLevels_marginFactor(ctx c 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) _AMMConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.AMMConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMConnection_edges(ctx, field) if err != nil { return graphql.Null } @@ -20385,38 +21263,92 @@ 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.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.([]*v2.AMMEdge) + fc.Result = res + return ec.marshalOAMMEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMEdge(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_AMMConnection_edges(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "AMMConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "node": + return ec.fieldContext_AMMEdge_node(ctx, field) + case "cursor": + return ec.fieldContext_AMMEdge_cursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AMMEdge", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _AMMConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *v2.AMMConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMConnection_pageInfo(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.PageInfo, nil + }) + if err != nil { + ec.Error(ctx, err) return graphql.Null } - res := resTmp.(string) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*v2.PageInfo) fc.Result = res - return ec.marshalNString2string(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_balance(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMConnection_pageInfo(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountBalance", + Object: "AMMConnection", 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 "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_asset(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { - fc, err := ec.fieldContext_AccountBalance_asset(ctx, field) +func (ec *executionContext) _AMMEdge_node(ctx context.Context, field graphql.CollectedField, obj *v2.AMMEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMEdge_node(ctx, field) if err != nil { return graphql.Null } @@ -20429,7 +21361,7 @@ 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.Node, nil }) if err != nil { ec.Error(ctx, err) @@ -20441,58 +21373,46 @@ func (ec *executionContext) _AccountBalance_asset(ctx context.Context, field gra } return graphql.Null } - res := resTmp.(*vega.Asset) + res := resTmp.(*v1.AMM) fc.Result = res - return ec.marshalNAsset2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐAsset(ctx, field.Selections, res) + return ec.marshalNAMM2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM(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_AMMEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountBalance", + Object: "AMMEdge", 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) + return ec.fieldContext_AMM_id(ctx, field) + case "partyId": + return ec.fieldContext_AMM_partyId(ctx, field) + case "marketId": + return ec.fieldContext_AMM_marketId(ctx, field) + case "ammPartyId": + return ec.fieldContext_AMM_ammPartyId(ctx, field) + case "commitment": + return ec.fieldContext_AMM_commitment(ctx, field) + case "parameters": + return ec.fieldContext_AMM_parameters(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 ec.fieldContext_AMM_status(ctx, field) + case "statusReason": + return ec.fieldContext_AMM_statusReason(ctx, field) + case "proposedFee": + return ec.fieldContext_AMM_proposedFee(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 AMM", 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) _AMMEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *v2.AMMEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AMMEdge_cursor(ctx, field) if err != nil { return graphql.Null } @@ -20505,7 +21425,7 @@ 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.Cursor, nil }) if err != nil { ec.Error(ctx, err) @@ -20517,26 +21437,26 @@ func (ec *executionContext) _AccountBalance_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_AccountBalance_type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_AMMEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ - Object: "AccountBalance", + Object: "AMMEdge", 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) _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 +21469,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": @@ -20633,6 +21556,8 @@ func (ec *executionContext) fieldContext_AccountBalance_market(ctx context.Conte return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -20640,8 +21565,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 +21579,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 +21655,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 +21669,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 +21699,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 +21711,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 +21743,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 +21787,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 +21831,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 +21843,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 +21875,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 +21936,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 +21949,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 +21980,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 +21993,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 +22007,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 +22024,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 +22069,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 +22100,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 +22113,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 +22127,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 +22141,9 @@ 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, @@ -21255,6 +22211,717 @@ func (ec *executionContext) fieldContext_AccountEvent_market(ctx context.Context return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(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) _AccountBalance_parentPartyId(ctx context.Context, field graphql.CollectedField, obj *v2.AccountBalance) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_AccountBalance_parentPartyId(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().ParentPartyID(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_parentPartyId(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) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(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, + 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) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -23243,6 +24910,8 @@ func (ec *executionContext) fieldContext_Asset_infrastructureFeeAccount(ctx cont return ec.fieldContext_AccountBalance_market(ctx, field) case "party": return ec.fieldContext_AccountBalance_party(ctx, field) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) }, @@ -23296,6 +24965,8 @@ func (ec *executionContext) fieldContext_Asset_globalRewardPoolAccount(ctx conte return ec.fieldContext_AccountBalance_market(ctx, field) case "party": return ec.fieldContext_AccountBalance_party(ctx, field) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) }, @@ -23349,6 +25020,8 @@ func (ec *executionContext) fieldContext_Asset_globalInsuranceAccount(ctx contex return ec.fieldContext_AccountBalance_market(ctx, field) case "party": return ec.fieldContext_AccountBalance_party(ctx, field) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) }, @@ -23402,6 +25075,8 @@ func (ec *executionContext) fieldContext_Asset_networkTreasuryAccount(ctx contex return ec.fieldContext_AccountBalance_market(ctx, field) case "party": return ec.fieldContext_AccountBalance_party(ctx, field) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) }, @@ -23455,6 +25130,8 @@ func (ec *executionContext) fieldContext_Asset_takerFeeRewardAccount(ctx context return ec.fieldContext_AccountBalance_market(ctx, field) case "party": return ec.fieldContext_AccountBalance_party(ctx, field) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) }, @@ -23508,6 +25185,8 @@ func (ec *executionContext) fieldContext_Asset_makerFeeRewardAccount(ctx context return ec.fieldContext_AccountBalance_market(ctx, field) case "party": return ec.fieldContext_AccountBalance_party(ctx, field) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) }, @@ -23561,6 +25240,8 @@ func (ec *executionContext) fieldContext_Asset_lpFeeRewardAccount(ctx context.Co return ec.fieldContext_AccountBalance_market(ctx, field) case "party": return ec.fieldContext_AccountBalance_party(ctx, field) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) }, @@ -23614,6 +25295,8 @@ func (ec *executionContext) fieldContext_Asset_marketProposerRewardAccount(ctx c return ec.fieldContext_AccountBalance_market(ctx, field) case "party": return ec.fieldContext_AccountBalance_party(ctx, field) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) }, @@ -26801,6 +28484,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.AMM_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.AMM_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.marshalNString2ᚖstring(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.AMM_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.marshalNString2ᚖstring(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_leverageAtUpperBound(ctx context.Context, field graphql.CollectedField, obj *v1.AMM_ConcentratedLiquidityParameters) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ConcentratedLiquidityParameters_leverageAtUpperBound(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.LeverageAtUpperBound, 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.marshalNString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ConcentratedLiquidityParameters_leverageAtUpperBound(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_leverageAtLowerBound(ctx context.Context, field graphql.CollectedField, obj *v1.AMM_ConcentratedLiquidityParameters) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_ConcentratedLiquidityParameters_leverageAtLowerBound(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.LeverageAtLowerBound, 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.marshalNString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_ConcentratedLiquidityParameters_leverageAtLowerBound(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 { @@ -32189,6 +34092,8 @@ func (ec *executionContext) fieldContext_Entities_balanceChanges(ctx context.Con return ec.fieldContext_AccountBalance_market(ctx, field) case "party": return ec.fieldContext_AccountBalance_party(ctx, field) + case "parentPartyId": + return ec.fieldContext_AccountBalance_parentPartyId(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type AccountBalance", field.Name) }, @@ -32701,6 +34606,8 @@ func (ec *executionContext) fieldContext_Entities_markets(ctx context.Context, f return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -35380,6 +37287,252 @@ func (ec *executionContext) fieldContext_Erc20WithdrawalDetails_receiverAddress( return fc, nil } +func (ec *executionContext) _EstimatedAMMBounds_positionSizeAtUpper(ctx context.Context, field graphql.CollectedField, obj *v2.EstimateAMMBoundsResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EstimatedAMMBounds_positionSizeAtUpper(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.PositionSizeAtUpper, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_EstimatedAMMBounds_positionSizeAtUpper(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EstimatedAMMBounds", + 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) _EstimatedAMMBounds_positionSizeAtLower(ctx context.Context, field graphql.CollectedField, obj *v2.EstimateAMMBoundsResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EstimatedAMMBounds_positionSizeAtLower(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.PositionSizeAtLower, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_EstimatedAMMBounds_positionSizeAtLower(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EstimatedAMMBounds", + 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) _EstimatedAMMBounds_lossOnCommitmentAtUpper(ctx context.Context, field graphql.CollectedField, obj *v2.EstimateAMMBoundsResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EstimatedAMMBounds_lossOnCommitmentAtUpper(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.LossOnCommitmentAtUpper, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_EstimatedAMMBounds_lossOnCommitmentAtUpper(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EstimatedAMMBounds", + 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) _EstimatedAMMBounds_lossOnCommitmentAtLower(ctx context.Context, field graphql.CollectedField, obj *v2.EstimateAMMBoundsResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EstimatedAMMBounds_lossOnCommitmentAtLower(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.LossOnCommitmentAtLower, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_EstimatedAMMBounds_lossOnCommitmentAtLower(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EstimatedAMMBounds", + 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) _EstimatedAMMBounds_liquidationPriceAtUpper(ctx context.Context, field graphql.CollectedField, obj *v2.EstimateAMMBoundsResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EstimatedAMMBounds_liquidationPriceAtUpper(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.LiquidationPriceAtUpper, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_EstimatedAMMBounds_liquidationPriceAtUpper(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EstimatedAMMBounds", + 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) _EstimatedAMMBounds_liquidationPriceAtLower(ctx context.Context, field graphql.CollectedField, obj *v2.EstimateAMMBoundsResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_EstimatedAMMBounds_liquidationPriceAtLower(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.LiquidationPriceAtLower, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_EstimatedAMMBounds_liquidationPriceAtLower(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EstimatedAMMBounds", + 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) _EstimatedTransferFee_fee(ctx context.Context, field graphql.CollectedField, obj *v2.EstimateTransferFeeResponse) (ret graphql.Marshaler) { fc, err := ec.fieldContext_EstimatedTransferFee_fee(ctx, field) if err != nil { @@ -39411,6 +41564,181 @@ func (ec *executionContext) fieldContext_Future_dataSourceSpecBinding(ctx contex return fc, nil } +func (ec *executionContext) _Future_cap(ctx context.Context, field graphql.CollectedField, obj *vega.Future) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Future_cap(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.Cap, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*vega.FutureCap) + fc.Result = res + return ec.marshalOFutureCap2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐFutureCap(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Future_cap(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Future", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "maxPrice": + return ec.fieldContext_FutureCap_maxPrice(ctx, field) + case "binarySettlement": + return ec.fieldContext_FutureCap_binarySettlement(ctx, field) + case "fullyCollateralised": + return ec.fieldContext_FutureCap_fullyCollateralised(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type FutureCap", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _FutureCap_maxPrice(ctx context.Context, field graphql.CollectedField, obj *vega.FutureCap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FutureCap_maxPrice(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.MaxPrice, 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_FutureCap_maxPrice(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "FutureCap", + 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) _FutureCap_binarySettlement(ctx context.Context, field graphql.CollectedField, obj *vega.FutureCap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FutureCap_binarySettlement(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.BinarySettlement, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*bool) + fc.Result = res + return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_FutureCap_binarySettlement(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "FutureCap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _FutureCap_fullyCollateralised(ctx context.Context, field graphql.CollectedField, obj *vega.FutureCap) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FutureCap_fullyCollateralised(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.FullyCollateralised, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*bool) + fc.Result = res + return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_FutureCap_fullyCollateralised(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "FutureCap", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _FutureProduct_settlementAsset(ctx context.Context, field graphql.CollectedField, obj *vega.FutureProduct) (ret graphql.Marshaler) { fc, err := ec.fieldContext_FutureProduct_settlementAsset(ctx, field) if err != nil { @@ -39677,6 +42005,55 @@ func (ec *executionContext) fieldContext_FutureProduct_dataSourceSpecBinding(ctx return fc, nil } +func (ec *executionContext) _FutureProduct_cap(ctx context.Context, field graphql.CollectedField, obj *vega.FutureProduct) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_FutureProduct_cap(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.Cap, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*vega.FutureCap) + fc.Result = res + return ec.marshalOFutureCap2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐFutureCap(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_FutureProduct_cap(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "FutureProduct", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "maxPrice": + return ec.fieldContext_FutureCap_maxPrice(ctx, field) + case "binarySettlement": + return ec.fieldContext_FutureCap_binarySettlement(ctx, field) + case "fullyCollateralised": + return ec.fieldContext_FutureCap_fullyCollateralised(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type FutureCap", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _Game_id(ctx context.Context, field graphql.CollectedField, obj *v2.Game) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Game_id(ctx, field) if err != nil { @@ -39997,6 +42374,1094 @@ func (ec *executionContext) fieldContext_GameEdge_cursor(ctx context.Context, fi return fc, nil } +func (ec *executionContext) _GamePartyScore_gameId(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_gameId(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.GameId, 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_GamePartyScore_gameId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + 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) _GamePartyScore_teamId(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_teamId(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.TeamId, 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_GamePartyScore_teamId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + 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) _GamePartyScore_epochId(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_epochId(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.GamePartyScore().EpochID(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.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScore_epochId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _GamePartyScore_partyId(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_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.GamePartyScore().PartyID(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.(string) + fc.Result = res + return ec.marshalNID2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScore_partyId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + 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) _GamePartyScore_time(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_time(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.Time, 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.(int64) + fc.Result = res + return ec.marshalNTimestamp2int64(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScore_time(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Timestamp does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _GamePartyScore_score(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_score(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.Score, 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_GamePartyScore_score(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + 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) _GamePartyScore_stakingBalance(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_stakingBalance(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.StakingBalance, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScore_stakingBalance(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + 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) _GamePartyScore_openVolume(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_openVolume(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.OpenVolume, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScore_openVolume(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + 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) _GamePartyScore_totalFeesPaid(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_totalFeesPaid(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.TotalFeesPaid, 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_GamePartyScore_totalFeesPaid(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + 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) _GamePartyScore_isEligible(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_isEligible(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.IsEligible, 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.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScore_isEligible(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _GamePartyScore_rank(ctx context.Context, field graphql.CollectedField, obj *v1.GamePartyScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScore_rank(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.GamePartyScore().Rank(rctx, obj) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*int) + fc.Result = res + return ec.marshalOInt2ᚖint(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScore_rank(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScore", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _GamePartyScoreConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.GamePartyScoresConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScoreConnection_edges(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.Edges, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]*v2.GamePartyScoresEdge) + fc.Result = res + return ec.marshalOGamePartyScoreEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGamePartyScoresEdgeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScoreConnection_edges(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScoreConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "node": + return ec.fieldContext_GamePartyScoreEdge_node(ctx, field) + case "cursor": + return ec.fieldContext_GamePartyScoreEdge_cursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type GamePartyScoreEdge", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _GamePartyScoreConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *v2.GamePartyScoresConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScoreConnection_pageInfo(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.PageInfo, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*v2.PageInfo) + fc.Result = res + return ec.marshalOPageInfo2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPageInfo(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScoreConnection_pageInfo(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScoreConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + 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) _GamePartyScoreEdge_node(ctx context.Context, field graphql.CollectedField, obj *v2.GamePartyScoresEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScoreEdge_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 { + return graphql.Null + } + res := resTmp.(*v1.GamePartyScore) + fc.Result = res + return ec.marshalOGamePartyScore2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐGamePartyScore(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScoreEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScoreEdge", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "gameId": + return ec.fieldContext_GamePartyScore_gameId(ctx, field) + case "teamId": + return ec.fieldContext_GamePartyScore_teamId(ctx, field) + case "epochId": + return ec.fieldContext_GamePartyScore_epochId(ctx, field) + case "partyId": + return ec.fieldContext_GamePartyScore_partyId(ctx, field) + case "time": + return ec.fieldContext_GamePartyScore_time(ctx, field) + case "score": + return ec.fieldContext_GamePartyScore_score(ctx, field) + case "stakingBalance": + return ec.fieldContext_GamePartyScore_stakingBalance(ctx, field) + case "openVolume": + return ec.fieldContext_GamePartyScore_openVolume(ctx, field) + case "totalFeesPaid": + return ec.fieldContext_GamePartyScore_totalFeesPaid(ctx, field) + case "isEligible": + return ec.fieldContext_GamePartyScore_isEligible(ctx, field) + case "rank": + return ec.fieldContext_GamePartyScore_rank(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type GamePartyScore", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _GamePartyScoreEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *v2.GamePartyScoresEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GamePartyScoreEdge_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 { + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GamePartyScoreEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GamePartyScoreEdge", + 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) _GameTeamScore_gameId(ctx context.Context, field graphql.CollectedField, obj *v1.GameTeamScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GameTeamScore_gameId(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.GameId, 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_GameTeamScore_gameId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GameTeamScore", + 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) _GameTeamScore_teamId(ctx context.Context, field graphql.CollectedField, obj *v1.GameTeamScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GameTeamScore_teamId(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.TeamId, 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_GameTeamScore_teamId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GameTeamScore", + 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) _GameTeamScore_epochId(ctx context.Context, field graphql.CollectedField, obj *v1.GameTeamScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GameTeamScore_epochId(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.GameTeamScore().EpochID(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.(int) + fc.Result = res + return ec.marshalNInt2int(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GameTeamScore_epochId(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GameTeamScore", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Int does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _GameTeamScore_time(ctx context.Context, field graphql.CollectedField, obj *v1.GameTeamScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GameTeamScore_time(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.Time, 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.(int64) + fc.Result = res + return ec.marshalNTimestamp2int64(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GameTeamScore_time(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GameTeamScore", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Timestamp does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _GameTeamScore_score(ctx context.Context, field graphql.CollectedField, obj *v1.GameTeamScore) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GameTeamScore_score(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.Score, 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_GameTeamScore_score(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GameTeamScore", + 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) _GameTeamScoreConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.GameTeamScoresConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GameTeamScoreConnection_edges(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.Edges, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]*v2.GameTeamScoresEdge) + fc.Result = res + return ec.marshalOGameTeamScoreEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGameTeamScoresEdgeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GameTeamScoreConnection_edges(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GameTeamScoreConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "node": + return ec.fieldContext_GameTeamScoreEdge_node(ctx, field) + case "cursor": + return ec.fieldContext_GameTeamScoreEdge_cursor(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type GameTeamScoreEdge", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _GameTeamScoreConnection_pageInfo(ctx context.Context, field graphql.CollectedField, obj *v2.GameTeamScoresConnection) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GameTeamScoreConnection_pageInfo(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.PageInfo, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*v2.PageInfo) + fc.Result = res + return ec.marshalOPageInfo2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐPageInfo(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GameTeamScoreConnection_pageInfo(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GameTeamScoreConnection", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + 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) _GameTeamScoreEdge_node(ctx context.Context, field graphql.CollectedField, obj *v2.GameTeamScoresEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GameTeamScoreEdge_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 { + return graphql.Null + } + res := resTmp.(*v1.GameTeamScore) + fc.Result = res + return ec.marshalOGameTeamScore2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐGameTeamScore(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GameTeamScoreEdge_node(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GameTeamScoreEdge", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "gameId": + return ec.fieldContext_GameTeamScore_gameId(ctx, field) + case "teamId": + return ec.fieldContext_GameTeamScore_teamId(ctx, field) + case "epochId": + return ec.fieldContext_GameTeamScore_epochId(ctx, field) + case "time": + return ec.fieldContext_GameTeamScore_time(ctx, field) + case "score": + return ec.fieldContext_GameTeamScore_score(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type GameTeamScore", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _GameTeamScoreEdge_cursor(ctx context.Context, field graphql.CollectedField, obj *v2.GameTeamScoresEdge) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_GameTeamScoreEdge_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 { + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_GameTeamScoreEdge_cursor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "GameTeamScoreEdge", + 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) _GamesConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.GamesConnection) (ret graphql.Marshaler) { fc, err := ec.fieldContext_GamesConnection_edges(ctx, field) if err != nil { @@ -41069,6 +44534,8 @@ func (ec *executionContext) fieldContext_InstrumentConfiguration_futureProduct(c return ec.fieldContext_FutureProduct_dataSourceSpecForTradingTermination(ctx, field) case "dataSourceSpecBinding": return ec.fieldContext_FutureProduct_dataSourceSpecBinding(ctx, field) + case "cap": + return ec.fieldContext_FutureProduct_cap(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type FutureProduct", field.Name) }, @@ -44219,6 +47686,8 @@ func (ec *executionContext) fieldContext_LiquidityProvision_market(ctx context.C return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -46072,6 +49541,53 @@ func (ec *executionContext) fieldContext_LogNormalRiskModel_params(ctx context.C return fc, nil } +func (ec *executionContext) _LogNormalRiskModel_riskFactorOverride(ctx context.Context, field graphql.CollectedField, obj *vega.LogNormalRiskModel) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_LogNormalRiskModel_riskFactorOverride(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.RiskFactorOverride, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*vega.RiskFactorOverride) + fc.Result = res + return ec.marshalORiskFactorOverride2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐRiskFactorOverride(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_LogNormalRiskModel_riskFactorOverride(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "LogNormalRiskModel", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "short": + return ec.fieldContext_RiskFactorOverride_short(ctx, field) + case "long": + return ec.fieldContext_RiskFactorOverride_long(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type RiskFactorOverride", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _LossSocialization_marketId(ctx context.Context, field graphql.CollectedField, obj *LossSocialization) (ret graphql.Marshaler) { fc, err := ec.fieldContext_LossSocialization_marketId(ctx, field) if err != nil { @@ -46350,6 +49866,47 @@ func (ec *executionContext) fieldContext_MarginCalculator_scalingFactors(ctx con return fc, nil } +func (ec *executionContext) _MarginCalculator_fullyCollateralised(ctx context.Context, field graphql.CollectedField, obj *vega.MarginCalculator) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_MarginCalculator_fullyCollateralised(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.FullyCollateralised, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*bool) + fc.Result = res + return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_MarginCalculator_fullyCollateralised(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "MarginCalculator", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _MarginConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.MarginConnection) (ret graphql.Marshaler) { fc, err := ec.fieldContext_MarginConnection_edges(ctx, field) if err != nil { @@ -46786,6 +50343,8 @@ func (ec *executionContext) fieldContext_MarginLevels_market(ctx context.Context return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -48443,7 +52002,7 @@ func (ec *executionContext) _Market_accountsConnection(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.Market().AccountsConnection(rctx, obj, fc.Args["partyId"].(*string), fc.Args["pagination"].(*v2.Pagination)) + return ec.resolvers.Market().AccountsConnection(rctx, obj, fc.Args["partyId"].(*string), fc.Args["pagination"].(*v2.Pagination), fc.Args["includeDerivedParties"].(*bool)) }) if err != nil { ec.Error(ctx, err) @@ -49425,6 +52984,50 @@ func (ec *executionContext) fieldContext_Market_tickSize(ctx context.Context, fi return fc, nil } +func (ec *executionContext) _Market_enableTxReordering(ctx context.Context, field graphql.CollectedField, obj *vega.Market) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Market_enableTxReordering(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.Market().EnableTxReordering(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.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Market_enableTxReordering(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Market", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _MarketConnection_edges(ctx context.Context, field graphql.CollectedField, obj *v2.MarketConnection) (ret graphql.Marshaler) { fc, err := ec.fieldContext_MarketConnection_edges(ctx, field) if err != nil { @@ -49630,6 +53233,8 @@ func (ec *executionContext) fieldContext_MarketData_market(ctx context.Context, return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -50775,6 +54380,8 @@ func (ec *executionContext) fieldContext_MarketData_priceMonitoringBounds(ctx co return ec.fieldContext_PriceMonitoringBounds_trigger(ctx, field) case "referencePrice": return ec.fieldContext_PriceMonitoringBounds_referencePrice(ctx, field) + case "active": + return ec.fieldContext_PriceMonitoringBounds_active(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type PriceMonitoringBounds", field.Name) }, @@ -51654,6 +55261,8 @@ func (ec *executionContext) fieldContext_MarketDepth_market(ctx context.Context, return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -51701,6 +55310,10 @@ func (ec *executionContext) fieldContext_MarketDepth_buy(ctx context.Context, fi return ec.fieldContext_PriceLevel_price(ctx, field) case "volume": return ec.fieldContext_PriceLevel_volume(ctx, field) + case "ammVolume": + return ec.fieldContext_PriceLevel_ammVolume(ctx, field) + case "ammVolumeEstimated": + return ec.fieldContext_PriceLevel_ammVolumeEstimated(ctx, field) case "numberOfOrders": return ec.fieldContext_PriceLevel_numberOfOrders(ctx, field) } @@ -51750,6 +55363,10 @@ func (ec *executionContext) fieldContext_MarketDepth_sell(ctx context.Context, f return ec.fieldContext_PriceLevel_price(ctx, field) case "volume": return ec.fieldContext_PriceLevel_volume(ctx, field) + case "ammVolume": + return ec.fieldContext_PriceLevel_ammVolume(ctx, field) + case "ammVolumeEstimated": + return ec.fieldContext_PriceLevel_ammVolumeEstimated(ctx, field) case "numberOfOrders": return ec.fieldContext_PriceLevel_numberOfOrders(ctx, field) } @@ -52109,6 +55726,8 @@ func (ec *executionContext) fieldContext_MarketDepthUpdate_market(ctx context.Co return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -52156,6 +55775,10 @@ func (ec *executionContext) fieldContext_MarketDepthUpdate_buy(ctx context.Conte return ec.fieldContext_PriceLevel_price(ctx, field) case "volume": return ec.fieldContext_PriceLevel_volume(ctx, field) + case "ammVolume": + return ec.fieldContext_PriceLevel_ammVolume(ctx, field) + case "ammVolumeEstimated": + return ec.fieldContext_PriceLevel_ammVolumeEstimated(ctx, field) case "numberOfOrders": return ec.fieldContext_PriceLevel_numberOfOrders(ctx, field) } @@ -52205,6 +55828,10 @@ func (ec *executionContext) fieldContext_MarketDepthUpdate_sell(ctx context.Cont return ec.fieldContext_PriceLevel_price(ctx, field) case "volume": return ec.fieldContext_PriceLevel_volume(ctx, field) + case "ammVolume": + return ec.fieldContext_PriceLevel_ammVolume(ctx, field) + case "ammVolumeEstimated": + return ec.fieldContext_PriceLevel_ammVolumeEstimated(ctx, field) case "numberOfOrders": return ec.fieldContext_PriceLevel_numberOfOrders(ctx, field) } @@ -52403,6 +56030,8 @@ func (ec *executionContext) fieldContext_MarketEdge_node(ctx context.Context, fi return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -54458,6 +58087,50 @@ func (ec *executionContext) fieldContext_NewMarket_tickSize(ctx context.Context, return fc, nil } +func (ec *executionContext) _NewMarket_enableTxReordering(ctx context.Context, field graphql.CollectedField, obj *vega.NewMarket) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_NewMarket_enableTxReordering(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.NewMarket().EnableTxReordering(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.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_NewMarket_enableTxReordering(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "NewMarket", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _NewSpotMarket_instrument(ctx context.Context, field graphql.CollectedField, obj *vega.NewSpotMarket) (ret graphql.Marshaler) { fc, err := ec.fieldContext_NewSpotMarket_instrument(ctx, field) if err != nil { @@ -54928,6 +58601,50 @@ func (ec *executionContext) fieldContext_NewSpotMarket_tickSize(ctx context.Cont return fc, nil } +func (ec *executionContext) _NewSpotMarket_enableTxReordering(ctx context.Context, field graphql.CollectedField, obj *vega.NewSpotMarket) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_NewSpotMarket_enableTxReordering(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.NewSpotMarket().EnableTxReordering(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.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_NewSpotMarket_enableTxReordering(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "NewSpotMarket", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _NewTransfer_source(ctx context.Context, field graphql.CollectedField, obj *vega.NewTransfer) (ret graphql.Marshaler) { fc, err := ec.fieldContext_NewTransfer_source(ctx, field) if err != nil { @@ -59383,6 +63100,8 @@ func (ec *executionContext) fieldContext_ObservableMarketData_priceMonitoringBou return ec.fieldContext_PriceMonitoringBounds_trigger(ctx, field) case "referencePrice": return ec.fieldContext_PriceMonitoringBounds_referencePrice(ctx, field) + case "active": + return ec.fieldContext_PriceMonitoringBounds_active(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type PriceMonitoringBounds", field.Name) }, @@ -59892,6 +63611,10 @@ func (ec *executionContext) fieldContext_ObservableMarketDepth_buy(ctx context.C return ec.fieldContext_PriceLevel_price(ctx, field) case "volume": return ec.fieldContext_PriceLevel_volume(ctx, field) + case "ammVolume": + return ec.fieldContext_PriceLevel_ammVolume(ctx, field) + case "ammVolumeEstimated": + return ec.fieldContext_PriceLevel_ammVolumeEstimated(ctx, field) case "numberOfOrders": return ec.fieldContext_PriceLevel_numberOfOrders(ctx, field) } @@ -59941,6 +63664,10 @@ func (ec *executionContext) fieldContext_ObservableMarketDepth_sell(ctx context. return ec.fieldContext_PriceLevel_price(ctx, field) case "volume": return ec.fieldContext_PriceLevel_volume(ctx, field) + case "ammVolume": + return ec.fieldContext_PriceLevel_ammVolume(ctx, field) + case "ammVolumeEstimated": + return ec.fieldContext_PriceLevel_ammVolumeEstimated(ctx, field) case "numberOfOrders": return ec.fieldContext_PriceLevel_numberOfOrders(ctx, field) } @@ -60130,6 +63857,10 @@ func (ec *executionContext) fieldContext_ObservableMarketDepthUpdate_buy(ctx con return ec.fieldContext_PriceLevel_price(ctx, field) case "volume": return ec.fieldContext_PriceLevel_volume(ctx, field) + case "ammVolume": + return ec.fieldContext_PriceLevel_ammVolume(ctx, field) + case "ammVolumeEstimated": + return ec.fieldContext_PriceLevel_ammVolumeEstimated(ctx, field) case "numberOfOrders": return ec.fieldContext_PriceLevel_numberOfOrders(ctx, field) } @@ -60179,6 +63910,10 @@ func (ec *executionContext) fieldContext_ObservableMarketDepthUpdate_sell(ctx co return ec.fieldContext_PriceLevel_price(ctx, field) case "volume": return ec.fieldContext_PriceLevel_volume(ctx, field) + case "ammVolume": + return ec.fieldContext_PriceLevel_ammVolume(ctx, field) + case "ammVolumeEstimated": + return ec.fieldContext_PriceLevel_ammVolumeEstimated(ctx, field) case "numberOfOrders": return ec.fieldContext_PriceLevel_numberOfOrders(ctx, field) } @@ -61180,6 +64915,8 @@ func (ec *executionContext) fieldContext_Order_market(ctx context.Context, field return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -64649,7 +68386,7 @@ func (ec *executionContext) _Party_accountsConnection(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 ec.resolvers.Party().AccountsConnection(rctx, obj, fc.Args["marketId"].(*string), fc.Args["assetId"].(*string), fc.Args["type"].(*vega.AccountType), fc.Args["pagination"].(*v2.Pagination)) + return ec.resolvers.Party().AccountsConnection(rctx, obj, fc.Args["marketId"].(*string), fc.Args["assetId"].(*string), fc.Args["type"].(*vega.AccountType), fc.Args["pagination"].(*v2.Pagination), fc.Args["includeDerivedParties"].(*bool)) }) if err != nil { ec.Error(ctx, err) @@ -65290,7 +69027,7 @@ func (ec *executionContext) _Party_rewardsConnection(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 ec.resolvers.Party().RewardsConnection(rctx, obj, fc.Args["assetId"].(*string), fc.Args["pagination"].(*v2.Pagination), fc.Args["fromEpoch"].(*int), fc.Args["toEpoch"].(*int), fc.Args["teamId"].(*string), fc.Args["gameId"].(*string)) + return ec.resolvers.Party().RewardsConnection(rctx, obj, fc.Args["assetId"].(*string), fc.Args["pagination"].(*v2.Pagination), fc.Args["fromEpoch"].(*int), fc.Args["toEpoch"].(*int), fc.Args["teamId"].(*string), fc.Args["gameId"].(*string), fc.Args["includeDerivedParties"].(*bool), fc.Args["marketId"].(*string)) }) if err != nil { ec.Error(ctx, err) @@ -65348,7 +69085,7 @@ func (ec *executionContext) _Party_rewardSummaries(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.Party().RewardSummaries(rctx, obj, fc.Args["assetId"].(*string)) + return ec.resolvers.Party().RewardSummaries(rctx, obj, fc.Args["assetId"].(*string), fc.Args["includeDerivedParties"].(*bool)) }) if err != nil { ec.Error(ctx, err) @@ -65627,6 +69364,10 @@ func (ec *executionContext) fieldContext_Party_vestingStats(ctx context.Context, return ec.fieldContext_PartyVestingStats_rewardBonusMultiplier(ctx, field) case "quantumBalance": return ec.fieldContext_PartyVestingStats_quantumBalance(ctx, field) + case "summedRewardBonusMultiplier": + return ec.fieldContext_PartyVestingStats_summedRewardBonusMultiplier(ctx, field) + case "summedQuantumBalance": + return ec.fieldContext_PartyVestingStats_summedQuantumBalance(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type PartyVestingStats", field.Name) }, @@ -67701,6 +71442,88 @@ func (ec *executionContext) fieldContext_PartyVestingStats_quantumBalance(ctx co return fc, nil } +func (ec *executionContext) _PartyVestingStats_summedRewardBonusMultiplier(ctx context.Context, field graphql.CollectedField, obj *v2.GetPartyVestingStatsResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PartyVestingStats_summedRewardBonusMultiplier(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.SummedRewardBonusMultiplier, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PartyVestingStats_summedRewardBonusMultiplier(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PartyVestingStats", + 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) _PartyVestingStats_summedQuantumBalance(ctx context.Context, field graphql.CollectedField, obj *v2.GetPartyVestingStatsResponse) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PartyVestingStats_summedQuantumBalance(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.SummedQuantumBalance, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PartyVestingStats_summedQuantumBalance(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PartyVestingStats", + 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) _PeggedOrder_reference(ctx context.Context, field graphql.CollectedField, obj *vega.PeggedOrder) (ret graphql.Marshaler) { fc, err := ec.fieldContext_PeggedOrder_reference(ctx, field) if err != nil { @@ -69568,6 +73391,8 @@ func (ec *executionContext) fieldContext_Position_market(ctx context.Context, fi return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -71033,6 +74858,94 @@ func (ec *executionContext) fieldContext_PriceLevel_volume(ctx context.Context, return fc, nil } +func (ec *executionContext) _PriceLevel_ammVolume(ctx context.Context, field graphql.CollectedField, obj *vega.PriceLevel) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PriceLevel_ammVolume(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.PriceLevel().AmmVolume(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.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PriceLevel_ammVolume(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PriceLevel", + Field: field, + IsMethod: true, + IsResolver: true, + 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) _PriceLevel_ammVolumeEstimated(ctx context.Context, field graphql.CollectedField, obj *vega.PriceLevel) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PriceLevel_ammVolumeEstimated(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.PriceLevel().AmmVolumeEstimated(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.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PriceLevel_ammVolumeEstimated(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PriceLevel", + Field: field, + IsMethod: true, + IsResolver: true, + 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) _PriceLevel_numberOfOrders(ctx context.Context, field graphql.CollectedField, obj *vega.PriceLevel) (ret graphql.Marshaler) { fc, err := ec.fieldContext_PriceLevel_numberOfOrders(ctx, field) if err != nil { @@ -71261,6 +75174,47 @@ func (ec *executionContext) fieldContext_PriceMonitoringBounds_referencePrice(ct return fc, nil } +func (ec *executionContext) _PriceMonitoringBounds_active(ctx context.Context, field graphql.CollectedField, obj *PriceMonitoringBounds) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_PriceMonitoringBounds_active(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.Active, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*bool) + fc.Result = res + return ec.marshalOBoolean2ᚖbool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_PriceMonitoringBounds_active(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "PriceMonitoringBounds", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _PriceMonitoringParameters_triggers(ctx context.Context, field graphql.CollectedField, obj *PriceMonitoringParameters) (ret graphql.Marshaler) { fc, err := ec.fieldContext_PriceMonitoringParameters_triggers(ctx, field) if err != nil { @@ -74861,6 +78815,67 @@ func (ec *executionContext) fieldContext_QuantumVolumesPerEpoch_totalQuantumVolu return fc, nil } +func (ec *executionContext) _Query_amms(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_amms(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().Amms(rctx, fc.Args["id"].(*string), fc.Args["partyId"].(*string), fc.Args["marketId"].(*string), fc.Args["ammPartyId"].(*string), fc.Args["status"].(*v1.AMM_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.AMMConnection) + fc.Result = res + return ec.marshalNAMMConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMConnection(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_amms(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_AMMConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_AMMConnection_pageInfo(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type AMMConnection", 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_amms_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 { @@ -76103,6 +80118,72 @@ func (ec *executionContext) fieldContext_Query_estimatePosition(ctx context.Cont return fc, nil } +func (ec *executionContext) _Query_estimateAMMBounds(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_estimateAMMBounds(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().EstimateAMMBounds(rctx, fc.Args["basePrice"].(string), fc.Args["upperPrice"].(*string), fc.Args["lowerPrice"].(*string), fc.Args["leverageAtUpperPrice"].(*string), fc.Args["leverageAtLowerPrice"].(*string), fc.Args["commitmentAmount"].(string), fc.Args["marketId"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*v2.EstimateAMMBoundsResponse) + fc.Result = res + return ec.marshalOEstimatedAMMBounds2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐEstimateAMMBoundsResponse(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_estimateAMMBounds(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 "positionSizeAtUpper": + return ec.fieldContext_EstimatedAMMBounds_positionSizeAtUpper(ctx, field) + case "positionSizeAtLower": + return ec.fieldContext_EstimatedAMMBounds_positionSizeAtLower(ctx, field) + case "lossOnCommitmentAtUpper": + return ec.fieldContext_EstimatedAMMBounds_lossOnCommitmentAtUpper(ctx, field) + case "lossOnCommitmentAtLower": + return ec.fieldContext_EstimatedAMMBounds_lossOnCommitmentAtLower(ctx, field) + case "liquidationPriceAtUpper": + return ec.fieldContext_EstimatedAMMBounds_liquidationPriceAtUpper(ctx, field) + case "liquidationPriceAtLower": + return ec.fieldContext_EstimatedAMMBounds_liquidationPriceAtLower(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type EstimatedAMMBounds", 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_estimateAMMBounds_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Query_ethereumKeyRotations(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_ethereumKeyRotations(ctx, field) if err != nil { @@ -76236,7 +80317,7 @@ func (ec *executionContext) _Query_feesStats(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 ec.resolvers.Query().FeesStats(rctx, fc.Args["marketId"].(*string), fc.Args["assetId"].(*string), fc.Args["epoch"].(*int), fc.Args["partyId"].(*string)) + return ec.resolvers.Query().FeesStats(rctx, fc.Args["marketId"].(*string), fc.Args["assetId"].(*string), fc.Args["epoch"].(*int), fc.Args["partyId"].(*string), fc.Args["epochFrom"].(*int), fc.Args["epochTo"].(*int)) }) if err != nil { ec.Error(ctx, err) @@ -76982,6 +81063,8 @@ func (ec *executionContext) fieldContext_Query_market(ctx context.Context, field return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -78056,7 +82139,7 @@ func (ec *executionContext) _Query_paidLiquidityFees(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 ec.resolvers.Query().PaidLiquidityFees(rctx, fc.Args["marketId"].(*string), fc.Args["assetId"].(*string), fc.Args["epoch"].(*int), fc.Args["partyIDs"].([]string)) + return ec.resolvers.Query().PaidLiquidityFees(rctx, fc.Args["marketId"].(*string), fc.Args["assetId"].(*string), fc.Args["epoch"].(*int), fc.Args["partyIDs"].([]string), fc.Args["includeDerivedParties"].(*bool), fc.Args["epochFrom"].(*int), fc.Args["epochTo"].(*int)) }) if err != nil { ec.Error(ctx, err) @@ -79008,6 +83091,122 @@ func (ec *executionContext) fieldContext_Query_stopOrders(ctx context.Context, f return fc, nil } +func (ec *executionContext) _Query_gameTeamScores(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_gameTeamScores(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().GameTeamScores(rctx, fc.Args["filter"].(*GameTeamScoreFilter), fc.Args["pagination"].(*v2.Pagination)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*v2.GameTeamScoresConnection) + fc.Result = res + return ec.marshalOGameTeamScoreConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGameTeamScoresConnection(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_gameTeamScores(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_GameTeamScoreConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_GameTeamScoreConnection_pageInfo(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type GameTeamScoreConnection", 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_gameTeamScores_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query_gamePartyScores(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_gamePartyScores(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().GamePartyScores(rctx, fc.Args["filter"].(*GamePartyScoreFilter), fc.Args["pagination"].(*v2.Pagination)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*v2.GamePartyScoresConnection) + fc.Result = res + return ec.marshalOGamePartyScoreConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGamePartyScoresConnection(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_gamePartyScores(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_GamePartyScoreConnection_edges(ctx, field) + case "pageInfo": + return ec.fieldContext_GamePartyScoreConnection_pageInfo(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type GamePartyScoreConnection", 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_gamePartyScores_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Query_successorMarkets(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { fc, err := ec.fieldContext_Query_successorMarkets(ctx, field) if err != nil { @@ -80542,6 +84741,47 @@ func (ec *executionContext) fieldContext_RecurringGovernanceTransfer_dispatchStr return fc, nil } +func (ec *executionContext) _RecurringGovernanceTransfer_factor(ctx context.Context, field graphql.CollectedField, obj *v1.RecurringGovernanceTransfer) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_RecurringGovernanceTransfer_factor(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.Factor, 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.marshalOString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_RecurringGovernanceTransfer_factor(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "RecurringGovernanceTransfer", + 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) _RecurringTransfer_startEpoch(ctx context.Context, field graphql.CollectedField, obj *v1.RecurringTransfer) (ret graphql.Marshaler) { fc, err := ec.fieldContext_RecurringTransfer_startEpoch(ctx, field) if err != nil { @@ -83794,7 +88034,7 @@ func (ec *executionContext) _RewardSummary_rewardsConnection(ctx context.Context }() resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { ctx = rctx // use context from middleware stack in children - return ec.resolvers.RewardSummary().RewardsConnection(rctx, obj, fc.Args["assetId"].(*string), fc.Args["pagination"].(*v2.Pagination)) + return ec.resolvers.RewardSummary().RewardsConnection(rctx, obj, fc.Args["assetId"].(*string), fc.Args["pagination"].(*v2.Pagination), fc.Args["includeDerivedParties"].(*bool)) }) if err != nil { ec.Error(ctx, err) @@ -84265,6 +88505,94 @@ func (ec *executionContext) fieldContext_RiskFactor_long(ctx context.Context, fi return fc, nil } +func (ec *executionContext) _RiskFactorOverride_short(ctx context.Context, field graphql.CollectedField, obj *vega.RiskFactorOverride) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_RiskFactorOverride_short(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.Short, 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_RiskFactorOverride_short(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "RiskFactorOverride", + 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) _RiskFactorOverride_long(ctx context.Context, field graphql.CollectedField, obj *vega.RiskFactorOverride) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_RiskFactorOverride_long(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.Long, 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_RiskFactorOverride_long(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "RiskFactorOverride", + 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) _ScalingFactors_searchLevel(ctx context.Context, field graphql.CollectedField, obj *vega.ScalingFactors) (ret graphql.Marshaler) { fc, err := ec.fieldContext_ScalingFactors_searchLevel(ctx, field) if err != nil { @@ -88378,7 +92706,7 @@ func (ec *executionContext) _Subscription_accounts(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.Subscription().Accounts(rctx, fc.Args["marketId"].(*string), fc.Args["partyId"].(*string), fc.Args["assetId"].(*string), fc.Args["type"].(*vega.AccountType)) + return ec.resolvers.Subscription().Accounts(rctx, fc.Args["marketId"].(*string), fc.Args["partyId"].(*string), fc.Args["assetId"].(*string), fc.Args["type"].(*vega.AccountType), fc.Args["includeDerivedParties"].(*bool)) }) if err != nil { ec.Error(ctx, err) @@ -89214,7 +93542,7 @@ func (ec *executionContext) _Subscription_positions(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.Subscription().Positions(rctx, fc.Args["partyId"].(*string), fc.Args["marketId"].(*string)) + return ec.resolvers.Subscription().Positions(rctx, fc.Args["partyId"].(*string), fc.Args["marketId"].(*string), fc.Args["includeDerivedParties"].(*bool)) }) if err != nil { ec.Error(ctx, err) @@ -89848,6 +94176,8 @@ func (ec *executionContext) fieldContext_SuccessorMarket_market(ctx context.Cont return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -93586,6 +97916,8 @@ func (ec *executionContext) fieldContext_TradableInstrument_marginCalculator(ctx switch field.Name { case "scalingFactors": return ec.fieldContext_MarginCalculator_scalingFactors(ctx, field) + case "fullyCollateralised": + return ec.fieldContext_MarginCalculator_fullyCollateralised(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type MarginCalculator", field.Name) }, @@ -93738,6 +98070,8 @@ func (ec *executionContext) fieldContext_Trade_market(ctx context.Context, field return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -97974,6 +102308,8 @@ func (ec *executionContext) fieldContext_UpdateMarket_updateMarketConfiguration( return ec.fieldContext_UpdateMarketConfiguration_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_UpdateMarketConfiguration_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_UpdateMarketConfiguration_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type UpdateMarketConfiguration", field.Name) }, @@ -98556,6 +102892,50 @@ func (ec *executionContext) fieldContext_UpdateMarketConfiguration_tickSize(ctx return fc, nil } +func (ec *executionContext) _UpdateMarketConfiguration_enableTxReordering(ctx context.Context, field graphql.CollectedField, obj *vega.UpdateMarketConfiguration) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_UpdateMarketConfiguration_enableTxReordering(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.UpdateMarketConfiguration().EnableTxReordering(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.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_UpdateMarketConfiguration_enableTxReordering(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "UpdateMarketConfiguration", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _UpdateMarketLogNormalRiskModel_logNormal(ctx context.Context, field graphql.CollectedField, obj *vega.UpdateMarketConfiguration_LogNormal) (ret graphql.Marshaler) { fc, err := ec.fieldContext_UpdateMarketLogNormalRiskModel_logNormal(ctx, field) if err != nil { @@ -98598,6 +102978,8 @@ func (ec *executionContext) fieldContext_UpdateMarketLogNormalRiskModel_logNorma return ec.fieldContext_LogNormalRiskModel_tau(ctx, field) case "params": return ec.fieldContext_LogNormalRiskModel_params(ctx, field) + case "riskFactorOverride": + return ec.fieldContext_LogNormalRiskModel_riskFactorOverride(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type LogNormalRiskModel", field.Name) }, @@ -98753,6 +103135,8 @@ func (ec *executionContext) fieldContext_UpdateMarketState_market(ctx context.Co return ec.fieldContext_Market_markPriceConfiguration(ctx, field) case "tickSize": return ec.fieldContext_Market_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_Market_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type Market", field.Name) }, @@ -99763,6 +104147,8 @@ func (ec *executionContext) fieldContext_UpdateSpotMarket_updateSpotMarketConfig return ec.fieldContext_UpdateSpotMarketConfiguration_liquidityFeeSettings(ctx, field) case "tickSize": return ec.fieldContext_UpdateSpotMarketConfiguration_tickSize(ctx, field) + case "enableTxReordering": + return ec.fieldContext_UpdateSpotMarketConfiguration_enableTxReordering(ctx, field) } return nil, fmt.Errorf("no field named %q was found under type UpdateSpotMarketConfiguration", field.Name) }, @@ -100151,6 +104537,50 @@ func (ec *executionContext) fieldContext_UpdateSpotMarketConfiguration_tickSize( return fc, nil } +func (ec *executionContext) _UpdateSpotMarketConfiguration_enableTxReordering(ctx context.Context, field graphql.CollectedField, obj *vega.UpdateSpotMarketConfiguration) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_UpdateSpotMarketConfiguration_enableTxReordering(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.UpdateSpotMarketConfiguration().EnableTxReordering(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.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_UpdateSpotMarketConfiguration_enableTxReordering(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "UpdateSpotMarketConfiguration", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _UpdateVolumeDiscountProgram_benefitTiers(ctx context.Context, field graphql.CollectedField, obj *vega.UpdateVolumeDiscountProgram) (ret graphql.Marshaler) { fc, err := ec.fieldContext_UpdateVolumeDiscountProgram_benefitTiers(ctx, field) if err != nil { @@ -104192,6 +108622,109 @@ func (ec *executionContext) unmarshalInputDateRange(ctx context.Context, obj int return it, nil } +func (ec *executionContext) unmarshalInputGamePartyScoreFilter(ctx context.Context, obj interface{}) (GamePartyScoreFilter, error) { + var it GamePartyScoreFilter + asMap := map[string]interface{}{} + for k, v := range obj.(map[string]interface{}) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"gameIds", "teamIds", "partyIds", "epochFrom", "epochTo"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "gameIds": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gameIds")) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) + if err != nil { + return it, err + } + it.GameIds = data + case "teamIds": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("teamIds")) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) + if err != nil { + return it, err + } + it.TeamIds = data + case "partyIds": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("partyIds")) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) + if err != nil { + return it, err + } + it.PartyIds = data + case "epochFrom": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("epochFrom")) + data, err := ec.unmarshalOInt2ᚖint(ctx, v) + if err != nil { + return it, err + } + it.EpochFrom = data + case "epochTo": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("epochTo")) + data, err := ec.unmarshalOInt2ᚖint(ctx, v) + if err != nil { + return it, err + } + it.EpochTo = data + } + } + + return it, nil +} + +func (ec *executionContext) unmarshalInputGameTeamScoreFilter(ctx context.Context, obj interface{}) (GameTeamScoreFilter, error) { + var it GameTeamScoreFilter + asMap := map[string]interface{}{} + for k, v := range obj.(map[string]interface{}) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"gameIds", "teamIds", "epochFrom", "epochTo"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "gameIds": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("gameIds")) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) + if err != nil { + return it, err + } + it.GameIds = data + case "teamIds": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("teamIds")) + data, err := ec.unmarshalOID2ᚕstringᚄ(ctx, v) + if err != nil { + return it, err + } + it.TeamIds = data + case "epochFrom": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("epochFrom")) + data, err := ec.unmarshalOInt2ᚖint(ctx, v) + if err != nil { + return it, err + } + it.EpochFrom = data + case "epochTo": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("epochTo")) + data, err := ec.unmarshalOInt2ᚖint(ctx, v) + if err != nil { + return it, err + } + it.EpochTo = data + } + } + + return it, nil +} + func (ec *executionContext) unmarshalInputLedgerEntryFilter(ctx context.Context, obj interface{}) (v2.LedgerEntryFilter, error) { var it v2.LedgerEntryFilter asMap := map[string]interface{}{} @@ -105347,6 +109880,164 @@ func (ec *executionContext) _WithdrawalDetails(ctx context.Context, sel ast.Sele // region **************************** object.gotpl **************************** +var aMMImplementors = []string{"AMM"} + +func (ec *executionContext) _AMM(ctx context.Context, sel ast.SelectionSet, obj *v1.AMM) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, aMMImplementors) + + 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("AMM") + case "id": + out.Values[i] = ec._AMM_id(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "partyId": + out.Values[i] = ec._AMM_partyId(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "marketId": + out.Values[i] = ec._AMM_marketId(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "ammPartyId": + out.Values[i] = ec._AMM_ammPartyId(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "commitment": + out.Values[i] = ec._AMM_commitment(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "parameters": + out.Values[i] = ec._AMM_parameters(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "status": + out.Values[i] = ec._AMM_status(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "statusReason": + out.Values[i] = ec._AMM_statusReason(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "proposedFee": + out.Values[i] = ec._AMM_proposedFee(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 aMMConnectionImplementors = []string{"AMMConnection"} + +func (ec *executionContext) _AMMConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.AMMConnection) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, aMMConnectionImplementors) + + 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("AMMConnection") + case "edges": + out.Values[i] = ec._AMMConnection_edges(ctx, field, obj) + case "pageInfo": + out.Values[i] = ec._AMMConnection_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 aMMEdgeImplementors = []string{"AMMEdge"} + +func (ec *executionContext) _AMMEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.AMMEdge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, aMMEdgeImplementors) + + 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("AMMEdge") + case "node": + out.Values[i] = ec._AMMEdge_node(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "cursor": + out.Values[i] = ec._AMMEdge_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 abstractMarginLevelsImplementors = []string{"AbstractMarginLevels"} func (ec *executionContext) _AbstractMarginLevels(ctx context.Context, sel ast.SelectionSet, obj *AbstractMarginLevels) graphql.Marshaler { @@ -105548,6 +110239,39 @@ func (ec *executionContext) _AccountBalance(ctx context.Context, sel ast.Selecti continue } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "parentPartyId": + 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._AccountBalance_parentPartyId(ctx, field, obj) + 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) }) default: panic("unknown field " + strconv.Quote(field.Name)) @@ -107903,231 +112627,326 @@ func (ec *executionContext) _CandleEdge(ctx context.Context, sel ast.SelectionSe return out } -var collateralIncreaseEstimateImplementors = []string{"CollateralIncreaseEstimate"} +var collateralIncreaseEstimateImplementors = []string{"CollateralIncreaseEstimate"} + +func (ec *executionContext) _CollateralIncreaseEstimate(ctx context.Context, sel ast.SelectionSet, obj *v2.CollateralIncreaseEstimate) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, collateralIncreaseEstimateImplementors) + + 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("CollateralIncreaseEstimate") + case "worstCase": + out.Values[i] = ec._CollateralIncreaseEstimate_worstCase(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "bestCase": + out.Values[i] = ec._CollateralIncreaseEstimate_bestCase(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 compositePriceConfigurationImplementors = []string{"CompositePriceConfiguration"} + +func (ec *executionContext) _CompositePriceConfiguration(ctx context.Context, sel ast.SelectionSet, obj *vega.CompositePriceConfiguration) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, compositePriceConfigurationImplementors) + + 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("CompositePriceConfiguration") + case "decayWeight": + out.Values[i] = ec._CompositePriceConfiguration_decayWeight(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "decayPower": + 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._CompositePriceConfiguration_decayPower(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 "cashAmount": + out.Values[i] = ec._CompositePriceConfiguration_cashAmount(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "SourceWeights": + out.Values[i] = ec._CompositePriceConfiguration_SourceWeights(ctx, field, obj) + case "SourceStalenessTolerance": + out.Values[i] = ec._CompositePriceConfiguration_SourceStalenessTolerance(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "CompositePriceType": + 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._CompositePriceConfiguration_CompositePriceType(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 "dataSourcesSpec": + out.Values[i] = ec._CompositePriceConfiguration_dataSourcesSpec(ctx, field, obj) + case "dataSourcesSpecBinding": + 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._CompositePriceConfiguration_dataSourcesSpecBinding(ctx, field, obj) + 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) }) + 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 compositePriceSourceImplementors = []string{"CompositePriceSource"} + +func (ec *executionContext) _CompositePriceSource(ctx context.Context, sel ast.SelectionSet, obj *vega.CompositePriceSource) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, compositePriceSourceImplementors) + + 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("CompositePriceSource") + case "price": + out.Values[i] = ec._CompositePriceSource_price(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "lastUpdated": + out.Values[i] = ec._CompositePriceSource_lastUpdated(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "PriceSource": + out.Values[i] = ec._CompositePriceSource_PriceSource(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 compositePriceStateImplementors = []string{"CompositePriceState"} + +func (ec *executionContext) _CompositePriceState(ctx context.Context, sel ast.SelectionSet, obj *vega.CompositePriceState) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, compositePriceStateImplementors) + + 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("CompositePriceState") + case "priceSources": + out.Values[i] = ec._CompositePriceState_priceSources(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 concentratedLiquidityParametersImplementors = []string{"ConcentratedLiquidityParameters"} -func (ec *executionContext) _CollateralIncreaseEstimate(ctx context.Context, sel ast.SelectionSet, obj *v2.CollateralIncreaseEstimate) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, collateralIncreaseEstimateImplementors) +func (ec *executionContext) _ConcentratedLiquidityParameters(ctx context.Context, sel ast.SelectionSet, obj *v1.AMM_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("CollateralIncreaseEstimate") - case "worstCase": - out.Values[i] = ec._CollateralIncreaseEstimate_worstCase(ctx, field, obj) + 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 "bestCase": - out.Values[i] = ec._CollateralIncreaseEstimate_bestCase(ctx, field, obj) + case "lowerBound": + out.Values[i] = ec._ConcentratedLiquidityParameters_lowerBound(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 compositePriceConfigurationImplementors = []string{"CompositePriceConfiguration"} - -func (ec *executionContext) _CompositePriceConfiguration(ctx context.Context, sel ast.SelectionSet, obj *vega.CompositePriceConfiguration) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, compositePriceConfigurationImplementors) - - 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("CompositePriceConfiguration") - case "decayWeight": - out.Values[i] = ec._CompositePriceConfiguration_decayWeight(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } - case "decayPower": - 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._CompositePriceConfiguration_decayPower(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 "cashAmount": - out.Values[i] = ec._CompositePriceConfiguration_cashAmount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } - case "SourceWeights": - out.Values[i] = ec._CompositePriceConfiguration_SourceWeights(ctx, field, obj) - case "SourceStalenessTolerance": - out.Values[i] = ec._CompositePriceConfiguration_SourceStalenessTolerance(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } - case "CompositePriceType": - 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._CompositePriceConfiguration_CompositePriceType(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 "dataSourcesSpec": - out.Values[i] = ec._CompositePriceConfiguration_dataSourcesSpec(ctx, field, obj) - case "dataSourcesSpecBinding": - 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._CompositePriceConfiguration_dataSourcesSpecBinding(ctx, field, obj) - 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) }) - 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 compositePriceSourceImplementors = []string{"CompositePriceSource"} - -func (ec *executionContext) _CompositePriceSource(ctx context.Context, sel ast.SelectionSet, obj *vega.CompositePriceSource) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, compositePriceSourceImplementors) - - 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("CompositePriceSource") - case "price": - out.Values[i] = ec._CompositePriceSource_price(ctx, field, obj) + case "upperBound": + out.Values[i] = ec._ConcentratedLiquidityParameters_upperBound(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } - case "lastUpdated": - out.Values[i] = ec._CompositePriceSource_lastUpdated(ctx, field, obj) + case "leverageAtUpperBound": + out.Values[i] = ec._ConcentratedLiquidityParameters_leverageAtUpperBound(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } - case "PriceSource": - out.Values[i] = ec._CompositePriceSource_PriceSource(ctx, field, obj) + case "leverageAtLowerBound": + out.Values[i] = ec._ConcentratedLiquidityParameters_leverageAtLowerBound(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } @@ -108154,42 +112973,6 @@ func (ec *executionContext) _CompositePriceSource(ctx context.Context, sel ast.S return out } -var compositePriceStateImplementors = []string{"CompositePriceState"} - -func (ec *executionContext) _CompositePriceState(ctx context.Context, sel ast.SelectionSet, obj *vega.CompositePriceState) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, compositePriceStateImplementors) - - 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("CompositePriceState") - case "priceSources": - out.Values[i] = ec._CompositePriceState_priceSources(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 conditionImplementors = []string{"Condition"} func (ec *executionContext) _Condition(ctx context.Context, sel ast.SelectionSet, obj *Condition) graphql.Marshaler { @@ -111447,6 +116230,52 @@ func (ec *executionContext) _Erc20WithdrawalDetails(ctx context.Context, sel ast return out } +var estimatedAMMBoundsImplementors = []string{"EstimatedAMMBounds"} + +func (ec *executionContext) _EstimatedAMMBounds(ctx context.Context, sel ast.SelectionSet, obj *v2.EstimateAMMBoundsResponse) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, estimatedAMMBoundsImplementors) + + 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("EstimatedAMMBounds") + case "positionSizeAtUpper": + out.Values[i] = ec._EstimatedAMMBounds_positionSizeAtUpper(ctx, field, obj) + case "positionSizeAtLower": + out.Values[i] = ec._EstimatedAMMBounds_positionSizeAtLower(ctx, field, obj) + case "lossOnCommitmentAtUpper": + out.Values[i] = ec._EstimatedAMMBounds_lossOnCommitmentAtUpper(ctx, field, obj) + case "lossOnCommitmentAtLower": + out.Values[i] = ec._EstimatedAMMBounds_lossOnCommitmentAtLower(ctx, field, obj) + case "liquidationPriceAtUpper": + out.Values[i] = ec._EstimatedAMMBounds_liquidationPriceAtUpper(ctx, field, obj) + case "liquidationPriceAtLower": + out.Values[i] = ec._EstimatedAMMBounds_liquidationPriceAtLower(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 estimatedTransferFeeImplementors = []string{"EstimatedTransferFee"} func (ec *executionContext) _EstimatedTransferFee(ctx context.Context, sel ast.SelectionSet, obj *v2.EstimateTransferFeeResponse) graphql.Marshaler { @@ -113301,6 +118130,547 @@ func (ec *executionContext) _Future(ctx context.Context, sel ast.SelectionSet, o if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } + case "cap": + out.Values[i] = ec._Future_cap(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 futureCapImplementors = []string{"FutureCap"} + +func (ec *executionContext) _FutureCap(ctx context.Context, sel ast.SelectionSet, obj *vega.FutureCap) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, futureCapImplementors) + + 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("FutureCap") + case "maxPrice": + out.Values[i] = ec._FutureCap_maxPrice(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "binarySettlement": + out.Values[i] = ec._FutureCap_binarySettlement(ctx, field, obj) + case "fullyCollateralised": + out.Values[i] = ec._FutureCap_fullyCollateralised(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 futureProductImplementors = []string{"FutureProduct", "ProductConfiguration"} + +func (ec *executionContext) _FutureProduct(ctx context.Context, sel ast.SelectionSet, obj *vega.FutureProduct) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, futureProductImplementors) + + 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("FutureProduct") + case "settlementAsset": + 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._FutureProduct_settlementAsset(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 "quoteName": + out.Values[i] = ec._FutureProduct_quoteName(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "dataSourceSpecForSettlementData": + out.Values[i] = ec._FutureProduct_dataSourceSpecForSettlementData(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "dataSourceSpecForTradingTermination": + out.Values[i] = ec._FutureProduct_dataSourceSpecForTradingTermination(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "dataSourceSpecBinding": + out.Values[i] = ec._FutureProduct_dataSourceSpecBinding(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "cap": + out.Values[i] = ec._FutureProduct_cap(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 gameImplementors = []string{"Game"} + +func (ec *executionContext) _Game(ctx context.Context, sel ast.SelectionSet, obj *v2.Game) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, gameImplementors) + + 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("Game") + case "id": + out.Values[i] = ec._Game_id(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + 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._Game_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 "numberOfParticipants": + 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._Game_numberOfParticipants(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 "entities": + 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._Game_entities(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 "rewardAssetId": + out.Values[i] = ec._Game_rewardAssetId(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 gameEdgeImplementors = []string{"GameEdge"} + +func (ec *executionContext) _GameEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.GameEdge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, gameEdgeImplementors) + + 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("GameEdge") + case "node": + out.Values[i] = ec._GameEdge_node(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "cursor": + out.Values[i] = ec._GameEdge_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 gamePartyScoreImplementors = []string{"GamePartyScore"} + +func (ec *executionContext) _GamePartyScore(ctx context.Context, sel ast.SelectionSet, obj *v1.GamePartyScore) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, gamePartyScoreImplementors) + + 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("GamePartyScore") + case "gameId": + out.Values[i] = ec._GamePartyScore_gameId(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "teamId": + out.Values[i] = ec._GamePartyScore_teamId(ctx, field, obj) + case "epochId": + 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._GamePartyScore_epochId(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 "partyId": + 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._GamePartyScore_partyId(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 "time": + out.Values[i] = ec._GamePartyScore_time(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "score": + out.Values[i] = ec._GamePartyScore_score(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "stakingBalance": + out.Values[i] = ec._GamePartyScore_stakingBalance(ctx, field, obj) + case "openVolume": + out.Values[i] = ec._GamePartyScore_openVolume(ctx, field, obj) + case "totalFeesPaid": + out.Values[i] = ec._GamePartyScore_totalFeesPaid(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "isEligible": + out.Values[i] = ec._GamePartyScore_isEligible(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "rank": + 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._GamePartyScore_rank(ctx, field, obj) + 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) }) + 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 gamePartyScoreConnectionImplementors = []string{"GamePartyScoreConnection"} + +func (ec *executionContext) _GamePartyScoreConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.GamePartyScoresConnection) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, gamePartyScoreConnectionImplementors) + + 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("GamePartyScoreConnection") + case "edges": + out.Values[i] = ec._GamePartyScoreConnection_edges(ctx, field, obj) + case "pageInfo": + out.Values[i] = ec._GamePartyScoreConnection_pageInfo(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -113324,73 +118694,21 @@ func (ec *executionContext) _Future(ctx context.Context, sel ast.SelectionSet, o return out } -var futureProductImplementors = []string{"FutureProduct", "ProductConfiguration"} +var gamePartyScoreEdgeImplementors = []string{"GamePartyScoreEdge"} -func (ec *executionContext) _FutureProduct(ctx context.Context, sel ast.SelectionSet, obj *vega.FutureProduct) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, futureProductImplementors) +func (ec *executionContext) _GamePartyScoreEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.GamePartyScoresEdge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, gamePartyScoreEdgeImplementors) 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("FutureProduct") - case "settlementAsset": - 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._FutureProduct_settlementAsset(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 "quoteName": - out.Values[i] = ec._FutureProduct_quoteName(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } - case "dataSourceSpecForSettlementData": - out.Values[i] = ec._FutureProduct_dataSourceSpecForSettlementData(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } - case "dataSourceSpecForTradingTermination": - out.Values[i] = ec._FutureProduct_dataSourceSpecForTradingTermination(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } - case "dataSourceSpecBinding": - out.Values[i] = ec._FutureProduct_dataSourceSpecBinding(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } + out.Values[i] = graphql.MarshalString("GamePartyScoreEdge") + case "node": + out.Values[i] = ec._GamePartyScoreEdge_node(ctx, field, obj) + case "cursor": + out.Values[i] = ec._GamePartyScoreEdge_cursor(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -113414,23 +118732,28 @@ func (ec *executionContext) _FutureProduct(ctx context.Context, sel ast.Selectio return out } -var gameImplementors = []string{"Game"} +var gameTeamScoreImplementors = []string{"GameTeamScore"} -func (ec *executionContext) _Game(ctx context.Context, sel ast.SelectionSet, obj *v2.Game) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, gameImplementors) +func (ec *executionContext) _GameTeamScore(ctx context.Context, sel ast.SelectionSet, obj *v1.GameTeamScore) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, gameTeamScoreImplementors) 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("Game") - case "id": - out.Values[i] = ec._Game_id(ctx, field, obj) + out.Values[i] = graphql.MarshalString("GameTeamScore") + case "gameId": + out.Values[i] = ec._GameTeamScore_gameId(ctx, field, obj) if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } - case "epoch": + case "teamId": + out.Values[i] = ec._GameTeamScore_teamId(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "epochId": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -113439,7 +118762,7 @@ func (ec *executionContext) _Game(ctx context.Context, sel ast.SelectionSet, obj ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Game_epoch(ctx, field, obj) + res = ec._GameTeamScore_epochId(ctx, field, obj) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -113466,83 +118789,54 @@ func (ec *executionContext) _Game(ctx context.Context, sel ast.SelectionSet, obj } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "numberOfParticipants": - 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._Game_numberOfParticipants(ctx, field, obj) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } - return res + case "time": + out.Values[i] = ec._GameTeamScore_time(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) } - - 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 + case "score": + out.Values[i] = ec._GameTeamScore_score(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 + } - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "entities": - field := field + atomic.AddInt32(&ec.deferred, int32(len(deferred))) - 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._Game_entities(ctx, field, obj) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } - return res - } + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } - 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) - }) + return out +} - // don't run the out.Concurrently() call below - out.Values[i] = graphql.Null - continue - } +var gameTeamScoreConnectionImplementors = []string{"GameTeamScoreConnection"} - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "rewardAssetId": - out.Values[i] = ec._Game_rewardAssetId(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } +func (ec *executionContext) _GameTeamScoreConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.GameTeamScoresConnection) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, gameTeamScoreConnectionImplementors) + + 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("GameTeamScoreConnection") + case "edges": + out.Values[i] = ec._GameTeamScoreConnection_edges(ctx, field, obj) + case "pageInfo": + out.Values[i] = ec._GameTeamScoreConnection_pageInfo(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -113566,27 +118860,21 @@ func (ec *executionContext) _Game(ctx context.Context, sel ast.SelectionSet, obj return out } -var gameEdgeImplementors = []string{"GameEdge"} +var gameTeamScoreEdgeImplementors = []string{"GameTeamScoreEdge"} -func (ec *executionContext) _GameEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.GameEdge) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, gameEdgeImplementors) +func (ec *executionContext) _GameTeamScoreEdge(ctx context.Context, sel ast.SelectionSet, obj *v2.GameTeamScoresEdge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, gameTeamScoreEdgeImplementors) 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("GameEdge") + out.Values[i] = graphql.MarshalString("GameTeamScoreEdge") case "node": - out.Values[i] = ec._GameEdge_node(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } + out.Values[i] = ec._GameTeamScoreEdge_node(ctx, field, obj) case "cursor": - out.Values[i] = ec._GameEdge_cursor(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } + out.Values[i] = ec._GameTeamScoreEdge_cursor(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -115873,6 +121161,8 @@ func (ec *executionContext) _LogNormalRiskModel(ctx context.Context, sel ast.Sel if out.Values[i] == graphql.Null { out.Invalids++ } + case "riskFactorOverride": + out.Values[i] = ec._LogNormalRiskModel_riskFactorOverride(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -116005,6 +121295,8 @@ func (ec *executionContext) _MarginCalculator(ctx context.Context, sel ast.Selec if out.Values[i] == graphql.Null { out.Invalids++ } + case "fullyCollateralised": + out.Values[i] = ec._MarginCalculator_fullyCollateralised(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -117155,45 +122447,94 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "liquidityProvisionsConnection": - 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._Market_liquidityProvisionsConnection(ctx, field, obj) - 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 + case "liquidityProvisionsConnection": + 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._Market_liquidityProvisionsConnection(ctx, field, obj) + 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 "marketTimestamps": + out.Values[i] = ec._Market_marketTimestamps(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "riskFactors": + 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._Market_riskFactors(ctx, field, obj) + 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 "linearSlippageFactor": + out.Values[i] = ec._Market_linearSlippageFactor(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "marketTimestamps": - out.Values[i] = ec._Market_marketTimestamps(ctx, field, obj) + case "quadraticSlippageFactor": + out.Values[i] = ec._Market_quadraticSlippageFactor(ctx, field, obj) if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } - case "riskFactors": + case "parentMarketID": + out.Values[i] = ec._Market_parentMarketID(ctx, field, obj) + case "insurancePoolFraction": + out.Values[i] = ec._Market_insurancePoolFraction(ctx, field, obj) + case "successorMarketID": + out.Values[i] = ec._Market_successorMarketID(ctx, field, obj) + case "liquiditySLAParameters": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -117202,7 +122543,7 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Market_riskFactors(ctx, field, obj) + res = ec._Market_liquiditySLAParameters(ctx, field, obj) return res } @@ -117226,23 +122567,19 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "linearSlippageFactor": - out.Values[i] = ec._Market_linearSlippageFactor(ctx, field, obj) + case "liquidationStrategy": + out.Values[i] = ec._Market_liquidationStrategy(ctx, field, obj) + case "markPriceConfiguration": + out.Values[i] = ec._Market_markPriceConfiguration(ctx, field, obj) if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } - case "quadraticSlippageFactor": - out.Values[i] = ec._Market_quadraticSlippageFactor(ctx, field, obj) + case "tickSize": + out.Values[i] = ec._Market_tickSize(ctx, field, obj) if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } - case "parentMarketID": - out.Values[i] = ec._Market_parentMarketID(ctx, field, obj) - case "insurancePoolFraction": - out.Values[i] = ec._Market_insurancePoolFraction(ctx, field, obj) - case "successorMarketID": - out.Values[i] = ec._Market_successorMarketID(ctx, field, obj) - case "liquiditySLAParameters": + case "enableTxReordering": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -117251,7 +122588,10 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Market_liquiditySLAParameters(ctx, field, obj) + res = ec._Market_enableTxReordering(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } return res } @@ -117275,18 +122615,6 @@ func (ec *executionContext) _Market(ctx context.Context, sel ast.SelectionSet, o } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "liquidationStrategy": - out.Values[i] = ec._Market_liquidationStrategy(ctx, field, obj) - case "markPriceConfiguration": - out.Values[i] = ec._Market_markPriceConfiguration(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } - case "tickSize": - out.Values[i] = ec._Market_tickSize(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -119453,7 +124781,181 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "positionDecimalPlaces": + case "positionDecimalPlaces": + 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._NewMarket_positionDecimalPlaces(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 "linearSlippageFactor": + 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._NewMarket_linearSlippageFactor(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 "quadraticSlippageFactor": + 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._NewMarket_quadraticSlippageFactor(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 "successorConfiguration": + 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._NewMarket_successorConfiguration(ctx, field, obj) + 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 "liquiditySLAParameters": + 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._NewMarket_liquiditySLAParameters(ctx, field, obj) + 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 "liquidityFeeSettings": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -119462,10 +124964,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._NewMarket_positionDecimalPlaces(ctx, field, obj) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } + res = ec._NewMarket_liquidityFeeSettings(ctx, field, obj) return res } @@ -119489,7 +124988,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "linearSlippageFactor": + case "liquidationStrategy": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -119498,10 +124997,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._NewMarket_linearSlippageFactor(ctx, field, obj) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } + res = ec._NewMarket_liquidationStrategy(ctx, field, obj) return res } @@ -119525,7 +125021,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "quadraticSlippageFactor": + case "markPriceConfiguration": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -119534,7 +125030,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._NewMarket_quadraticSlippageFactor(ctx, field, obj) + res = ec._NewMarket_markPriceConfiguration(ctx, field, obj) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -119561,139 +125057,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "successorConfiguration": - 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._NewMarket_successorConfiguration(ctx, field, obj) - 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 "liquiditySLAParameters": - 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._NewMarket_liquiditySLAParameters(ctx, field, obj) - 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 "liquidityFeeSettings": - 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._NewMarket_liquidityFeeSettings(ctx, field, obj) - 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 "liquidationStrategy": - 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._NewMarket_liquidationStrategy(ctx, field, obj) - 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 "markPriceConfiguration": + case "tickSize": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -119702,7 +125066,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._NewMarket_markPriceConfiguration(ctx, field, obj) + res = ec._NewMarket_tickSize(ctx, field, obj) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -119729,7 +125093,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - case "tickSize": + case "enableTxReordering": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -119738,7 +125102,7 @@ func (ec *executionContext) _NewMarket(ctx context.Context, sel ast.SelectionSet ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._NewMarket_tickSize(ctx, field, obj) + res = ec._NewMarket_enableTxReordering(ctx, field, obj) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -120152,6 +125516,42 @@ func (ec *executionContext) _NewSpotMarket(ctx context.Context, sel ast.Selectio continue } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "enableTxReordering": + 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._NewSpotMarket_enableTxReordering(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) }) default: panic("unknown field " + strconv.Quote(field.Name)) @@ -125613,6 +131013,10 @@ func (ec *executionContext) _PartyVestingStats(ctx context.Context, sel ast.Sele if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } + case "summedRewardBonusMultiplier": + out.Values[i] = ec._PartyVestingStats_summedRewardBonusMultiplier(ctx, field, obj) + case "summedQuantumBalance": + out.Values[i] = ec._PartyVestingStats_summedQuantumBalance(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -126744,6 +132148,78 @@ func (ec *executionContext) _PriceLevel(ctx context.Context, sel ast.SelectionSe continue } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "ammVolume": + 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._PriceLevel_ammVolume(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 "ammVolumeEstimated": + 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._PriceLevel_ammVolumeEstimated(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 "numberOfOrders": field := field @@ -126835,6 +132311,8 @@ func (ec *executionContext) _PriceMonitoringBounds(ctx context.Context, sel ast. if out.Values[i] == graphql.Null { out.Invalids++ } + case "active": + out.Values[i] = ec._PriceMonitoringBounds_active(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -128797,6 +134275,28 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Query") + case "amms": + 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._Query_amms(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "asset": field := field @@ -129181,6 +134681,25 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "estimateAMMBounds": + 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._Query_estimateAMMBounds(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "ethereumKeyRotations": field := field @@ -130087,6 +135606,44 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "gameTeamScores": + 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._Query_gameTeamScores(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "gamePartyScores": + 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._Query_gamePartyScores(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "successorMarkets": field := field @@ -130628,6 +136185,8 @@ func (ec *executionContext) _RecurringGovernanceTransfer(ctx context.Context, se out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) case "dispatchStrategy": out.Values[i] = ec._RecurringGovernanceTransfer_dispatchStrategy(ctx, field, obj) + case "factor": + out.Values[i] = ec._RecurringGovernanceTransfer_factor(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -131908,91 +137467,214 @@ func (ec *executionContext) _RewardScore(ctx context.Context, sel ast.SelectionS return out } -var rewardSummaryImplementors = []string{"RewardSummary"} +var rewardSummaryImplementors = []string{"RewardSummary"} + +func (ec *executionContext) _RewardSummary(ctx context.Context, sel ast.SelectionSet, obj *vega.RewardSummary) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, rewardSummaryImplementors) + + 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("RewardSummary") + case "asset": + 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._RewardSummary_asset(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 "amount": + out.Values[i] = ec._RewardSummary_amount(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "rewardsConnection": + 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._RewardSummary_rewardsConnection(ctx, field, obj) + 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) }) + 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 rewardSummaryConnectionImplementors = []string{"RewardSummaryConnection"} + +func (ec *executionContext) _RewardSummaryConnection(ctx context.Context, sel ast.SelectionSet, obj *RewardSummaryConnection) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, rewardSummaryConnectionImplementors) + + 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("RewardSummaryConnection") + case "edges": + out.Values[i] = ec._RewardSummaryConnection_edges(ctx, field, obj) + case "pageInfo": + out.Values[i] = ec._RewardSummaryConnection_pageInfo(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 rewardSummaryEdgeImplementors = []string{"RewardSummaryEdge"} + +func (ec *executionContext) _RewardSummaryEdge(ctx context.Context, sel ast.SelectionSet, obj *RewardSummaryEdge) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, rewardSummaryEdgeImplementors) + + 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("RewardSummaryEdge") + case "node": + out.Values[i] = ec._RewardSummaryEdge_node(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "cursor": + out.Values[i] = ec._RewardSummaryEdge_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 rewardsConnectionImplementors = []string{"RewardsConnection"} -func (ec *executionContext) _RewardSummary(ctx context.Context, sel ast.SelectionSet, obj *vega.RewardSummary) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, rewardSummaryImplementors) +func (ec *executionContext) _RewardsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.RewardsConnection) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, rewardsConnectionImplementors) 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("RewardSummary") - case "asset": - 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._RewardSummary_asset(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 "amount": - out.Values[i] = ec._RewardSummary_amount(ctx, field, obj) - if out.Values[i] == graphql.Null { - atomic.AddUint32(&out.Invalids, 1) - } - case "rewardsConnection": - 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._RewardSummary_rewardsConnection(ctx, field, obj) - 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) }) + out.Values[i] = graphql.MarshalString("RewardsConnection") + case "edges": + out.Values[i] = ec._RewardsConnection_edges(ctx, field, obj) + case "pageInfo": + out.Values[i] = ec._RewardsConnection_pageInfo(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -132016,65 +137698,29 @@ func (ec *executionContext) _RewardSummary(ctx context.Context, sel ast.Selectio return out } -var rewardSummaryConnectionImplementors = []string{"RewardSummaryConnection"} +var riskFactorImplementors = []string{"RiskFactor"} -func (ec *executionContext) _RewardSummaryConnection(ctx context.Context, sel ast.SelectionSet, obj *RewardSummaryConnection) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, rewardSummaryConnectionImplementors) +func (ec *executionContext) _RiskFactor(ctx context.Context, sel ast.SelectionSet, obj *vega.RiskFactor) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, riskFactorImplementors) 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("RewardSummaryConnection") - case "edges": - out.Values[i] = ec._RewardSummaryConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._RewardSummaryConnection_pageInfo(ctx, field, obj) + out.Values[i] = graphql.MarshalString("RiskFactor") + case "market": + out.Values[i] = ec._RiskFactor_market(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 rewardSummaryEdgeImplementors = []string{"RewardSummaryEdge"} - -func (ec *executionContext) _RewardSummaryEdge(ctx context.Context, sel ast.SelectionSet, obj *RewardSummaryEdge) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, rewardSummaryEdgeImplementors) - - 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("RewardSummaryEdge") - case "node": - out.Values[i] = ec._RewardSummaryEdge_node(ctx, field, obj) + case "short": + out.Values[i] = ec._RiskFactor_short(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } - case "cursor": - out.Values[i] = ec._RewardSummaryEdge_cursor(ctx, field, obj) + case "long": + out.Values[i] = ec._RiskFactor_long(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } @@ -132101,67 +137747,24 @@ func (ec *executionContext) _RewardSummaryEdge(ctx context.Context, sel ast.Sele return out } -var rewardsConnectionImplementors = []string{"RewardsConnection"} +var riskFactorOverrideImplementors = []string{"RiskFactorOverride"} -func (ec *executionContext) _RewardsConnection(ctx context.Context, sel ast.SelectionSet, obj *v2.RewardsConnection) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, rewardsConnectionImplementors) +func (ec *executionContext) _RiskFactorOverride(ctx context.Context, sel ast.SelectionSet, obj *vega.RiskFactorOverride) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, riskFactorOverrideImplementors) 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("RewardsConnection") - case "edges": - out.Values[i] = ec._RewardsConnection_edges(ctx, field, obj) - case "pageInfo": - out.Values[i] = ec._RewardsConnection_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 riskFactorImplementors = []string{"RiskFactor"} - -func (ec *executionContext) _RiskFactor(ctx context.Context, sel ast.SelectionSet, obj *vega.RiskFactor) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, riskFactorImplementors) - - 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("RiskFactor") - case "market": - out.Values[i] = ec._RiskFactor_market(ctx, field, obj) - if out.Values[i] == graphql.Null { - out.Invalids++ - } + out.Values[i] = graphql.MarshalString("RiskFactorOverride") case "short": - out.Values[i] = ec._RiskFactor_short(ctx, field, obj) + out.Values[i] = ec._RiskFactorOverride_short(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } case "long": - out.Values[i] = ec._RiskFactor_long(ctx, field, obj) + out.Values[i] = ec._RiskFactorOverride_long(ctx, field, obj) if out.Values[i] == graphql.Null { out.Invalids++ } @@ -138204,6 +143807,42 @@ func (ec *executionContext) _UpdateMarketConfiguration(ctx context.Context, sel if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } + case "enableTxReordering": + 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._UpdateMarketConfiguration_enableTxReordering(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) }) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -139088,6 +144727,42 @@ func (ec *executionContext) _UpdateSpotMarketConfiguration(ctx context.Context, if out.Values[i] == graphql.Null { atomic.AddUint32(&out.Invalids, 1) } + case "enableTxReordering": + 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._UpdateSpotMarketConfiguration_enableTxReordering(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) }) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -140536,6 +146211,60 @@ func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, o // region ***************************** type.gotpl ***************************** +func (ec *executionContext) marshalNAMM2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM(ctx context.Context, sel ast.SelectionSet, v *v1.AMM) 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._AMM(ctx, sel, v) +} + +func (ec *executionContext) marshalNAMMConnection2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMConnection(ctx context.Context, sel ast.SelectionSet, v v2.AMMConnection) graphql.Marshaler { + return ec._AMMConnection(ctx, sel, &v) +} + +func (ec *executionContext) marshalNAMMConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMConnection(ctx context.Context, sel ast.SelectionSet, v *v2.AMMConnection) 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._AMMConnection(ctx, sel, v) +} + +func (ec *executionContext) unmarshalNAMMStatus2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_Status(ctx context.Context, v interface{}) (v1.AMM_Status, error) { + res, err := marshallers.UnmarshalAMMStatus(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNAMMStatus2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_Status(ctx context.Context, sel ast.SelectionSet, v v1.AMM_Status) graphql.Marshaler { + res := marshallers.MarshalAMMStatus(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) unmarshalNAMMStatusReason2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_StatusReason(ctx context.Context, v interface{}) (v1.AMM_StatusReason, error) { + res, err := marshallers.UnmarshalAMMStatusReason(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNAMMStatusReason2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_StatusReason(ctx context.Context, sel ast.SelectionSet, v v1.AMM_StatusReason) graphql.Marshaler { + res := marshallers.MarshalAMMStatusReason(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) marshalNAbstractMarginLevels2codeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐAbstractMarginLevels(ctx context.Context, sel ast.SelectionSet, v AbstractMarginLevels) graphql.Marshaler { return ec._AbstractMarginLevels(ctx, sel, &v) } @@ -141081,6 +146810,16 @@ func (ec *executionContext) marshalNCompositePriceType2codeᚗvegaprotocolᚗio return v } +func (ec *executionContext) marshalNConcentratedLiquidityParameters2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_ConcentratedLiquidityParameters(ctx context.Context, sel ast.SelectionSet, v *v1.AMM_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 @@ -141925,6 +147664,26 @@ func (ec *executionContext) marshalNGameEntity2ᚕcodeᚗvegaprotocolᚗioᚋveg return ret } +func (ec *executionContext) marshalNGamePartyScoreEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGamePartyScoresEdge(ctx context.Context, sel ast.SelectionSet, v *v2.GamePartyScoresEdge) 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._GamePartyScoreEdge(ctx, sel, v) +} + +func (ec *executionContext) marshalNGameTeamScoreEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGameTeamScoresEdge(ctx context.Context, sel ast.SelectionSet, v *v2.GameTeamScoresEdge) 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._GameTeamScoreEdge(ctx, sel, v) +} + func (ec *executionContext) marshalNGamesConnection2codeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGamesConnection(ctx context.Context, sel ast.SelectionSet, v v2.GamesConnection) graphql.Marshaler { return ec._GamesConnection(ctx, sel, &v) } @@ -145880,6 +151639,70 @@ func (ec *executionContext) marshalN__TypeKind2string(ctx context.Context, sel a return res } +func (ec *executionContext) marshalOAMMEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMEdge(ctx context.Context, sel ast.SelectionSet, v []*v2.AMMEdge) 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.marshalOAMMEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMEdge(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + return ret +} + +func (ec *executionContext) marshalOAMMEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐAMMEdge(ctx context.Context, sel ast.SelectionSet, v *v2.AMMEdge) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._AMMEdge(ctx, sel, v) +} + +func (ec *executionContext) unmarshalOAMMStatus2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_Status(ctx context.Context, v interface{}) (*v1.AMM_Status, error) { + if v == nil { + return nil, nil + } + res, err := marshallers.UnmarshalAMMStatus(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOAMMStatus2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐAMM_Status(ctx context.Context, sel ast.SelectionSet, v *v1.AMM_Status) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := marshallers.MarshalAMMStatus(*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 @@ -147185,6 +153008,13 @@ func (ec *executionContext) marshalOErc20WithdrawalApproval2ᚖcodeᚗvegaprotoc return ec._Erc20WithdrawalApproval(ctx, sel, v) } +func (ec *executionContext) marshalOEstimatedAMMBounds2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐEstimateAMMBoundsResponse(ctx context.Context, sel ast.SelectionSet, v *v2.EstimateAMMBoundsResponse) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._EstimatedAMMBounds(ctx, sel, v) +} + func (ec *executionContext) marshalOEstimatedTransferFee2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐEstimateTransferFeeResponse(ctx context.Context, sel ast.SelectionSet, v *v2.EstimateTransferFeeResponse) graphql.Marshaler { if v == nil { return graphql.Null @@ -147374,6 +153204,13 @@ func (ec *executionContext) marshalOFundingPeriodDataPointSource2ᚖcodeᚗvegap return res } +func (ec *executionContext) marshalOFutureCap2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐFutureCap(ctx context.Context, sel ast.SelectionSet, v *vega.FutureCap) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._FutureCap(ctx, sel, v) +} + func (ec *executionContext) marshalOFutureProduct2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐFutureProduct(ctx context.Context, sel ast.SelectionSet, v *vega.FutureProduct) graphql.Marshaler { if v == nil { return graphql.Null @@ -147429,6 +153266,144 @@ func (ec *executionContext) marshalOGameEdge2ᚖcodeᚗvegaprotocolᚗioᚋvega return ec._GameEdge(ctx, sel, v) } +func (ec *executionContext) marshalOGamePartyScore2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐGamePartyScore(ctx context.Context, sel ast.SelectionSet, v *v1.GamePartyScore) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._GamePartyScore(ctx, sel, v) +} + +func (ec *executionContext) marshalOGamePartyScoreConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGamePartyScoresConnection(ctx context.Context, sel ast.SelectionSet, v *v2.GamePartyScoresConnection) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._GamePartyScoreConnection(ctx, sel, v) +} + +func (ec *executionContext) marshalOGamePartyScoreEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGamePartyScoresEdgeᚄ(ctx context.Context, sel ast.SelectionSet, v []*v2.GamePartyScoresEdge) 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.marshalNGamePartyScoreEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGamePartyScoresEdge(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) unmarshalOGamePartyScoreFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐGamePartyScoreFilter(ctx context.Context, v interface{}) (*GamePartyScoreFilter, error) { + if v == nil { + return nil, nil + } + res, err := ec.unmarshalInputGamePartyScoreFilter(ctx, v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOGameTeamScore2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚋeventsᚋv1ᚐGameTeamScore(ctx context.Context, sel ast.SelectionSet, v *v1.GameTeamScore) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._GameTeamScore(ctx, sel, v) +} + +func (ec *executionContext) marshalOGameTeamScoreConnection2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGameTeamScoresConnection(ctx context.Context, sel ast.SelectionSet, v *v2.GameTeamScoresConnection) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._GameTeamScoreConnection(ctx, sel, v) +} + +func (ec *executionContext) marshalOGameTeamScoreEdge2ᚕᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGameTeamScoresEdgeᚄ(ctx context.Context, sel ast.SelectionSet, v []*v2.GameTeamScoresEdge) 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.marshalNGameTeamScoreEdge2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋdataᚑnodeᚋapiᚋv2ᚐGameTeamScoresEdge(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) unmarshalOGameTeamScoreFilter2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐGameTeamScoreFilter(ctx context.Context, v interface{}) (*GameTeamScoreFilter, error) { + if v == nil { + return nil, nil + } + res, err := ec.unmarshalInputGameTeamScoreFilter(ctx, v) + return &res, graphql.ErrorOnPath(ctx, err) +} + func (ec *executionContext) unmarshalOID2string(ctx context.Context, v interface{}) (string, error) { res, err := graphql.UnmarshalID(v) return res, graphql.ErrorOnPath(ctx, err) @@ -150818,6 +156793,13 @@ func (ec *executionContext) marshalORiskFactor2ᚖcodeᚗvegaprotocolᚗioᚋveg return ec._RiskFactor(ctx, sel, v) } +func (ec *executionContext) marshalORiskFactorOverride2ᚖcodeᚗvegaprotocolᚗioᚋvegaᚋprotosᚋvegaᚐRiskFactorOverride(ctx context.Context, sel ast.SelectionSet, v *vega.RiskFactorOverride) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec._RiskFactorOverride(ctx, sel, v) +} + func (ec *executionContext) marshalORiskModel2codeᚗvegaprotocolᚗioᚋvegaᚋdatanodeᚋgatewayᚋgraphqlᚐRiskModel(ctx context.Context, sel ast.SelectionSet, v RiskModel) graphql.Marshaler { if v == nil { return graphql.Null diff --git a/datanode/gateway/graphql/gqlgen.yml b/datanode/gateway/graphql/gqlgen.yml index e3ed3ebb8f3..e99558c8239 100644 --- a/datanode/gateway/graphql/gqlgen.yml +++ b/datanode/gateway/graphql/gqlgen.yml @@ -128,6 +128,18 @@ models: StopOrderSizeOverrideSetting: model: - code.vegaprotocol.io/vega/datanode/gateway/graphql/marshallers.StopOrderSizeOverrideSetting + GameTeamScore: + model: code.vegaprotocol.io/vega/protos/vega/events/v1.GameTeamScore + GamePartyScore: + model: code.vegaprotocol.io/vega/protos/vega/events/v1.GamePartyScore + GamePartyScoreEdge: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.GamePartyScoresEdge + GamePartyScoreConnection: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.GamePartyScoresConnection + GameTeamScoreEdge: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.GameTeamScoresEdge + GameTeamScoreConnection: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.GameTeamScoresConnection Order: model: code.vegaprotocol.io/vega/protos/vega.Order OrderUpdate: @@ -803,3 +815,21 @@ models: model: code.vegaprotocol.io/vega/protos/vega.VoteELSPair TimeWeightedNotionalPosition: model: code.vegaprotocol.io/vega/protos/data-node/api/v2.TimeWeightedNotionalPosition + AMMStatus: + model: code.vegaprotocol.io/vega/datanode/gateway/graphql/marshallers.AMMStatus + AMMStatusReason: + model: code.vegaprotocol.io/vega/datanode/gateway/graphql/marshallers.AMMStatusReason + ConcentratedLiquidityParameters: + model: code.vegaprotocol.io/vega/protos/vega/events/v1.AMM_ConcentratedLiquidityParameters + AMM: + model: code.vegaprotocol.io/vega/protos/vega/events/v1.AMM + AMMEdge: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.AMMEdge + AMMConnection: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.AMMConnection + RiskFactorOverride: + model: code.vegaprotocol.io/vega/protos/vega.RiskFactorOverride + FutureCap: + model: code.vegaprotocol.io/vega/protos/vega.FutureCap + EstimatedAMMBounds: + model: code.vegaprotocol.io/vega/protos/data-node/api/v2.EstimateAMMBoundsResponse diff --git a/datanode/gateway/graphql/market_resolvers.go b/datanode/gateway/graphql/market_resolvers.go index 0f138d63236..afc769028a9 100644 --- a/datanode/gateway/graphql/market_resolvers.go +++ b/datanode/gateway/graphql/market_resolvers.go @@ -27,6 +27,10 @@ import ( type myMarketResolver VegaResolverRoot +func (r *myMarketResolver) EnableTxReordering(ctx context.Context, obj *types.Market) (bool, error) { + return obj.EnableTransactionReordering, nil +} + func (r *myMarketResolver) LiquidityProvisionsConnection( ctx context.Context, market *types.Market, @@ -190,7 +194,7 @@ func (r *myMarketResolver) Depth(ctx context.Context, market *types.Market, maxD }, nil } -func (r *myMarketResolver) AccountsConnection(ctx context.Context, market *types.Market, partyID *string, pagination *v2.Pagination) (*v2.AccountsConnection, error) { +func (r *myMarketResolver) AccountsConnection(ctx context.Context, market *types.Market, partyID *string, pagination *v2.Pagination, includeDerivedParties *bool) (*v2.AccountsConnection, error) { filter := v2.AccountFilter{MarketIds: []string{market.Id}} ptyID := "" @@ -206,7 +210,7 @@ func (r *myMarketResolver) AccountsConnection(ctx context.Context, market *types } } - req := v2.ListAccountsRequest{Filter: &filter, Pagination: pagination} + req := v2.ListAccountsRequest{Filter: &filter, Pagination: pagination, IncludeDerivedParties: includeDerivedParties} res, err := r.tradingDataClientV2.ListAccounts(ctx, &req) if err != nil { diff --git a/datanode/gateway/graphql/marshallers/marshallers.go b/datanode/gateway/graphql/marshallers/marshallers.go index 38f7b022b65..bc462f134ec 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 MarshalAMMStatus(s eventspb.AMM_Status) graphql.Marshaler { + return graphql.WriterFunc(func(w io.Writer) { + w.Write([]byte(strconv.Quote(s.String()))) + }) +} + +func UnmarshalAMMStatus(v interface{}) (eventspb.AMM_Status, error) { + s, ok := v.(string) + if !ok { + return eventspb.AMM_STATUS_UNSPECIFIED, fmt.Errorf("expected AMM status to be a string") + } + + status, ok := eventspb.AMM_Status_value[s] + if !ok { + return eventspb.AMM_STATUS_UNSPECIFIED, fmt.Errorf("failed to convert AMM status from GraphQL to Proto: %v", s) + } + + return eventspb.AMM_Status(status), nil +} + +func MarshalAMMStatusReason(s eventspb.AMM_StatusReason) graphql.Marshaler { + return graphql.WriterFunc(func(w io.Writer) { + w.Write([]byte(strconv.Quote(s.String()))) + }) +} + +func UnmarshalAMMStatusReason(v interface{}) (eventspb.AMM_StatusReason, error) { + s, ok := v.(string) + if !ok { + return eventspb.AMM_STATUS_REASON_UNSPECIFIED, fmt.Errorf("expected AMM status reason to be a string") + } + + status, ok := eventspb.AMM_StatusReason_value[s] + if !ok { + return eventspb.AMM_STATUS_REASON_UNSPECIFIED, fmt.Errorf("failed to convert AMM status reason from GraphQL to Proto: %v", s) + } + + return eventspb.AMM_StatusReason(status), nil +} diff --git a/datanode/gateway/graphql/mocks/mocks.go b/datanode/gateway/graphql/mocks/mocks.go index cb30455b6cd..e41a0d67912 100644 --- a/datanode/gateway/graphql/mocks/mocks.go +++ b/datanode/gateway/graphql/mocks/mocks.go @@ -260,6 +260,26 @@ func (m *MockTradingDataServiceClientV2) EXPECT() *MockTradingDataServiceClientV return m.recorder } +// EstimateAMMBounds mocks base method. +func (m *MockTradingDataServiceClientV2) EstimateAMMBounds(arg0 context.Context, arg1 *v2.EstimateAMMBoundsRequest, arg2 ...grpc.CallOption) (*v2.EstimateAMMBoundsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "EstimateAMMBounds", varargs...) + ret0, _ := ret[0].(*v2.EstimateAMMBoundsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// EstimateAMMBounds indicates an expected call of EstimateAMMBounds. +func (mr *MockTradingDataServiceClientV2MockRecorder) EstimateAMMBounds(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, "EstimateAMMBounds", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).EstimateAMMBounds), varargs...) +} + // EstimateFee mocks base method. func (m *MockTradingDataServiceClientV2) EstimateFee(arg0 context.Context, arg1 *v2.EstimateFeeRequest, arg2 ...grpc.CallOption) (*v2.EstimateFeeResponse, error) { m.ctrl.T.Helper() @@ -1220,6 +1240,26 @@ func (mr *MockTradingDataServiceClientV2MockRecorder) Info(arg0, arg1 interface{ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).Info), varargs...) } +// ListAMMs mocks base method. +func (m *MockTradingDataServiceClientV2) ListAMMs(arg0 context.Context, arg1 *v2.ListAMMsRequest, arg2 ...grpc.CallOption) (*v2.ListAMMsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListAMMs", varargs...) + ret0, _ := ret[0].(*v2.ListAMMsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAMMs indicates an expected call of ListAMMs. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListAMMs(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, "ListAMMs", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListAMMs), 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() @@ -1620,6 +1660,46 @@ func (mr *MockTradingDataServiceClientV2MockRecorder) ListFundingPeriods(arg0, a return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListFundingPeriods", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListFundingPeriods), varargs...) } +// ListGamePartyScores mocks base method. +func (m *MockTradingDataServiceClientV2) ListGamePartyScores(arg0 context.Context, arg1 *v2.ListGamePartyScoresRequest, arg2 ...grpc.CallOption) (*v2.ListGamePartyScoresResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListGamePartyScores", varargs...) + ret0, _ := ret[0].(*v2.ListGamePartyScoresResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListGamePartyScores indicates an expected call of ListGamePartyScores. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListGamePartyScores(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, "ListGamePartyScores", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListGamePartyScores), varargs...) +} + +// ListGameTeamScores mocks base method. +func (m *MockTradingDataServiceClientV2) ListGameTeamScores(arg0 context.Context, arg1 *v2.ListGameTeamScoresRequest, arg2 ...grpc.CallOption) (*v2.ListGameTeamScoresResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListGameTeamScores", varargs...) + ret0, _ := ret[0].(*v2.ListGameTeamScoresResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListGameTeamScores indicates an expected call of ListGameTeamScores. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListGameTeamScores(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, "ListGameTeamScores", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListGameTeamScores), varargs...) +} + // ListGames mocks base method. func (m *MockTradingDataServiceClientV2) ListGames(arg0 context.Context, arg1 *v2.ListGamesRequest, arg2 ...grpc.CallOption) (*v2.ListGamesResponse, error) { m.ctrl.T.Helper() diff --git a/datanode/gateway/graphql/models.go b/datanode/gateway/graphql/models.go index 3335b8c3451..0bad26877c0 100644 --- a/datanode/gateway/graphql/models.go +++ b/datanode/gateway/graphql/models.go @@ -419,6 +419,30 @@ type Filter struct { Conditions []*Condition `json:"conditions,omitempty"` } +type GamePartyScoreFilter struct { + // Zero or more game IDs to filter by + GameIds []string `json:"gameIds,omitempty"` + // Zero or more team IDs to filter by + TeamIds []string `json:"teamIds,omitempty"` + // Zero or more party IDs to filter by + PartyIds []string `json:"partyIds,omitempty"` + // Optional 'from epoch' ID for scores epoch interval + EpochFrom *int `json:"epochFrom,omitempty"` + // Optional 'to epoch' ID for scores epoch interval + EpochTo *int `json:"epochTo,omitempty"` +} + +type GameTeamScoreFilter struct { + // Zero or more game IDs to filter by + GameIds []string `json:"gameIds,omitempty"` + // Zero or more team IDs to filter by + TeamIds []string `json:"teamIds,omitempty"` + // Optional 'from epoch' ID for scores epoch interval + EpochFrom *int `json:"epochFrom,omitempty"` + // Optional 'to epoch' ID for scores epoch interval + EpochTo *int `json:"epochTo,omitempty"` +} + // Individual party participating in a game and their metrics type IndividualGameEntity struct { // Party ID of the participant @@ -635,6 +659,8 @@ type PriceMonitoringBounds struct { Trigger *PriceMonitoringTrigger `json:"trigger"` // Reference price used to calculate the valid price range ReferencePrice string `json:"referencePrice"` + // Has this bound been triggered yet or is it still active + Active *bool `json:"active,omitempty"` } // PriceMonitoringParameters holds a list of triggers diff --git a/datanode/gateway/graphql/new_market_resolver.go b/datanode/gateway/graphql/new_market_resolver.go index ffd98effeb6..b54ac9f24d4 100644 --- a/datanode/gateway/graphql/new_market_resolver.go +++ b/datanode/gateway/graphql/new_market_resolver.go @@ -25,6 +25,10 @@ import ( type newMarketResolver VegaResolverRoot +func (r *newMarketResolver) EnableTxReordering(ctx context.Context, obj *types.NewMarket) (bool, error) { + return obj.Changes.EnableTransactionReordering, nil +} + func (r *newMarketResolver) TickSize(_ context.Context, obj *types.NewMarket) (string, error) { return obj.Changes.TickSize, nil } diff --git a/datanode/gateway/graphql/resolvers.go b/datanode/gateway/graphql/resolvers.go index 3cca2cdee94..eec0e0c6cef 100644 --- a/datanode/gateway/graphql/resolvers.go +++ b/datanode/gateway/graphql/resolvers.go @@ -669,6 +669,14 @@ func (r *VegaResolverRoot) TimeWeightedNotionalPosition() TimeWeightedNotionalPo return (*timeWeightedNotionalPositionResolver)(r) } +func (r *VegaResolverRoot) GamePartyScore() GamePartyScoreResolver { + return (*gamePartyScoresResolver)(r) +} + +func (r *VegaResolverRoot) GameTeamScore() GameTeamScoreResolver { + return (*gameTeamScoresResolver)(r) +} + type protocolUpgradeProposalResolver VegaResolverRoot func (r *protocolUpgradeProposalResolver) UpgradeBlockHeight(_ context.Context, obj *eventspb.ProtocolUpgradeEvent) (string, error) { @@ -776,6 +784,23 @@ func (r *myDepositResolver) CreditedTimestamp(_ context.Context, obj *vegapb.Dep type myQueryResolver VegaResolverRoot +func (r *myQueryResolver) EstimateAMMBounds(ctx context.Context, basePrice string, upperPrice, lowerPrice, leverageAtUpperPrice, leverageAtLowerPrice *string, commitmentAmount string, marketID string) (*v2.EstimateAMMBoundsResponse, error) { + res, err := r.tradingDataClientV2.EstimateAMMBounds(ctx, &v2.EstimateAMMBoundsRequest{ + BasePrice: basePrice, + UpperPrice: upperPrice, + LowerPrice: lowerPrice, + LeverageAtUpperPrice: leverageAtUpperPrice, + LeverageAtLowerPrice: leverageAtLowerPrice, + CommitmentAmount: commitmentAmount, + MarketId: marketID, + }) + if err != nil { + return nil, err + } + + return res, nil +} + func (r *myQueryResolver) TimeWeightedNotionalPosition(ctx context.Context, assetID, partyID, gameID string, epoch *int) (*v2.TimeWeightedNotionalPosition, error) { var atEpoch *uint64 if epoch != nil { @@ -796,6 +821,25 @@ func (r *myQueryResolver) TimeWeightedNotionalPosition(ctx context.Context, asse return res.TimeWeightedNotionalPosition, nil } +func (r *myQueryResolver) Amms(ctx context.Context, partyID *string, marketID *string, id *string, + ammPartyID *string, status *v1.AMM_Status, pagination *v2.Pagination, +) (*v2.AMMConnection, error) { + req := &v2.ListAMMsRequest{ + Id: id, + PartyId: partyID, + MarketId: marketID, + AmmPartyId: ammPartyID, + Status: status, + Pagination: pagination, + } + + res, err := r.tradingDataClientV2.ListAMMs(ctx, req) + if err != nil { + return nil, err + } + return res.Amms, nil +} + func (r *myQueryResolver) PartiesProfilesConnection(ctx context.Context, ids []string, pagination *v2.Pagination) (*v2.PartiesProfilesConnection, error) { req := v2.ListPartiesProfilesRequest{ Parties: ids, @@ -809,6 +853,77 @@ func (r *myQueryResolver) PartiesProfilesConnection(ctx context.Context, ids []s return res.Profiles, nil } +func (r *myQueryResolver) GamePartyScores(ctx context.Context, filter *GamePartyScoreFilter, pagination *v2.Pagination) (*v2.GamePartyScoresConnection, error) { + gameIds := []string{} + teamIds := []string{} + partyIds := []string{} + var epochFrom, epochTo *uint64 + + if filter != nil { + gameIds = filter.GameIds + teamIds = filter.TeamIds + partyIds = filter.PartyIds + if filter.EpochFrom != nil { + ef := uint64(*filter.EpochFrom) + epochFrom = &ef + } + if filter.EpochTo != nil { + et := uint64(*filter.EpochTo) + epochTo = &et + } + } + + req := v2.ListGamePartyScoresRequest{ + Filter: &v2.GamePartyScoresFilter{ + GameIds: gameIds, + TeamIds: teamIds, + PartyIds: partyIds, + EpochFrom: epochFrom, + EpochTo: epochTo, + }, + Pagination: pagination, + } + res, err := r.tradingDataClientV2.ListGamePartyScores(ctx, &req) + if err != nil { + return nil, err + } + return res.PartyScores, nil +} + +func (r *myQueryResolver) GameTeamScores(ctx context.Context, filter *GameTeamScoreFilter, pagination *v2.Pagination) (*v2.GameTeamScoresConnection, error) { + gameIds := []string{} + teamIds := []string{} + var epochFrom, epochTo *uint64 + + if filter != nil { + gameIds = filter.GameIds + teamIds = filter.TeamIds + if filter.EpochFrom != nil { + ef := uint64(*filter.EpochFrom) + epochFrom = &ef + } + if filter.EpochTo != nil { + et := uint64(*filter.EpochTo) + epochTo = &et + } + } + + req := v2.ListGameTeamScoresRequest{ + Filter: &v2.GameTeamScoresFilter{ + GameIds: gameIds, + TeamIds: teamIds, + EpochFrom: epochFrom, + EpochTo: epochTo, + }, + Pagination: pagination, + } + res, err := r.tradingDataClientV2.ListGameTeamScores(ctx, &req) + if err != nil { + return nil, err + } + return res.TeamScores, nil +} + func (r *myQueryResolver) PartyMarginModes(ctx context.Context, marketID *string, partyID *string, pagination *v2.Pagination) (*v2.PartyMarginModesConnection, error) { req := v2.ListPartyMarginModesRequest{ MarketId: marketID, @@ -1059,6 +1174,7 @@ func (r *myQueryResolver) Erc20WithdrawalApproval(ctx context.Context, wid strin Signatures: res.Signatures, TargetAddress: res.TargetAddress, Creation: fmt.Sprintf("%d", res.Creation), + SourceChainID: res.SourceChainId, }, nil } @@ -1968,19 +2084,27 @@ func (r *myQueryResolver) TeamRefereeHistory(ctx context.Context, referee string } func (r *myQueryResolver) FeesStats(ctx context.Context, marketID *string, assetID *string, epoch *int, - partyID *string, + partyID *string, epochFrom, epochTo *int, ) (*v1.FeesStats, error) { - var epochSeq *uint64 + var epochSeq, from, to *uint64 if epoch != nil { epochSeq = ptr.From(uint64(*epoch)) } + if epochFrom != nil { + from = ptr.From(uint64(*epochFrom)) + } + if epochTo != nil { + to = ptr.From(uint64(*epochTo)) + } req := &v2.GetFeesStatsRequest{ - MarketId: marketID, - AssetId: assetID, - EpochSeq: epochSeq, - PartyId: partyID, + MarketId: marketID, + AssetId: assetID, + EpochSeq: epochSeq, + PartyId: partyID, + EpochFrom: from, + EpochTo: to, } resp, err := r.tradingDataClientV2.GetFeesStats(ctx, req) @@ -2023,18 +2147,29 @@ func (r *myQueryResolver) PaidLiquidityFees( assetID *string, epoch *int, partyIDs []string, + includeDerivedParties *bool, + from, to *int, ) (*v2.PaidLiquidityFeesConnection, error) { - var epochSeq *uint64 + var epochSeq, epochFrom, epochTo *uint64 if epoch != nil { epochSeq = ptr.From(uint64(*epoch)) } + if from != nil { + epochFrom = ptr.From(uint64(*from)) + } + if to != nil { + epochTo = ptr.From(uint64(*to)) + } req := &v2.ListPaidLiquidityFeesRequest{ - MarketId: marketID, - AssetId: assetID, - EpochSeq: epochSeq, - PartyIds: partyIDs, + MarketId: marketID, + AssetId: assetID, + EpochSeq: epochSeq, + PartyIds: partyIDs, + IncludeDerivedParties: includeDerivedParties, + EpochFrom: epochFrom, + EpochTo: epochTo, } resp, err := r.tradingDataClientV2.ListPaidLiquidityFees(ctx, req) @@ -2165,7 +2300,7 @@ func (r *myPartyResolver) TransfersConnection( } func (r *myPartyResolver) RewardsConnection(ctx context.Context, party *vegapb.Party, assetID *string, pagination *v2.Pagination, - fromEpoch *int, toEpoch *int, teamID, gameID *string, + fromEpoch *int, toEpoch *int, teamID, gameID *string, includeDerivedParties *bool, marketID *string, ) (*v2.RewardsConnection, error) { var from, to *uint64 @@ -2185,13 +2320,15 @@ func (r *myPartyResolver) RewardsConnection(ctx context.Context, party *vegapb.P } req := v2.ListRewardsRequest{ - PartyId: party.Id, - AssetId: assetID, - Pagination: pagination, - FromEpoch: from, - ToEpoch: to, - TeamId: teamID, - GameId: gameID, + PartyId: party.Id, + AssetId: assetID, + Pagination: pagination, + FromEpoch: from, + ToEpoch: to, + TeamId: teamID, + GameId: gameID, + IncludeDerivedParties: includeDerivedParties, + MarketId: marketID, } resp, err := r.tradingDataClientV2.ListRewards(ctx, &req) if err != nil { @@ -2205,6 +2342,7 @@ func (r *myPartyResolver) RewardSummaries( ctx context.Context, party *vegapb.Party, asset *string, + includeDerivedParties *bool, ) ([]*vegapb.RewardSummary, error) { var assetID string if asset != nil { @@ -2212,8 +2350,9 @@ func (r *myPartyResolver) RewardSummaries( } req := &v2.ListRewardSummariesRequest{ - PartyId: &party.Id, - AssetId: &assetID, + PartyId: &party.Id, + AssetId: &assetID, + IncludeDerivedParties: includeDerivedParties, } resp, err := r.tradingDataClientV2.ListRewardSummaries(ctx, req) @@ -2429,7 +2568,7 @@ func (r *myPartyResolver) PositionsConnection(ctx context.Context, party *vegapb return res.Positions, nil } -func (r *myPartyResolver) AccountsConnection(ctx context.Context, party *vegapb.Party, marketID *string, asset *string, accType *vegapb.AccountType, pagination *v2.Pagination) (*v2.AccountsConnection, error) { +func (r *myPartyResolver) AccountsConnection(ctx context.Context, party *vegapb.Party, marketID *string, asset *string, accType *vegapb.AccountType, pagination *v2.Pagination, includeDerivedParties *bool) (*v2.AccountsConnection, error) { if party == nil { return nil, errors.New("a party must be specified when querying accounts") } @@ -2470,7 +2609,7 @@ func (r *myPartyResolver) AccountsConnection(ctx context.Context, party *vegapb. AccountTypes: accountTypes, } - req := v2.ListAccountsRequest{Filter: &filter, Pagination: pagination} + req := v2.ListAccountsRequest{Filter: &filter, Pagination: pagination, IncludeDerivedParties: includeDerivedParties} res, err := r.tradingDataClientV2.ListAccounts(ctx, &req) if err != nil { r.log.Error("unable to get Party account", @@ -3042,6 +3181,14 @@ func (r *myPriceLevelResolver) Volume(_ context.Context, obj *vegapb.PriceLevel) return strconv.FormatUint(obj.Volume, 10), nil } +func (r *myPriceLevelResolver) AmmVolume(_ context.Context, obj *vegapb.PriceLevel) (string, error) { + return strconv.FormatUint(obj.AmmVolume, 10), nil +} + +func (r *myPriceLevelResolver) AmmVolumeEstimated(_ context.Context, obj *vegapb.PriceLevel) (string, error) { + return strconv.FormatUint(obj.AmmVolumeEstimated, 10), nil +} + func (r *myPriceLevelResolver) NumberOfOrders(_ context.Context, obj *vegapb.PriceLevel) (string, error) { return strconv.FormatUint(obj.NumberOfOrders, 10), nil } @@ -3175,7 +3322,7 @@ func (r *mySubscriptionResolver) Margins(ctx context.Context, partyID string, ma return ch, nil } -func (r *mySubscriptionResolver) Accounts(ctx context.Context, marketID *string, partyID *string, asset *string, typeArg *vegapb.AccountType) (<-chan []*v2.AccountBalance, error) { +func (r *mySubscriptionResolver) Accounts(ctx context.Context, marketID *string, partyID *string, asset *string, typeArg *vegapb.AccountType, includeDerivedParties *bool) (<-chan []*v2.AccountBalance, error) { var ( mkt, pty, ast string ty vegapb.AccountType @@ -3199,10 +3346,11 @@ func (r *mySubscriptionResolver) Accounts(ctx context.Context, marketID *string, } req := &v2.ObserveAccountsRequest{ - Asset: ast, - MarketId: mkt, - PartyId: pty, - Type: ty, + Asset: ast, + MarketId: mkt, + PartyId: pty, + Type: ty, + IncludeDerivedParties: includeDerivedParties, } stream, err := r.tradingDataClientV2.ObserveAccounts(ctx, req) if err != nil { @@ -3410,10 +3558,11 @@ func (r *mySubscriptionResolver) TradesStream(ctx context.Context, filter Trades return c, nil } -func (r *mySubscriptionResolver) Positions(ctx context.Context, party, market *string) (<-chan []*vegapb.Position, error) { +func (r *mySubscriptionResolver) Positions(ctx context.Context, party, market *string, includeDerivedParties *bool) (<-chan []*vegapb.Position, error) { req := &v2.ObservePositionsRequest{ - PartyId: party, - MarketId: market, + PartyId: party, + MarketId: market, + IncludeDerivedParties: includeDerivedParties, } stream, err := r.tradingDataClientV2.ObservePositions(ctx, req) if err != nil { @@ -3891,6 +4040,13 @@ func (r *myAccountResolver) Party(ctx context.Context, acc *v2.AccountBalance) ( return getParty(ctx, r.log, r.r.clt2, acc.Owner) } +func (r *myAccountResolver) ParentPartyID(ctx context.Context, acc *v2.AccountBalance) (*vegapb.Party, error) { + if acc.ParentPartyId == nil || *acc.ParentPartyId == "" { + return nil, nil + } + return getParty(ctx, r.log, r.r.clt2, *acc.ParentPartyId) +} + func (r *myAccountResolver) Asset(ctx context.Context, obj *v2.AccountBalance) (*vegapb.Asset, error) { return r.r.getAssetByID(ctx, obj.Asset) } diff --git a/datanode/gateway/graphql/resolvers_test.go b/datanode/gateway/graphql/resolvers_test.go index 08f8752c048..4de6cda7537 100644 --- a/datanode/gateway/graphql/resolvers_test.go +++ b/datanode/gateway/graphql/resolvers_test.go @@ -1298,7 +1298,7 @@ func TestRewardsResolver(t *testing.T) { partyResolver := root.Party() root.tradingDataClient.EXPECT().ListRewardSummaries(gomock.Any(), gomock.Any()).Times(1).Return(nil, errors.New("some error")) assetID := "asset" - r, e := partyResolver.RewardSummaries(ctx, &protoTypes.Party{Id: "some"}, &assetID) + r, e := partyResolver.RewardSummaries(ctx, &protoTypes.Party{Id: "some"}, &assetID, nil) require.Nil(t, r) require.NotNil(t, e) } diff --git a/datanode/gateway/graphql/reward_summary.go b/datanode/gateway/graphql/reward_summary.go index 0a0c0cf65be..5c3d14c684d 100644 --- a/datanode/gateway/graphql/reward_summary.go +++ b/datanode/gateway/graphql/reward_summary.go @@ -29,11 +29,12 @@ func (r *rewardSummaryResolver) Asset(ctx context.Context, obj *vega.RewardSumma return r.r.getAssetByID(ctx, obj.AssetId) } -func (r *rewardSummaryResolver) RewardsConnection(ctx context.Context, summary *vega.RewardSummary, assetID *string, pagination *v2.Pagination) (*v2.RewardsConnection, error) { +func (r *rewardSummaryResolver) RewardsConnection(ctx context.Context, summary *vega.RewardSummary, assetID *string, pagination *v2.Pagination, includeDerivedParties *bool) (*v2.RewardsConnection, error) { req := v2.ListRewardsRequest{ - PartyId: summary.PartyId, - AssetId: assetID, - Pagination: pagination, + PartyId: summary.PartyId, + AssetId: assetID, + Pagination: pagination, + IncludeDerivedParties: includeDerivedParties, } resp, err := r.tradingDataClientV2.ListRewards(ctx, &req) if err != nil { diff --git a/datanode/gateway/graphql/schema.graphql b/datanode/gateway/graphql/schema.graphql index a15e7ebe0bd..7a0864dc2ce 100644 --- a/datanode/gateway/graphql/schema.graphql +++ b/datanode/gateway/graphql/schema.graphql @@ -55,6 +55,8 @@ type Subscription { assetId: ID "Type of the account" type: AccountType + "Whether to return all derived parties from AMMs for the given party. If used, party ID is required" + includeDerivedParties: Boolean ): [AccountUpdate!]! "Subscribe to event data from the event bus" @@ -120,6 +122,8 @@ type Subscription { partyId: ID "ID of the market from which you want position updates" marketId: ID + "Whether to return all derived parties from AMMs for the given party. If used, party ID is required" + includeDerivedParties: Boolean ): [PositionUpdate!]! "Subscribe to proposals. Leave out all arguments to receive all proposals" @@ -135,9 +139,9 @@ type Subscription { "ID of the party from which you want trades updates" partyId: ID ): [TradeUpdate!] - @deprecated( - reason: "Use tradesStream instead as it allows for filtering multiple markets and/or parties at once" - ) + @deprecated( + reason: "Use tradesStream instead as it allows for filtering multiple markets and/or parties at once" + ) "Subscribe to the trades updates" tradesStream( @@ -583,6 +587,25 @@ input RewardSummaryFilter { "Queries allow a caller to read data and filter data via GraphQL." type Query { + amms( + "AMM ID to filter for. Party ID and Market ID filters must not be set if used." + id: ID + "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 + + """ + Party's underlying AMM sub-account to filter for. A party will only ever have one AMM sub-account regardless of how many AMMs they have created. + This filter is ignored if party ID, market ID, or AMM ID is set. + """ + ammPartyId: ID + "AMM status to filter for. This filter is ignored if any of the other filters are set." + status: AMMStatus + "Optional pagination information" + pagination: Pagination + ): AMMConnection! + "An asset which is used in the vega network" asset("ID of the asset" id: ID!): Asset @@ -701,7 +724,7 @@ type Query { "Type of the order" type: OrderType! ): OrderEstimate! - @deprecated(reason: "Use estimateFees and estimatePosition instead") + @deprecated(reason: "Use estimateFees and estimatePosition instead") "Return an estimation of the potential cost for a new order" estimateFees( @@ -749,6 +772,33 @@ type Query { scaleLiquidationPriceToMarketDecimals: Boolean ): PositionEstimate + "Estimate bounds for an AMM pool." + estimateAMMBounds( + """ + Base price of the AMM pool, the price is an integer, for example `123456` is a correctly + formatted price of `1.23456` assuming market configured to 5 decimal places. + """ + basePrice:String! + """ + Upper price of the AMM pool, the price is an integer, for example `123456` is a correctly + formatted price of `1.23456` assuming market configured to 5 decimal places. + """ + upperPrice: String + """ + Lower price of the AMM pool, the price is an integer, for example `123456` is a correctly + formatted price of `1.23456` assuming market configured to 5 decimal places. + """ + lowerPrice: String + "Leverage at the upper price of the AMM pool." + leverageAtUpperPrice: String + "Leverage at the lower price of the AMM pool." + leverageAtLowerPrice: String + "Amount of the asset that the party is willing to commit to the AMM pool." + commitmentAmount: String! + "Market ID to filter for." + marketId: ID! + ): EstimatedAMMBounds + "Query for historic ethereum key rotations" ethereumKeyRotations(nodeId: ID): EthereumKeyRotationsConnection! @@ -776,6 +826,10 @@ type Query { epoch: Int "Optional party ID to filter for" partyId: ID + "Optional epoch to filter from (included). If omitted, the last epoch will be used." + epochFrom: Int + "Optional epoch to filter to (included). If omitted, the last epoch will be used." + epochTo: Int ): FeesStats "Get fees statistics for a given party" @@ -1013,10 +1067,16 @@ type Query { marketId: ID "Optional asset ID to filter for." assetId: ID - "Optional epoch to filter for. If omitted, the most recent epoch's data is returned." + "Optional epoch to filter for. If no epoch filters are provided, the most recent epoch's data is returned." epoch: Int "Optional party IDs to filter for" partyIDs: [String!] + "Whether to return all derived parties from AMMs for the given party. If used, party ID is required" + includeDerivedParties: Boolean + "Start epoch to return the results from (inclusive), if no epoch filters are provided, the most recent epoch's data is returned." + epochFrom: Int + "End epoch to return the results to (inclusive), if no epoch filters are provided, the most recent epoch's data is returned." + epochTo: Int ): PaidLiquidityFeesConnection "One or more entities that are trading on the Vega network" @@ -1120,6 +1180,22 @@ type Query { pagination: Pagination ): StopOrderConnection + "Get a list of current game team scores. If provided, the filter will be applied to the list of games/teams to restrict the results." + gameTeamScores( + "Optional filter to restrict the results of the list." + filter: GameTeamScoreFilter + "Optional pagination information" + pagination: Pagination + ): GameTeamScoreConnection + + "Get a list of current game party scores. If provided, the filter will be applied to the list of games/parties to restrict the results." + gamePartyScores( + "Optional filter to restrict the results of the list." + filter: GamePartyScoreFilter + "Optional pagination information" + pagination: Pagination + ): GamePartyScoreConnection + "List markets in a succession line" successorMarkets( "Market ID of any market in the succession line" @@ -1290,6 +1366,21 @@ type Query { ): PartyMarginModesConnection } +type EstimatedAMMBounds { + "Theoretical volume at the top of the upper bound." + positionSizeAtUpper: String + "Theoretical volume at the top of the lower bound." + positionSizeAtLower: String + "Loss of commitment at the upper bound." + lossOnCommitmentAtUpper: String + "Loss of commitment at the lower bound." + lossOnCommitmentAtLower: String + "Estimated price above upper bound at which the commitment will be lost." + liquidationPriceAtUpper: String + "Estimated price below the lower bound at which the commitment will be lost." + liquidationPriceAtLower: String +} + "Defines the types of a dispatch strategy's scope the API can filter on." enum TransferScope { "Matches transfers that have dispatch strategy scope of individual set." @@ -1358,7 +1449,7 @@ type Transfer { } union TransferKind = - OneOffTransfer + OneOffTransfer | RecurringTransfer | OneOffGovernanceTransfer | RecurringGovernanceTransfer @@ -1377,6 +1468,8 @@ type RecurringGovernanceTransfer { endEpoch: Int "An optional dispatch strategy for the recurring transfer" dispatchStrategy: DispatchStrategy + "The factor of the initial amount to be distributed" + factor: String } "The specific details for a one-off transfer" @@ -1433,6 +1526,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 { @@ -2040,6 +2135,16 @@ type LogNormalRiskModel { tau: Float! "Parameters for the log normal risk model" params: LogNormalModelParams! + "An optional override for the risk factor calculated by the risk model." + riskFactorOverride: RiskFactorOverride +} + +"Risk factor override to control stable leverage" +type RiskFactorOverride { + "Short Risk factor value" + short: String! + "Long Risk factor value" + long: String! } "A type of simple/dummy risk model where you can specify the risk factor long and short in params" @@ -2067,6 +2172,16 @@ type EthereumEvent { union Oracle = EthereumEvent +"Capped future configuration" +type FutureCap { + "The max price cap for a future" + maxPrice: String! + "True for options market" + binarySettlement: Boolean + "True if parties are fully collateralised on this market" + fullyCollateralised: Boolean +} + "A Future product" type Future { "The name of the asset (string)" @@ -2083,6 +2198,9 @@ type Future { "The binding between the data source specification and the settlement data" dataSourceSpecBinding: DataSourceSpecToFutureBinding! + + "If set, the market is a capped future" + cap: FutureCap } "Spot FX product" @@ -2356,6 +2474,8 @@ type Instrument { type MarginCalculator { "The scaling factors that will be used for margin calculation" scalingFactors: ScalingFactors! + "If set to true on a capped future, all positions must be fully collateralised" + fullyCollateralised: Boolean } type ScalingFactors { @@ -2473,6 +2593,8 @@ type PriceMonitoringBounds { trigger: PriceMonitoringTrigger! "Reference price used to calculate the valid price range" referencePrice: String! + "Has this bound been triggered yet or is it still active" + active: Boolean } "TargetStakeParameters contains parameters used in target stake calculation" @@ -2566,6 +2688,8 @@ type Market { partyId: ID "Pagination information" pagination: Pagination + "Whether to return all derived parties from AMMs for the given party. If used, party ID is required" + includeDerivedParties: Boolean ): AccountsConnection tradesConnection( @@ -2574,9 +2698,9 @@ type Market { "Pagination information" pagination: Pagination ): TradeConnection - @deprecated( - reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" - ) + @deprecated( + reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" + ) "Current depth on the order book for this market" depth( @@ -2618,7 +2742,7 @@ type Market { "Pagination information" pagination: Pagination ): LiquidityProvisionsConnection - @deprecated(reason: "Use liquidityProvisions instead") + @deprecated(reason: "Use liquidityProvisions instead") "Timestamps for state changes in the market" marketTimestamps: MarketTimestamps! @@ -2631,7 +2755,7 @@ type Market { "Quadratic slippage factor is used to cap the slippage component of maintainence margin - it is applied to the square of the slippage volume" quadraticSlippageFactor: String! - @deprecated(reason: "This field will be removed in a future release") + @deprecated(reason: "This field will be removed in a future release") """ Optional: Parent market ID. A market can be a successor to another market. If this market is a successor to a previous market, @@ -2658,6 +2782,9 @@ type Market { "The market minimum tick size" tickSize: String! + + "If enabled aggressive orders sent to the market will be delayed by the configured number of blocks" + enableTxReordering: Boolean! } """ @@ -2763,6 +2890,12 @@ type PriceLevel { "The total remaining size of all orders at this level (uint64)" volume: String! + "The total volume of all AMM's at this level (uint64)" + ammVolume: String! + + "The total estimated volume of all AMM's at this level (uint64)" + ammVolumeEstimated: String! + "The number of orders at this price level (uint64)" numberOfOrders: String! } @@ -2815,9 +2948,9 @@ type Party { "Pagination information" pagination: Pagination ): TradeConnection - @deprecated( - reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" - ) + @deprecated( + reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" + ) "Collateral accounts relating to a party" accountsConnection( @@ -2829,11 +2962,13 @@ type Party { type: AccountType "Cursor pagination information" pagination: Pagination + "Whether to return all derived parties from AMMs for the given party. If used, party ID is required" + includeDerivedParties: Boolean ): AccountsConnection "Trading positions relating to a party" positionsConnection(market: ID, pagination: Pagination): PositionConnection - @deprecated(reason: "Use root positions query instead of sub-query") + @deprecated(reason: "Use root positions query instead of sub-query") "Margin levels for a market" marginsConnection( @@ -2898,7 +3033,7 @@ type Party { "Optional Pagination information" pagination: Pagination ): LiquidityProvisionsConnection - @deprecated(reason: "Use liquidityProvisions instead") + @deprecated(reason: "Use liquidityProvisions instead") # All delegations for a party to a given node if node is specified, or all delegations if not delegationsConnection( @@ -2925,10 +3060,19 @@ type Party { teamId: ID "Optionally filter for rewards earned for the given game ID" gameId: ID + "Whether to return rewards for all derived parties from AMMs for the given party. If used, party ID is required" + includeDerivedParties: Boolean + "Optionally filter for rewards by market ID" + marketId: ID ): RewardsConnection "Return net reward information" - rewardSummaries("An asset ID (optional)" assetId: ID): [RewardSummary] + rewardSummaries( + "Restrict the reward summary to rewards paid in the given assets." + assetId: ID + "Whether to return rewards for all derived parties from AMMs for the given party. If used, party ID is required" + includeDerivedParties: Boolean + ): [RewardSummary] "All transfers for a public key" transfersConnection( @@ -2977,6 +3121,10 @@ type PartyVestingStats { rewardBonusMultiplier: String! "The balance of the party, in quantum." quantumBalance: String! + "Bonus multiplier applied on the reward, summed across all derived accounts." + summedRewardBonusMultiplier: String + "The balance of the party and derived keys, in quantum." + summedQuantumBalance: String } """ @@ -3243,9 +3391,9 @@ type Order { dateRange: DateRange pagination: Pagination ): TradeConnection - @deprecated( - reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" - ) + @deprecated( + reason: "Simplify and consolidate trades query and remove nesting. Use trades query instead" + ) "The order type" type: OrderType @@ -3301,7 +3449,7 @@ enum StopOrderRejectionReason { REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_WITHOUT_A_POSITION "This stop order does not close the position" REJECTION_REASON_STOP_ORDER_NOT_CLOSING_THE_POSITION - "The percentage value for the linked stop order is invalid" + "The percentage value for the linked stop order is invalid" REJECTION_REASON_STOP_ORDER_LINKED_PERCENTAGE_INVALID "Stop orders are not allowed during the opening auction" REJECTION_REASON_STOP_ORDER_NOT_ALLOWED_DURING_OPENING_AUCTION @@ -3660,6 +3808,8 @@ type AccountBalance { market: Market "Owner of the account" party: Party + "Parent party ID of the account. Used in cases where the account is derived from another party's account." + parentPartyId: Party } "An account record" @@ -4262,6 +4412,9 @@ enum OrderRejectionReason { "Pegged orders are not allowed for a party in isolated margin mode" ORDER_ERROR_PEGGED_ORDERS_NOT_ALLOWED_IN_ISOLATED_MARGIN_MODE + + "Order price exceeds the max price of the capped future market" + ORDER_ERROR_PRICE_MUST_BE_LESS_THAN_OR_EQUAL_TO_MAX_PRICE } "Types of orders" @@ -4328,6 +4481,9 @@ enum MarketTradingMode { "Special auction mode triggered via governance market suspension" TRADING_MODE_SUSPENDED_VIA_GOVERNANCE + + "Auction triggered by a long block" + TRADING_MODE_LONG_BLOCK_AUCTION } "Whether the placer of an order is aiming to buy or sell on the market" @@ -4518,6 +4674,12 @@ enum TransferType { TRANSFER_TYPE_ORDER_MARGIN_HIGH "Funds moved from order margin account to margin account." TRANSFER_TYPE_ISOLATED_MARGIN_LOW + "Transfer from a party's general account to their AMM's general account." + TRANSFER_TYPE_AMM_LOW + "Transfer from an AMM's general account to their owner's general account." + TRANSFER_TYPE_AMM_HIGH + "Transfer releasing an AMM's general account upon closure." + TRANSFER_TYPE_AMM_RELEASE } union ProductConfiguration = FutureProduct | SpotProduct | PerpetualProduct @@ -4540,6 +4702,9 @@ type FutureProduct { used as settlement data. """ dataSourceSpecBinding: DataSourceSpecToFutureBinding! + + "If set, the product belongs to a capped future" + cap: FutureCap } type SpotProduct { @@ -4694,7 +4859,7 @@ type NewMarket { linearSlippageFactor: String! "Quadratic slippage factor is used to cap the slippage component of maintenance margin - it is applied to the square of the slippage volume" quadraticSlippageFactor: String! - @deprecated(reason: "This field will be removed in a future release") + @deprecated(reason: "This field will be removed in a future release") "Successor market configuration. If this proposed market is meant to succeed a given market, then this needs to be set." successorConfiguration: SuccessorConfiguration "Liquidity SLA Parameters" @@ -4707,6 +4872,8 @@ type NewMarket { markPriceConfiguration: CompositePriceConfiguration! "The market minimum tick size" tickSize: String! + "If enabled aggressive orders sent to the market will be delayed by the configured number of blocks" + enableTxReordering: Boolean! } type CompositePriceConfiguration { @@ -4759,7 +4926,7 @@ type UpdateMarketConfiguration { linearSlippageFactor: String! "Quadratic slippage factor is used to cap the slippage component of maintenance margin - it is applied to the square of the slippage volume." quadraticSlippageFactor: String! - @deprecated(reason: "This field will be removed in a future release") + @deprecated(reason: "This field will be removed in a future release") "Liquidity SLA Parameters." liquiditySLAParameters: LiquiditySLAParameters "Specifies how the liquidity fee for the market will be calculated" @@ -4770,6 +4937,8 @@ type UpdateMarketConfiguration { markPriceConfiguration: CompositePriceConfiguration "The market minimum tick size" tickSize: String! + "If enabled aggressive orders sent to the market will be delayed by the configured number of blocks" + enableTxReordering: Boolean! } type UpdateInstrumentConfiguration { @@ -4813,7 +4982,7 @@ type UpdatePerpetualProduct { } union UpdateMarketRiskParameters = - UpdateMarketSimpleRiskModel + UpdateMarketSimpleRiskModel | UpdateMarketLogNormalRiskModel type UpdateMarketSimpleRiskModel { @@ -4894,7 +5063,7 @@ type NewTransfer { } union GovernanceTransferKind = - OneOffGovernanceTransfer + OneOffGovernanceTransfer | RecurringGovernanceTransfer "Allows for cancellation of an existing governance transfer" @@ -4999,6 +5168,8 @@ type NewSpotMarket { liquidityFeeSettings: LiquidityFeeSettings "The market minimum tick size" tickSize: String! + "If enabled aggressive orders sent to the market will be delayed by the configured number of blocks" + enableTxReordering: Boolean! } "Update an existing spot market on Vega" @@ -5012,7 +5183,7 @@ type UpdateSpotMarket { type UpdateSpotInstrumentConfiguration { "Instrument code, human-readable shortcode used to describe the instrument." code: String! - "Instrument name" + "Instrument name" name: String! } @@ -5033,6 +5204,8 @@ type UpdateSpotMarketConfiguration { liquidityFeeSettings: LiquidityFeeSettings "The market minimum tick size" tickSize: String! + "If enabled aggressive orders sent to the market will be delayed by the configured number of blocks" + enableTxReordering: Boolean! } type LiquiditySLAParameters { @@ -5070,7 +5243,7 @@ type NetworkParameter { } union ProposalChange = - NewMarket + NewMarket | UpdateMarket | UpdateNetworkParameter | NewAsset @@ -5508,6 +5681,8 @@ enum AuctionTrigger { AUCTION_TRIGGER_UNABLE_TO_DEPLOY_LP_ORDERS "Auction triggered by governance market suspension" AUCTION_TRIGGER_GOVERNANCE_SUSPENSION + "Auction triggered following a long block, e.g. due to protocol upgrade" + AUCTION_TRIGGER_LONG_BLOCK } "Event types" @@ -5685,6 +5860,8 @@ type RewardSummary { assetId: ID "Cursor pagination information" pagination: Pagination + "Whether to return all derived parties from AMMs for the given party. If used, party ID is required" + includeDerivedParties: Boolean ): RewardsConnection } @@ -5969,6 +6146,30 @@ input StopOrderFilter { liveOnly: Boolean } +input GameTeamScoreFilter { + "Zero or more game IDs to filter by" + gameIds: [ID!] + "Zero or more team IDs to filter by" + teamIds: [ID!] + "Optional 'from epoch' ID for scores epoch interval" + epochFrom: Int + "Optional 'to epoch' ID for scores epoch interval" + epochTo: Int +} + +input GamePartyScoreFilter { + "Zero or more game IDs to filter by" + gameIds: [ID!] + "Zero or more team IDs to filter by" + teamIds: [ID!] + "Zero or more party IDs to filter by" + partyIds: [ID!] + "Optional 'from epoch' ID for scores epoch interval" + epochFrom: Int + "Optional 'to epoch' ID for scores epoch interval" + epochTo: Int +} + input OrderByPartyIdsFilter { order: OrderFilter partyIds: [ID!] @@ -6001,6 +6202,38 @@ type StopOrderConnection { pageInfo: PageInfo } +"Connection type for retrieving cursor-based paginated game team score information" +type GameTeamScoreConnection { + "The game team scores in this connection" + edges: [GameTeamScoreEdge!] + "The pagination information" + pageInfo: PageInfo +} + +"Connection type for retrieving cursor-based paginated game party score information" +type GamePartyScoreConnection { + "The game party scores in this connection" + edges: [GamePartyScoreEdge!] + "The pagination information" + pageInfo: PageInfo +} + +"Edge type containing the game party scores and cursor information returned by a GamePartyScoreConnection" +type GamePartyScoreEdge { + "The game party score" + node: GamePartyScore + "The cursor for this game party score" + cursor: String +} + +"Edge type containing the game team scores and cursor information returned by a GameTeamScoreConnection" +type GameTeamScoreEdge { + "The game team score" + node: GameTeamScore + "The cursor for this game team score" + cursor: String +} + "Edge type containing the position and cursor information returned by a PositionConnection" type PositionEdge { "The position" @@ -6557,7 +6790,7 @@ type DataSourceSpecConfigurationTimeTrigger { } union InternalDataSourceKind = - DataSourceSpecConfigurationTime + DataSourceSpecConfigurationTime | DataSourceSpecConfigurationTimeTrigger """ @@ -6579,7 +6812,7 @@ type DataSourceDefinitionExternal { } union DataSourceKind = - DataSourceDefinitionInternal + DataSourceDefinitionInternal | DataSourceDefinitionExternal """ @@ -7351,3 +7584,127 @@ type TimeWeightedNotionalPosition { "Time of the last block in which the metric was updated" lastUpdated: Timestamp! } + +"Game team score" +type GameTeamScore { + "Game ID" + gameId: ID! + "Team ID" + teamId: ID! + "The epoch for which this score is" + epochId: Int! + "Time of the score in RFC3339Nano" + time: Timestamp! + "The score" + score: String! +} + +"Game party score" +type GamePartyScore { + "Game ID" + gameId: ID! + "Team ID (optional)" + teamId: ID + "The epoch for which this score is" + epochId: Int! + "The party ID" + partyId: ID! + "Time of the score in RFC3339Nano" + time: Timestamp! + "The current score of the party in the game" + score: String! + "The staking balance of the party in the game, will be populated only if the game has a requirement for it" + stakingBalance: String + "The open volume of the party in the game, will be populated only if the game has a requirement for it" + openVolume: String + "The total fees paid by the party in the game during the relevant period" + totalFeesPaid: String! + "Is the party eligible for a reward in this game based on existing information" + isEligible: Boolean! + "If the party is a member of a team, this is their relative position in the sorting order of the team's scores" + rank: Int +} + +"Connection type for retrieving AMM information" +type AMMConnection { + "Page of AMMs for the connection" + edges: [AMMEdge] + "Current page information" + pageInfo: PageInfo +} + +"Edge type containing the AMM and cursor information returned by an AMMConnection" +type AMMEdge { + "AMM information" + node: AMM! + "Cursor identifying the AMM" + cursor: String! +} + +type AMM { + "AMM ID" + id: ID! + "Party ID of the AMM creator" + partyId: ID! + "Market ID of the AMM" + marketId: ID! + "Party ID the AMM operates as" + ammPartyId: String! + "Amount committed to the AMM" + commitment: String! + "Parameters for the liquidity provision" + parameters: ConcentratedLiquidityParameters! + "Status of the AMM" + status: AMMStatus! + "Reason for status if applicable" + statusReason: AMMStatusReason! + "Proposed fee" + proposedFee: String +} + +type ConcentratedLiquidityParameters { + "Base amount" + base: String! + "Lower bound" + lowerBound: String! + "Upper bound" + upperBound: String! + "Margin ratio at the upper bound" + leverageAtUpperBound: String! + "Margin ratio at the lower bound" + leverageAtLowerBound: String! +} + +enum AMMStatus { + "Status has not been specified" + STATUS_UNSPECIFIED + "The AMM is active on the market and is posting tradable volume" + STATUS_ACTIVE + "The AMM submission was rejected" + STATUS_REJECTED + "The AMM has been cancelled by the owner and is no longer trading" + STATUS_CANCELLED + "The AMM has been stopped by the network and is no longer trading" + STATUS_STOPPED + "AMM will only trade such that it will reduce its position" + STATUS_REDUCE_ONLY +} + +enum AMMStatusReason { + "Status has no reason specified" + STATUS_REASON_UNSPECIFIED + "The AMM was cancelled by it's owner" + STATUS_REASON_CANCELLED_BY_PARTY + "The party does not have enough funds in their general account to meet the AMM's commitment" + STATUS_REASON_CANNOT_FILL_COMMITMENT + "The party already has an AMM operating on this market and cannot create another one" + STATUS_REASON_PARTY_ALREADY_OWNS_AMM_FOR_MARKET + "The AMM was liquidated and stopped by the network" + STATUS_REASON_PARTY_CLOSED_OUT + "The AMM was stopped by the network because the market it operated in was closed" + STATUS_REASON_MARKET_CLOSED + "Commitment amount was below the network wide minimum, or its price bounds are too wide that the volume is spread thinly creating zero-volume price-levels" + STATUS_REASON_COMMITMENT_TOO_LOW + "The AMM was unable to rebase its fair-price such that it does not cross with existing orders" + STATUS_REASON_CANNOT_REBASE +} diff --git a/datanode/gateway/graphql/spot_resolver.go b/datanode/gateway/graphql/spot_resolver.go index 33f033fea8b..1acdece7415 100644 --- a/datanode/gateway/graphql/spot_resolver.go +++ b/datanode/gateway/graphql/spot_resolver.go @@ -51,6 +51,10 @@ func (r updateSpotMarketResolver) UpdateSpotMarketConfiguration(ctx context.Cont type updateSpotMarketConfigurationResolver VegaResolverRoot +func (r *updateSpotMarketConfigurationResolver) EnableTxReordering(ctx context.Context, obj *types.UpdateSpotMarketConfiguration) (bool, error) { + return obj.EnableTransactionReordering, nil +} + // Instrument implements UpdateSpotMarketConfigurationResolver. func (r *updateSpotMarketConfigurationResolver) Instrument(ctx context.Context, obj *types.UpdateSpotMarketConfiguration) (*UpdateSpotInstrumentConfiguration, error) { return &UpdateSpotInstrumentConfiguration{ @@ -87,6 +91,10 @@ func (r updateSpotMarketConfigurationResolver) LiquiditySLAParams(ctx context.Co type newSpotMarketResolver VegaResolverRoot +func (r *newSpotMarketResolver) EnableTxReordering(ctx context.Context, obj *types.NewSpotMarket) (bool, error) { + return obj.Changes.EnableTransactionReordering, nil +} + func (r *newSpotMarketResolver) TickSize(_ context.Context, obj *types.NewSpotMarket) (string, error) { return obj.Changes.TickSize, nil } diff --git a/datanode/gateway/graphql/update_market_configuration_resolver.go b/datanode/gateway/graphql/update_market_configuration_resolver.go index f0af3d430ac..fd69437b6be 100644 --- a/datanode/gateway/graphql/update_market_configuration_resolver.go +++ b/datanode/gateway/graphql/update_market_configuration_resolver.go @@ -25,6 +25,10 @@ import ( type updateMarketConfigurationResolver VegaResolverRoot +func (r *updateMarketConfigurationResolver) EnableTxReordering(ctx context.Context, obj *vega.UpdateMarketConfiguration) (bool, error) { + return obj.EnableTransactionReordering, nil +} + func (r *updateMarketConfigurationResolver) Instrument(ctx context.Context, obj *vega.UpdateMarketConfiguration, ) (*UpdateInstrumentConfiguration, error) { diff --git a/datanode/networkhistory/service_test.go b/datanode/networkhistory/service_test.go index 66ce17cad31..348d3f97b2b 100644 --- a/datanode/networkhistory/service_test.go +++ b/datanode/networkhistory/service_test.go @@ -144,13 +144,13 @@ func TestMain(t *testing.M) { } }() - exitCode := databasetest.TestMain(t, func(config sqlstore.Config, source *sqlstore.ConnectionSource, + exitCode := databasetest.TestMain(t, outerCtx, func(config sqlstore.Config, source *sqlstore.ConnectionSource, pgLog *bytes.Buffer, ) { sqlConfig = config log.Infof("DB Connection String: ", sqlConfig.ConnectionConfig.GetConnectionString()) - pool, err := sqlstore.CreateConnectionPool(sqlConfig.ConnectionConfig) + pool, err := sqlstore.CreateConnectionPool(outerCtx, sqlConfig.ConnectionConfig) if err != nil { panic(fmt.Errorf("failed to create connection pool: %w", err)) } @@ -203,7 +203,7 @@ func TestMain(t *testing.M) { return nil }) - preUpgradeBroker, err := setupSQLBroker(ctx, sqlConfig, snapshotService, + preUpgradeBroker, err := setupSQLBroker(outerCtx, sqlConfig, snapshotService, func(ctx context.Context, service *snapshot.Service, chainId string, lastCommittedBlockHeight int64, snapshotTaken bool) { if lastCommittedBlockHeight > 0 && lastCommittedBlockHeight%snapshotInterval == 0 { lastSnapshot, err := service.CreateSnapshotAsynchronously(ctx, chainId, lastCommittedBlockHeight) @@ -260,7 +260,7 @@ func TestMain(t *testing.M) { return nil }) - postUpgradeBroker, err := setupSQLBroker(ctx, sqlConfig, snapshotService, + postUpgradeBroker, err := setupSQLBroker(outerCtx, sqlConfig, snapshotService, func(ctx context.Context, service *snapshot.Service, chainId string, lastCommittedBlockHeight int64, snapshotTaken bool) { if lastCommittedBlockHeight > 0 && lastCommittedBlockHeight%snapshotInterval == 0 { lastSnapshot, err := service.CreateSnapshotAsynchronously(ctx, chainId, lastCommittedBlockHeight) @@ -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, "QmQqE56RWuyHEWm1rqcFNcEvCWiBpgMsSs1CAwABGfkSSh", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmNn42pXmiaxpDgLAAr2H1WTdz9YWYfyWgDBWajPb6m6Qd", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmcwwiZP3stVahfyLU4f6NjL3Spyn67JXV4RsPt2ieWL5i", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmP8LoArcevGNGoyMnfcLS82gErPfHHAukYJyax3hfvFd9", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "QmRJbm1dMajfEEMAzumsybuZ7hq6QcZJddT5QcNmGsFZir", snapshots) - panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmQusPSJ5wq5gLjjCutX3hzUZ4yyY4uysyvqtq4K5disQE", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[1000].HistorySegmentID, "QmVUyCPo1ugJPNbXC5jkDyeUWakrCd2Z55CnSjjT5P8wV2", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2000].HistorySegmentID, "QmaDbBgBde1LQUTonyRt5tNTZ8SZbSG5F4qcvu6Qzj4U3s", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[2500].HistorySegmentID, "QmX9KkisQMgcfYRcVVvQZiFFXXZn4p3gm4hjGerhhUs5dZ", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[3000].HistorySegmentID, "QmZ3rcAiVdzMv63o3iQSP4VgHLXkcpV8DnAjGpAChmddkJ", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[4000].HistorySegmentID, "QmSsFiETeLjhQ4SfwePgu88JxFYejZ5AiNRjJnafY4uvob", snapshots) + panicIfHistorySegmentIdsNotEqual(goldenSourceHistorySegment[5000].HistorySegmentID, "QmXCDj1KMkzx1KTuaDYE1fGGGq8sdac1Vztaz6Xopb5kZt", snapshots) }, postgresRuntimePath, sqlFs) if exitCode != 0 { @@ -862,7 +862,7 @@ func TestRestoreFromPartialHistoryAndProcessEvents(t *testing.T) { assert.Equal(t, int64(2001), loaded.LoadedFromHeight) assert.Equal(t, int64(3000), loaded.LoadedToHeight) - connSource, err := sqlstore.NewTransactionalConnectionSource(logging.NewTestLogger(), sqlConfig.ConnectionConfig) + connSource, err := sqlstore.NewTransactionalConnectionSource(ctx, logging.NewTestLogger(), sqlConfig.ConnectionConfig) require.NoError(t, err) defer connSource.Close() @@ -951,7 +951,7 @@ func TestRestoreFromFullHistorySnapshotAndProcessEvents(t *testing.T) { assert.Equal(t, int64(1), loaded.LoadedFromHeight) assert.Equal(t, int64(2000), loaded.LoadedToHeight) - connSource, err := sqlstore.NewTransactionalConnectionSource(logging.NewTestLogger(), sqlConfig.ConnectionConfig) + connSource, err := sqlstore.NewTransactionalConnectionSource(ctx, logging.NewTestLogger(), sqlConfig.ConnectionConfig) require.NoError(t, err) defer connSource.Close() @@ -1054,7 +1054,7 @@ func TestRestoreFromFullHistorySnapshotWithIndexesAndOrderTriggersAndProcessEven assert.Equal(t, int64(1), loaded.LoadedFromHeight) assert.Equal(t, int64(2000), loaded.LoadedToHeight) - connSource, err := sqlstore.NewTransactionalConnectionSource(logging.NewTestLogger(), sqlConfig.ConnectionConfig) + connSource, err := sqlstore.NewTransactionalConnectionSource(ctx, logging.NewTestLogger(), sqlConfig.ConnectionConfig) require.NoError(t, err) defer connSource.Close() @@ -1310,7 +1310,7 @@ func setupSQLBroker(ctx context.Context, testDbConfig sqlstore.Config, snapshotS onBlockCommitted func(ctx context.Context, service *snapshot.Service, chainId string, lastCommittedBlockHeight int64, snapshotTaken bool), evtSource eventSource, protocolUpdateHandler ProtocolUpgradeHandler, ) (sqlStoreBroker, error) { - transactionalConnectionSource, err := sqlstore.NewTransactionalConnectionSource(logging.NewTestLogger(), testDbConfig.ConnectionConfig) + transactionalConnectionSource, err := sqlstore.NewTransactionalConnectionSource(ctx, logging.NewTestLogger(), testDbConfig.ConnectionConfig) if err != nil { return nil, err } @@ -1321,9 +1321,10 @@ func setupSQLBroker(ctx context.Context, testDbConfig sqlstore.Config, snapshotS }() candlesV2Config := candlesv2.NewDefaultConfig() + cfg := service.NewDefaultConfig() subscribers := start.SQLSubscribers{} subscribers.CreateAllStores(ctx, logging.NewTestLogger(), transactionalConnectionSource, candlesV2Config.CandleStore) - err = subscribers.SetupServices(ctx, logging.NewTestLogger(), candlesV2Config) + err = subscribers.SetupServices(ctx, logging.NewTestLogger(), cfg, candlesV2Config) if err != nil { return nil, err } diff --git a/datanode/service/accounts.go b/datanode/service/accounts.go index 04a7d861e23..773d212b226 100644 --- a/datanode/service/accounts.go +++ b/datanode/service/accounts.go @@ -25,7 +25,8 @@ import ( ) type AccountStore interface { - GetByID(ctx context.Context, id entities.AccountID) (entities.Account, error) + // Use get by raw ID to avoid using the AccountID type because mockgen does not support it + GetByRawID(ctx context.Context, id string) (entities.Account, error) GetAll(ctx context.Context) ([]entities.Account, error) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]entities.Account, error) Obtain(ctx context.Context, a *entities.Account) error @@ -55,7 +56,7 @@ func NewAccount(aStore AccountStore, bStore BalanceStore, log *logging.Logger) * } func (a *Account) GetByID(ctx context.Context, id entities.AccountID) (entities.Account, error) { - return a.aStore.GetByID(ctx, id) + return a.aStore.GetByRawID(ctx, id.String()) } func (a *Account) GetAll(ctx context.Context) ([]entities.Account, error) { @@ -95,18 +96,24 @@ func (a *Account) Flush(ctx context.Context) error { return nil } +func (a *Account) Unsubscribe(ctx context.Context, ref uint64) error { + return a.bObserver.Unsubscribe(ctx, ref) +} + func (a *Account) QueryAggregatedBalances(ctx context.Context, filter entities.AccountFilter, dateRange entities.DateRange, pagination entities.CursorPagination) (*[]entities.AggregatedBalance, entities.PageInfo, error) { return a.bStore.Query(ctx, filter, dateRange, pagination) } func (a *Account) ObserveAccountBalances(ctx context.Context, retries int, marketID string, - partyID string, asset string, ty vega.AccountType, + asset string, ty vega.AccountType, partyIDs map[string]string, ) (accountCh <-chan []entities.AccountBalance, ref uint64) { ch, ref := a.bObserver.Observe(ctx, retries, func(ab entities.AccountBalance) bool { + _, partyOK := partyIDs[ab.PartyID.String()] + return (len(marketID) == 0 || marketID == ab.MarketID.String()) && - (len(partyID) == 0 || partyID == ab.PartyID.String()) && + (partyOK) && (len(asset) == 0 || asset == ab.AssetID.String()) && (ty == vega.AccountType_ACCOUNT_TYPE_UNSPECIFIED || ty == ab.Type) }) diff --git a/datanode/service/accounts_test.go b/datanode/service/accounts_test.go new file mode 100644 index 00000000000..1c29eedaa31 --- /dev/null +++ b/datanode/service/accounts_test.go @@ -0,0 +1,135 @@ +// 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 service_test + +import ( + "context" + "sync" + "testing" + "time" + + "code.vegaprotocol.io/vega/datanode/entities" + "code.vegaprotocol.io/vega/datanode/service" + "code.vegaprotocol.io/vega/datanode/service/mocks" + "code.vegaprotocol.io/vega/logging" + "code.vegaprotocol.io/vega/protos/vega" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/require" +) + +func TestObserveAccountBalances(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + + balanceStore := mocks.NewMockBalanceStore(ctrl) + accountStore := mocks.NewMockAccountStore(ctrl) + log := logging.NewTestLogger() + accounts := service.NewAccount(accountStore, balanceStore, log) + + ctx := context.Background() + + partyIDs := map[string]string{ + "party_id": "parent_party_id", + "party_id2": "parent_party_id2", + "party_id3": "parent_party_id3", + } + + balances := []entities.AccountBalance{} + + for partyID := range partyIDs { + balances = append(balances, entities.AccountBalance{ + Account: &entities.Account{ + PartyID: entities.PartyID(partyID), + AssetID: "asset_id", + MarketID: "market_id", + Type: vega.AccountType_ACCOUNT_TYPE_GENERAL, + }, + }) + } + + balances = append(balances, []entities.AccountBalance{ + { + Account: &entities.Account{ + PartyID: "party_id", + AssetID: "asset_id", + MarketID: "market_id2", + Type: vega.AccountType_ACCOUNT_TYPE_GENERAL, + }, + }, + { + Account: &entities.Account{ + PartyID: "party_id10", + AssetID: "asset_id", + MarketID: "market_id", + Type: vega.AccountType_ACCOUNT_TYPE_GENERAL, + }, + }, + { + Account: &entities.Account{ + PartyID: "party_id", + AssetID: "asset_id", + MarketID: "market_id50", + Type: vega.AccountType_ACCOUNT_TYPE_GENERAL, + }, + }, + { + Account: &entities.Account{ + PartyID: "party_id", + AssetID: "asset_id", + MarketID: "market_id", + Type: vega.AccountType_ACCOUNT_TYPE_GLOBAL_REWARD, + }, + }, + }...) + + accountsChan, _ := accounts.ObserveAccountBalances(ctx, 20, "market_id", "asset_id", + vega.AccountType_ACCOUNT_TYPE_GENERAL, partyIDs) + + balanceStore.EXPECT().Flush(ctx).Return(balances, nil).Times(1) + + // first 3 balances should be received + expectedBalances := balances[:3] + + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + + receivedBalances := <-accountsChan + require.Equal(t, len(expectedBalances), len(receivedBalances)) + + for i, expected := range expectedBalances { + require.Equal(t, expected.PartyID, receivedBalances[i].PartyID) + require.Equal(t, expected.MarketID, receivedBalances[i].MarketID) + require.Equal(t, expected.AssetID, receivedBalances[i].AssetID) + } + }() + + time.Sleep(500 * time.Millisecond) + // by calling Flush we can mimic sending the balances to the channel and receiving them in Observe method + require.NoError(t, accounts.Flush(ctx)) + wg.Wait() + + var remainingBalances []entities.AccountBalance + select { + case balances := <-accountsChan: + remainingBalances = balances + default: + } + + require.Len(t, remainingBalances, 0) +} diff --git a/datanode/service/amm_service.go b/datanode/service/amm_service.go new file mode 100644 index 00000000000..6616dd61c41 --- /dev/null +++ b/datanode/service/amm_service.go @@ -0,0 +1,43 @@ +// 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 service + +import ( + "context" + + "code.vegaprotocol.io/vega/datanode/entities" + "code.vegaprotocol.io/vega/datanode/sqlstore" +) + +type AMMPools struct { + *sqlstore.AMMPools +} + +func (a *AMMPools) ListByMarket(ctx context.Context, marketID string, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + return a.AMMPools.ListByMarket(ctx, entities.MarketID(marketID), pagination) +} + +func (a *AMMPools) ListByParty(ctx context.Context, partyID string, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + return a.AMMPools.ListByParty(ctx, entities.PartyID(partyID), pagination) +} + +func (a *AMMPools) ListByPool(ctx context.Context, poolID string, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + return a.AMMPools.ListByPool(ctx, entities.AMMPoolID(poolID), pagination) +} + +func (a *AMMPools) ListBySubAccount(ctx context.Context, ammPartyID string, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + return a.AMMPools.ListBySubAccount(ctx, entities.PartyID(ammPartyID), pagination) +} diff --git a/datanode/service/config.go b/datanode/service/config.go index 757c1e608bc..54e1cb05ac2 100644 --- a/datanode/service/config.go +++ b/datanode/service/config.go @@ -20,9 +20,16 @@ import ( "code.vegaprotocol.io/vega/logging" ) -// Config represent the configuration of the candle package. +type MarketDepthConfig struct { + AmmFullExpansionPercentage float64 `description:"The percentage eitherside of the mid price at which to display acccurate AMM volume" long:"amm-full-expansion-percentage"` + AmmEstimatedStepPercentage float64 `description:"The size of the step as a percentage of the mid price at which we aggregate AMM volume" long:"amm-estimated-step-percentage"` + AmmMaxEstimatedSteps uint64 `description:"The number of estimate steps to take outside the accurate region" long:"amm-max-estimated-steps"` +} + +// Config represent the configuration of the service package. type Config struct { - Level encoding.LogLevel `long:"log-level"` + Level encoding.LogLevel `long:"log-level"` + MarketDepth MarketDepthConfig } // NewDefaultConfig creates an instance of the package specific configuration, given a @@ -30,5 +37,10 @@ type Config struct { func NewDefaultConfig() Config { return Config{ Level: encoding.LogLevel{Level: logging.InfoLevel}, + MarketDepth: MarketDepthConfig{ + AmmFullExpansionPercentage: 0.03, + AmmEstimatedStepPercentage: 2.5, + AmmMaxEstimatedSteps: 3, + }, } } diff --git a/datanode/service/game_scores.go b/datanode/service/game_scores.go new file mode 100644 index 00000000000..6450d8d8658 --- /dev/null +++ b/datanode/service/game_scores.go @@ -0,0 +1,76 @@ +// 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 service + +import ( + "context" + + "code.vegaprotocol.io/vega/datanode/entities" + "code.vegaprotocol.io/vega/logging" +) + +type gameScoreStore interface { + ListPartyScores( + ctx context.Context, + gameIDs []entities.GameID, + partyIDs []entities.PartyID, + teamIDs []entities.TeamID, + epochFromID *uint64, + epochToID *uint64, + pagination entities.CursorPagination, + ) ([]entities.GamePartyScore, entities.PageInfo, error) + ListTeamScores( + ctx context.Context, + gameIDs []entities.GameID, + teamIDs []entities.TeamID, + epochFromID *uint64, + epochToID *uint64, + pagination entities.CursorPagination, + ) ([]entities.GameTeamScore, entities.PageInfo, error) +} + +type GameScore struct { + store gameScoreStore +} + +func NewGameScore(store gameScoreStore, log *logging.Logger) *GameScore { + return &GameScore{ + store: store, + } +} + +func (gs *GameScore) ListPartyScores( + ctx context.Context, + gameIDs []entities.GameID, + partyIDs []entities.PartyID, + teamIDs []entities.TeamID, + epochFromID *uint64, + epochToID *uint64, + pagination entities.CursorPagination, +) ([]entities.GamePartyScore, entities.PageInfo, error) { + return gs.store.ListPartyScores(ctx, gameIDs, partyIDs, teamIDs, epochFromID, epochToID, pagination) +} + +func (gs *GameScore) ListTeamScores( + ctx context.Context, + gameIDs []entities.GameID, + teamIDs []entities.TeamID, + epochFromID *uint64, + epochToID *uint64, + pagination entities.CursorPagination, +) ([]entities.GameTeamScore, entities.PageInfo, error) { + return gs.store.ListTeamScores(ctx, gameIDs, teamIDs, epochFromID, epochToID, pagination) +} diff --git a/datanode/service/market.go b/datanode/service/market.go index 16237043162..38946c5c572 100644 --- a/datanode/service/market.go +++ b/datanode/service/market.go @@ -55,8 +55,8 @@ func (m *Markets) Upsert(ctx context.Context, market *entities.Market) error { return err } m.cacheLock.Lock() - if market.State == entities.MarketStateSettled || market.State == entities.MarketStateRejected { - // a settled or rejected market can be safely removed from this map. + if market.State == entities.MarketStateSettled || market.State == entities.MarketStateRejected || market.State == entities.MarketStateCancelled { + // a settled, cancelled, or rejected market can be safely removed from this map. delete(m.sf, market.ID) delete(m.isSpotCache, market.ID) } else { diff --git a/datanode/service/market_depth.go b/datanode/service/market_depth.go index ce9d2db354e..34d53c3c0f0 100644 --- a/datanode/service/market_depth.go +++ b/datanode/service/market_depth.go @@ -32,21 +32,66 @@ type OrderStore interface { GetLiveOrders(ctx context.Context) ([]entities.Order, error) } +type AMMStore interface { + ListActive(ctx context.Context) ([]entities.AMMPool, error) +} + +type Positions interface { + GetByMarketAndParty(ctx context.Context, marketID string, partyID string) (entities.Position, error) +} + +type AssetStore interface { + GetByID(ctx context.Context, id string) (entities.Asset, error) +} + +type ammCache struct { + priceFactor num.Decimal // the price factor for this market + ammOrders map[string][]*types.Order // map amm id -> expanded orders, so we can remove them if amended + activeAMMs map[string]entities.AMMPool // map amm id -> amm definition, so we can refresh its expansion + estimatedOrder map[string]struct{} // order-id -> whether it was an estimated order +} + type MarketDepth struct { + log *logging.Logger + cfg MarketDepthConfig marketDepths map[string]*entities.MarketDepth orderStore OrderStore + ammStore AMMStore + assetStore AssetStore + markets MarketStore + marketData MarketDataStore + positions Positions depthObserver utils.Observer[*types.MarketDepth] updateObserver utils.Observer[*types.MarketDepthUpdate] mu sync.RWMutex sequenceNumber uint64 + + ammCache map[string]*ammCache } -func NewMarketDepth(orderStore OrderStore, logger *logging.Logger) *MarketDepth { +func NewMarketDepth( + cfg MarketDepthConfig, + orderStore OrderStore, + ammStore AMMStore, + marketData MarketDataStore, + positions Positions, + assets AssetStore, + markets MarketStore, + logger *logging.Logger, +) *MarketDepth { return &MarketDepth{ + log: logger, + cfg: cfg, marketDepths: map[string]*entities.MarketDepth{}, orderStore: orderStore, + ammStore: ammStore, + marketData: marketData, + positions: positions, + assetStore: assets, + markets: markets, depthObserver: utils.NewObserver[*types.MarketDepth]("market_depth", logger, 100, 100), updateObserver: utils.NewObserver[*types.MarketDepthUpdate]("market_depth_update", logger, 100, 100), + ammCache: map[string]*ammCache{}, } } @@ -65,6 +110,8 @@ func (m *MarketDepth) Initialise(ctx context.Context) error { m.AddOrder(order, liveOrder.VegaTime, liveOrder.SeqNum) } + m.InitialiseAMMs(ctx) + return nil } @@ -118,6 +165,21 @@ func (m *MarketDepth) publishChanges() { } } +func (m *MarketDepth) sequential(t time.Time, sequenceNumber uint64) bool { + // we truncate the vegaTime by microsecond because Postgres only supports microsecond + // granularity for time. In order to be able to reproduce the same sequence numbers regardless + // the source, we have to truncate the time to microsecond granularity + n := uint64(t.Truncate(time.Microsecond).UnixNano()) + sequenceNumber + + if m.sequenceNumber > n { + // This update is older than the current MarketDepth + return false + } + + m.sequenceNumber = n + return true +} + func (m *MarketDepth) AddOrder(order *types.Order, vegaTime time.Time, sequenceNumber uint64) { m.mu.Lock() defer m.mu.Unlock() @@ -134,34 +196,36 @@ func (m *MarketDepth) AddOrder(order *types.Order, vegaTime time.Time, sequenceN return } - // we truncate the vegaTime by microsecond because Postgres only supports microsecond - // granularity for time. In order to be able to reproduce the same sequence numbers regardless - // the source, we have to truncate the time to microsecond granularity - seqNum := uint64(vegaTime.Truncate(time.Microsecond).UnixNano()) + sequenceNumber + if !m.sequential(vegaTime, sequenceNumber) { + return + } - if m.sequenceNumber > seqNum { - // This update is older than the current MarketDepth + if m.isAMMOrder(order) { + // this AMM order has come through the orders stream, it can only mean that it has traded so we need to refresh its depth + m.onAMMTraded(order.Party, order.MarketID) return } - m.sequenceNumber = seqNum + md := m.getDepth(order.MarketID) + md.AddOrderUpdate(order, false) + md.SequenceNumber = m.sequenceNumber +} +func (m *MarketDepth) getDepth(marketID string) *entities.MarketDepth { // See if we already have a MarketDepth item for this market - md := m.marketDepths[order.MarketID] - if md == nil { - // First time we have an update for this market - // so we need to create a new MarketDepth - md = &entities.MarketDepth{ - MarketID: order.MarketID, - LiveOrders: map[string]*types.Order{}, - } - md.SequenceNumber = m.sequenceNumber - m.marketDepths[order.MarketID] = md + if md := m.marketDepths[marketID]; md != nil { + return md } - md.AddOrderUpdate(order) - + // First time we have an update for this market + // so we need to create a new MarketDepth + md := &entities.MarketDepth{ + MarketID: marketID, + LiveOrders: map[string]*types.Order{}, + } md.SequenceNumber = m.sequenceNumber + m.marketDepths[marketID] = md + return md } // GetMarketDepth builds up the structure to be sent out to any market depth listeners. @@ -250,7 +314,7 @@ func (m *MarketDepth) GetVolumeAtPrice(market string, side types.Side, price uin if pl == nil { return 0 } - return pl.TotalVolume + return pl.TotalVolume + pl.TotalAMMVolume } return 0 } @@ -261,17 +325,47 @@ func (m *MarketDepth) GetTotalVolume(market string) int64 { md := m.marketDepths[market] if md != nil { for _, pl := range md.BuySide { - volume += int64(pl.TotalVolume) + volume += int64(pl.TotalVolume) + int64(pl.TotalAMMVolume) + int64(pl.TotalEstimatedAMMVolume) } for _, pl := range md.SellSide { - volume += int64(pl.TotalVolume) + volume += int64(pl.TotalVolume) + int64(pl.TotalAMMVolume) + int64(pl.TotalEstimatedAMMVolume) } return volume } return 0 } +// GetAMMVolume returns the total volume in the order book. +func (m *MarketDepth) GetAMMVolume(market string, estimated bool) int64 { + var volume int64 + md := m.marketDepths[market] + if md != nil { + for _, pl := range md.BuySide { + if estimated { + volume += int64(pl.TotalEstimatedAMMVolume) + continue + } + volume += int64(pl.TotalAMMVolume) + } + + for _, pl := range md.SellSide { + if estimated { + volume += int64(pl.TotalEstimatedAMMVolume) + continue + } + volume += int64(pl.TotalAMMVolume) + } + return volume + } + return 0 +} + +// GetAMMVolume returns the total volume in the order book. +func (m *MarketDepth) GetTotalAMMVolume(market string) int64 { + return m.GetAMMVolume(market, true) + m.GetAMMVolume(market, false) +} + // GetOrderCountAtPrice returns the number of orders at the given price level. func (m *MarketDepth) GetOrderCountAtPrice(market string, side types.Side, price uint64) uint64 { md := m.marketDepths[market] diff --git a/datanode/service/market_depth_amm.go b/datanode/service/market_depth_amm.go new file mode 100644 index 00000000000..b0a92b73445 --- /dev/null +++ b/datanode/service/market_depth_amm.go @@ -0,0 +1,545 @@ +// 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 service + +import ( + "context" + "errors" + "time" + + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/datanode/entities" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/logging" +) + +var ( + ErrNoAMMVolumeReference = errors.New("cannot find reference price to estimate AMM volume") + hundred = num.DecimalFromInt64(100) +) + +// a version of entities.AMMPool that is less flat. +type ammDefn struct { + partyID string + lower *curve + upper *curve + position num.Decimal // signed position in Vega-space +} + +type curve struct { + low *num.Uint + high *num.Uint + assetLow *num.Uint + assetHigh *num.Uint + sqrtHigh num.Decimal + sqrtLow num.Decimal + pv num.Decimal + l num.Decimal + isLower bool +} + +type level struct { + price *num.Uint + assetPrice *num.Uint + assetSqrt num.Decimal + estimated bool +} + +func newLevel(price *num.Uint, estimated bool, priceFactor num.Decimal) *level { + assetPrice, _ := num.UintFromDecimal(price.ToDecimal().Mul(priceFactor)) + return &level{ + price: price.Clone(), + assetPrice: assetPrice, + assetSqrt: num.UintZero().Sqrt(assetPrice), + estimated: estimated, + } +} + +func (cu *curve) impliedPosition(sqrtPrice, sqrtHigh num.Decimal) num.Decimal { + // L * (sqrt(high) - sqrt(price)) + numer := sqrtHigh.Sub(sqrtPrice).Mul(cu.l) + + // sqrt(high) * sqrt(price) + denom := sqrtHigh.Mul(sqrtPrice) + + // L * (sqrt(high) - sqrt(price)) / sqrt(high) * sqrt(price) + res := numer.Div(denom) + + if cu.isLower { + return res + } + + // if we are in the upper curve the position of 0 in "curve-space" is -cu.pv in Vega position + // so we need to flip the interval + return cu.pv.Sub(res).Neg() +} + +func (m *MarketDepth) getActiveAMMs(ctx context.Context) map[string][]entities.AMMPool { + ammByMarket := map[string][]entities.AMMPool{} + amms, err := m.ammStore.ListActive(ctx) + if err != nil { + m.log.Warn("unable to query AMM's for market-depth", + logging.Error(err), + ) + } + + for _, amm := range amms { + marketID := string(amm.MarketID) + if _, ok := ammByMarket[marketID]; !ok { + ammByMarket[marketID] = []entities.AMMPool{} + } + + ammByMarket[marketID] = append(ammByMarket[marketID], amm) + } + return ammByMarket +} + +func (m *MarketDepth) getCalculationBounds(reference num.Decimal, priceFactor num.Decimal) []*level { + // first lets calculate the region we will expand accurately, this will be some percentage either side of the reference price + factor := num.DecimalFromFloat(m.cfg.AmmFullExpansionPercentage).Div(hundred) + + // if someone has set the expansion to be more than 100% lets make sure it doesn't overflow + factor = num.MinD(factor, num.DecimalOne()) + + referenceU, _ := num.UintFromDecimal(reference) + accHigh, _ := num.UintFromDecimal(reference.Mul(num.DecimalOne().Add(factor))) + accLow, _ := num.UintFromDecimal(reference.Mul(num.DecimalOne().Sub(factor))) + + // always want some volume so if for some reason the bounds were set too low so we calculated a sub-tick expansion make it at least one + if accHigh.EQ(referenceU) { + accHigh.Add(referenceU, num.UintOne()) + accLow.Sub(referenceU, num.UintOne()) + } + + // this is the percentage of the reference price to take in estimated steps + stepFactor := num.DecimalFromFloat(m.cfg.AmmEstimatedStepPercentage).Div(hundred) + + // this is how many of those steps to take + maxEstimatedSteps := m.cfg.AmmMaxEstimatedSteps + + // and so this is the size of the estimated step + eStep, _ := num.UintFromDecimal(reference.Mul(stepFactor)) + + eRange := num.UintZero().Mul(eStep, num.NewUint(maxEstimatedSteps)) + estLow := num.UintZero().Sub(accLow, num.Min(accLow, eRange)) + estHigh := num.UintZero().Add(accHigh, eRange) + + levels := []*level{} + + // we now have our four prices [estLow, accLow, accHigh, estHigh] where from + // estLow -> accLow : we will take big price steps + // accLow -> accHigh : we will take price steps of one-tick + // accHigh -> estHigh : we will take big price steps + price := estLow.Clone() + + // larger steps from estLow -> accHigh + for price.LT(accLow) { + levels = append(levels, newLevel(price, true, priceFactor)) + price = num.UintZero().Add(price, eStep) + } + + // now smaller steps from accLow -> accHigh + for price.LTE(accHigh) { + levels = append(levels, newLevel(price, false, priceFactor)) + price = num.UintZero().Add(price, num.UintOne()) + } + + // now back to large steps for accHigh -> estHigh + for price.LTE(estHigh) { + levels = append(levels, newLevel(price, true, priceFactor)) + price = num.UintZero().Add(price, eStep) + } + + return levels +} + +func (m *MarketDepth) getReference(ctx context.Context, marketID string) (num.Decimal, error) { + marketData, err := m.marketData.GetMarketDataByID(ctx, marketID) + if err != nil { + m.log.Warn("unable to get market-data for market", + logging.String("market-id", marketID), + logging.Error(err), + ) + return num.DecimalZero(), err + } + + reference := marketData.MidPrice + if !marketData.IndicativePrice.IsZero() { + reference = marketData.IndicativePrice + } + + if reference.IsZero() { + m.log.Warn("cannot calculate market-depth for AMM, no reference point available", + logging.String("mid-price", marketData.MidPrice.String()), + logging.String("indicative-price", marketData.IndicativePrice.String()), + ) + return num.DecimalZero(), ErrNoAMMVolumeReference + } + + return reference, nil +} + +func (m *MarketDepth) expandByLevels(pool entities.AMMPool, levels []*level, priceFactor num.Decimal) ([]*types.Order, []bool, error) { + // get positions + + pos, err := m.getAMMPosition(pool.MarketID.String(), pool.AmmPartyID.String()) + if err != nil { + return nil, nil, err + } + + ammDefn := definitionFromEntity(pool, pos, priceFactor) + + estimated := []bool{} + orders := []*types.Order{} + for i := range levels { + if i == len(levels)-1 { + break + } + + level1 := levels[i] + level2 := levels[i+1] + + // check if the interval is fully outside of the AMM range + if ammDefn.lower.low.GTE(level2.price) { + continue + } + if ammDefn.upper.high.LTE(level1.price) { + break + } + + // snap to AMM boundaries + if level1.price.LT(ammDefn.lower.low) { + level1 = &level{ + price: ammDefn.lower.low, + assetPrice: ammDefn.lower.assetLow, + assetSqrt: ammDefn.lower.sqrtLow, + estimated: level1.estimated, + } + } + + if level2.price.GT(ammDefn.upper.high) { + level2 = &level{ + price: ammDefn.upper.high, + assetPrice: ammDefn.upper.assetHigh, + assetSqrt: ammDefn.upper.sqrtHigh, + estimated: level2.estimated, + } + } + + // pick curve which curve we are in + cu := ammDefn.lower + if level1.price.GTE(ammDefn.lower.high) { + cu = ammDefn.upper + } + + // let calculate the volume between these two + v1 := cu.impliedPosition(level1.assetSqrt, cu.sqrtHigh) + v2 := cu.impliedPosition(level2.assetSqrt, cu.sqrtHigh) + + retPrice := level1.price + side := types.SideBuy + + if v2.LessThan(ammDefn.position) { + side = types.SideSell + retPrice = level2.price + + // if we've stepped over the pool's position we need to split the step + if v1.GreaterThan(ammDefn.position) { + volume := v1.Sub(ammDefn.position).Abs().IntPart() + o := m.makeOrder(level1.price, ammDefn.partyID, uint64(volume), types.SideBuy) + orders = append(orders, o) + estimated = append(estimated, level1.estimated) + + // now set v1 ready for the second half of this split + v1 = ammDefn.position + } + } + + // calculate the volume + volume := v1.Sub(v2).Abs().IntPart() + + orders = append( + orders, + m.makeOrder(retPrice, ammDefn.partyID, uint64(volume), side), + ) + estimated = append(estimated, level1.estimated || level2.estimated) + } + return orders, estimated, nil +} + +func (m *MarketDepth) InitialiseAMMs(ctx context.Context) { + active := m.getActiveAMMs(ctx) + if len(active) == 0 { + return + } + + // expand all these AMM's from the midpoint + for marketID, amms := range active { + md := m.getDepth(marketID) + + cache, err := m.getAMMCache(marketID) + if err != nil { + m.log.Panic("unable to expand AMM's for market", + logging.Error(err), + logging.String("market-id", marketID), + ) + } + + priceFactor := cache.priceFactor + + // add it to our active list, we want to do this even if we fail to get a reference + for _, a := range amms { + cache.activeAMMs[a.AmmPartyID.String()] = a + } + + reference, err := m.getReference(ctx, marketID) + if err != nil { + continue + } + + levels := m.getCalculationBounds(reference, priceFactor) + + for _, amm := range amms { + orders, estimated, err := m.expandByLevels(amm, levels, priceFactor) + if err != nil { + continue + } + + if len(orders) == 0 { + continue + } + + // save them in the cache + cache.ammOrders[amm.AmmPartyID.String()] = orders + + for i := range orders { + md.AddAMMOrder(orders[i], estimated[i]) + if estimated[i] { + cache.estimatedOrder[orders[i].ID] = struct{}{} + } + } + } + } +} + +func (m *MarketDepth) ExpandAMM(ctx context.Context, pool entities.AMMPool, priceFactor num.Decimal) ([]*types.Order, []bool, error) { + reference, err := m.getReference(ctx, pool.MarketID.String()) + if err == ErrNoAMMVolumeReference { + // if we can't get a reference to expand from then the market must be fresh and we will just use the pool's base + reference = pool.ParametersBase + } else if err != nil { + return nil, nil, err + } + + levels := m.getCalculationBounds(reference, priceFactor) + + return m.expandByLevels(pool, levels, priceFactor) +} + +func (m *MarketDepth) makeOrder(price *num.Uint, partyID string, volume uint64, side types.Side) *types.Order { + return &types.Order{ + ID: vgcrypto.RandomHash(), + Party: partyID, + Price: price, + Status: entities.OrderStatusActive, + Type: entities.OrderTypeLimit, + TimeInForce: entities.OrderTimeInForceGTC, + Size: volume, + Remaining: volume, + GeneratedOffbook: true, + Side: side, + } +} + +// refreshAMM is used when an AMM has either traded or its definition has changed. +func (m *MarketDepth) refreshAMM(pool entities.AMMPool, depth *entities.MarketDepth) { + marketID := pool.MarketID.String() + ammParty := pool.AmmPartyID.String() + + // get all the AMM details from the cache + cache, err := m.getAMMCache(marketID) + if err != nil { + m.log.Warn("unable to refresh AMM expansion", + logging.Error(err), + logging.String("market-id", marketID), + ) + } + + // remove any expanded orders the AMM already has in the depth + existing := cache.ammOrders[ammParty] + for _, o := range existing { + o.Status = entities.OrderStatusCancelled + + _, estimated := cache.estimatedOrder[o.ID] + delete(cache.estimatedOrder, o.ID) + + depth.AddOrderUpdate(o, estimated) + } + + if pool.Status == entities.AMMStatusCancelled || pool.Status == entities.AMMStatusStopped { + delete(cache.activeAMMs, ammParty) + delete(cache.ammOrders, ammParty) + return + } + + // expand it again into new orders and push them into the market depth + orders, estimated, _ := m.ExpandAMM(context.Background(), pool, cache.priceFactor) + for i := range orders { + depth.AddOrderUpdate(orders[i], estimated[i]) + if estimated[i] { + cache.estimatedOrder[orders[i].ID] = struct{}{} + } + } + + cache.ammOrders[ammParty] = orders + cache.activeAMMs[ammParty] = pool +} + +// refreshAMM is used when an AMM has either traded or its definition has changed. +func (m *MarketDepth) OnAMMUpdate(pool entities.AMMPool, vegaTime time.Time, seqNum uint64) { + m.mu.Lock() + defer m.mu.Unlock() + + if !m.sequential(vegaTime, seqNum) { + return + } + + depth := m.getDepth(pool.MarketID.String()) + depth.SequenceNumber = m.sequenceNumber + + m.refreshAMM(pool, depth) +} + +func (m *MarketDepth) onAMMTraded(ammParty, marketID string) { + cache, err := m.getAMMCache(marketID) + if err != nil { + m.log.Warn("unable to refresh AMM expansion", + logging.Error(err), + logging.String("market-id", marketID), + ) + } + + pool, ok := cache.activeAMMs[ammParty] + if !ok { + m.log.Panic("market-depth out of sync -- received trade event for AMM that doesn't exist") + } + + depth := m.getDepth(pool.MarketID.String()) + depth.SequenceNumber = m.sequenceNumber + m.refreshAMM(pool, depth) +} + +func (m *MarketDepth) isAMMOrder(order *types.Order) bool { + c, ok := m.ammCache[order.MarketID] + if !ok { + return false + } + + _, ok = c.activeAMMs[order.Party] + return ok +} + +func (m *MarketDepth) getAMMCache(marketID string) (*ammCache, error) { + if cache, ok := m.ammCache[marketID]; ok { + return cache, nil + } + + // first time we've seen this market lets get the price factor + market, err := m.markets.GetByID(context.Background(), marketID) + if err != nil { + return nil, err + } + + assetID, err := market.ToProto().GetAsset() + if err != nil { + return nil, err + } + + asset, err := m.assetStore.GetByID(context.Background(), assetID) + if err != nil { + return nil, err + } + + priceFactor := num.DecimalOne() + if exp := asset.Decimals - market.DecimalPlaces; exp != 0 { + priceFactor = num.DecimalFromInt64(10).Pow(num.DecimalFromInt64(int64(exp))) + } + + cache := &ammCache{ + priceFactor: priceFactor, + ammOrders: map[string][]*types.Order{}, + activeAMMs: map[string]entities.AMMPool{}, + estimatedOrder: map[string]struct{}{}, + } + m.ammCache[marketID] = cache + + return cache, nil +} + +func (m *MarketDepth) getAMMPosition(marketID, partyID string) (int64, error) { + p, err := m.positions.GetByMarketAndParty(context.Background(), marketID, partyID) + if err == nil { + return p.OpenVolume, nil + } + + if err == entities.ErrNotFound { + return 0, nil + } + + return 0, err +} + +func definitionFromEntity(ent entities.AMMPool, position int64, priceFactor num.Decimal) *ammDefn { + base, _ := num.UintFromDecimal(ent.ParametersBase) + low := base.Clone() + high := base.Clone() + + if ent.ParametersLowerBound != nil { + low, _ = num.UintFromDecimal(*ent.ParametersLowerBound) + } + + if ent.ParametersUpperBound != nil { + high, _ = num.UintFromDecimal(*ent.ParametersUpperBound) + } + + assetHigh, _ := num.UintFromDecimal(high.ToDecimal().Mul(priceFactor)) + assetBase, _ := num.UintFromDecimal(base.ToDecimal().Mul(priceFactor)) + assetlow, _ := num.UintFromDecimal(low.ToDecimal().Mul(priceFactor)) + + return &ammDefn{ + position: num.DecimalFromInt64(position), + lower: &curve{ + low: low, + high: base, + assetLow: assetlow, + assetHigh: assetBase, + sqrtHigh: num.UintOne().Sqrt(assetBase), + isLower: true, + l: ent.LowerVirtualLiquidity, + pv: ent.LowerTheoreticalPosition, + }, + upper: &curve{ + low: base, + high: high, + assetLow: assetBase, + assetHigh: assetHigh, + sqrtHigh: num.UintOne().Sqrt(assetHigh), + l: ent.UpperVirtualLiquidity, + pv: ent.UpperTheoreticalPosition, + }, + } +} diff --git a/datanode/service/market_depth_amm_test.go b/datanode/service/market_depth_amm_test.go new file mode 100644 index 00000000000..bbf96e8b611 --- /dev/null +++ b/datanode/service/market_depth_amm_test.go @@ -0,0 +1,331 @@ +// 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 service_test + +import ( + "context" + "testing" + "time" + + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/datanode/entities" + "code.vegaprotocol.io/vega/datanode/service" + "code.vegaprotocol.io/vega/datanode/service/mocks" + vgcrypto "code.vegaprotocol.io/vega/libs/crypto" + "code.vegaprotocol.io/vega/libs/num" + "code.vegaprotocol.io/vega/libs/ptr" + "code.vegaprotocol.io/vega/logging" + "code.vegaprotocol.io/vega/protos/vega" + + "github.com/golang/mock/gomock" + "github.com/shopspring/decimal" + "github.com/stretchr/testify/assert" +) + +func getService(t *testing.T) *MDS { + t.Helper() + cfg := service.MarketDepthConfig{ + AmmFullExpansionPercentage: 1, + AmmMaxEstimatedSteps: 5, + AmmEstimatedStepPercentage: 0.2, + } + return getServiceWithConfig(t, cfg) +} + +func getServiceWithConfig(t *testing.T, cfg service.MarketDepthConfig) *MDS { + t.Helper() + ctrl := gomock.NewController(t) + pos := mocks.NewMockPositionStore(ctrl) + orders := mocks.NewMockOrderStore(ctrl) + marketData := mocks.NewMockMarketDataStore(ctrl) + amm := mocks.NewMockAMMStore(ctrl) + markets := mocks.NewMockMarketStore(ctrl) + assets := mocks.NewMockAssetStore(ctrl) + + return &MDS{ + service: service.NewMarketDepth(cfg, orders, amm, marketData, pos, assets, markets, logging.NewTestLogger()), + ctrl: ctrl, + pos: pos, + amm: amm, + orders: orders, + marketData: marketData, + markets: markets, + assets: assets, + } +} + +func TestAMMMarketDepth(t *testing.T) { + ctx := context.Background() + mds := getService(t) + defer mds.ctrl.Finish() + + marketID := vgcrypto.RandomHash() + + ensureLiveOrders(t, mds, marketID) + ensureDecimalPlaces(t, mds) + mds.pos.EXPECT().GetByMarketAndParty(gomock.Any(), gomock.Any(), gomock.Any()).Return(entities.Position{OpenVolume: 0}, nil) + mds.marketData.EXPECT().GetMarketDataByID(gomock.Any(), gomock.Any()).Times(1).Return(entities.MarketData{MidPrice: num.DecimalFromInt64(2000)}, nil) + + // data node is starting from network history, initialise market-depth based on whats aleady there + pool := ensureAMMs(t, mds, marketID) + mds.service.Initialise(ctx) + + assert.Equal(t, 240, int(mds.service.GetTotalAMMVolume(marketID))) + assert.Equal(t, 120, int(mds.service.GetAMMVolume(marketID, true))) + assert.Equal(t, 120, int(mds.service.GetAMMVolume(marketID, false))) + assert.Equal(t, 260, int(mds.service.GetTotalVolume(marketID))) + + assert.Equal(t, "1999", mds.service.GetBestBidPrice(marketID).String()) + assert.Equal(t, "2001", mds.service.GetBestAskPrice(marketID).String()) + + // now pretend that something traded with the AMM and its position is now 10 long + mds.pos.EXPECT().GetByMarketAndParty(gomock.Any(), gomock.Any(), gomock.Any()).Return(entities.Position{OpenVolume: 10}, nil) + mds.marketData.EXPECT().GetMarketDataByID(gomock.Any(), gomock.Any()).Times(1).Return(entities.MarketData{MidPrice: num.DecimalFromInt64(2000)}, nil) + mds.service.AddOrder( + &types.Order{ + ID: vgcrypto.RandomHash(), + Party: pool.AmmPartyID.String(), + MarketID: marketID, + Side: types.SideBuy, + Status: entities.OrderStatusFilled, + }, + time.Date(2022, 3, 8, 16, 15, 39, 901022000, time.UTC), + 37, + ) + + // volume should be the same but the buys and sells should have shifted + assert.Equal(t, 240, int(mds.service.GetTotalAMMVolume(marketID))) + assert.Equal(t, 120, int(mds.service.GetAMMVolume(marketID, true))) + assert.Equal(t, 120, int(mds.service.GetAMMVolume(marketID, false))) + assert.Equal(t, 260, int(mds.service.GetTotalVolume(marketID))) + + assert.Equal(t, "1996", mds.service.GetBestBidPrice(marketID).String()) + assert.Equal(t, "1998", mds.service.GetBestAskPrice(marketID).String()) + + // now the AMM is updated so that its definition has changed, namely that its curve when short is removed + pool.ParametersUpperBound = nil + mds.pos.EXPECT().GetByMarketAndParty(gomock.Any(), gomock.Any(), gomock.Any()).Return(entities.Position{OpenVolume: 10}, nil) + mds.marketData.EXPECT().GetMarketDataByID(gomock.Any(), gomock.Any()).Times(1).Return(entities.MarketData{MidPrice: num.DecimalFromInt64(2000)}, nil) + mds.service.OnAMMUpdate(pool, time.Now(), 999) + + // volume should change + assert.Equal(t, 125, int(mds.service.GetTotalAMMVolume(marketID))) + assert.Equal(t, 65, int(mds.service.GetAMMVolume(marketID, true))) + assert.Equal(t, 60, int(mds.service.GetAMMVolume(marketID, false))) + assert.Equal(t, 145, int(mds.service.GetTotalVolume(marketID))) + assert.Equal(t, "1996", mds.service.GetBestBidPrice(marketID).String()) + assert.Equal(t, "1998", mds.service.GetBestAskPrice(marketID).String()) + + // and there should definitely be no volume at 2001 + assert.Equal(t, 0, int(mds.service.GetVolumeAtPrice(marketID, types.SideSell, 2001))) + + // now the AMM is cancelled, we expect all AMM volume to be removed + pool.Status = entities.AMMStatusCancelled + mds.service.OnAMMUpdate(pool, time.Now(), 1000) + + assert.Equal(t, 0, int(mds.service.GetTotalAMMVolume(marketID))) + assert.Equal(t, 20, int(mds.service.GetTotalVolume(marketID))) +} + +func TestAMMInitialiseNoAMM(t *testing.T) { + ctx := context.Background() + mds := getService(t) + defer mds.ctrl.Finish() + + marketID := vgcrypto.RandomHash() + + ensureLiveOrders(t, mds, marketID) + + // initialise when there are no AMMs + mds.amm.EXPECT().ListActive(gomock.Any()).Return(nil, nil).Times(1) + mds.service.Initialise(ctx) + assert.Equal(t, 0, int(mds.service.GetTotalAMMVolume(marketID))) + assert.Equal(t, 20, int(mds.service.GetTotalVolume(marketID))) + + // now a new AMM for a new market appears + newMarket := vgcrypto.RandomHash() + pool := getAMMDefinition(t, newMarket) + + ensureDecimalPlaces(t, mds) + mds.pos.EXPECT().GetByMarketAndParty(gomock.Any(), gomock.Any(), gomock.Any()).Return(entities.Position{OpenVolume: 0}, nil) + mds.marketData.EXPECT().GetMarketDataByID(gomock.Any(), gomock.Any()).Times(1).Return(entities.MarketData{MidPrice: num.DecimalFromInt64(2000)}, nil) + mds.service.OnAMMUpdate(pool, time.Now(), 1000) + + // check it makes sense + assert.Equal(t, 240, int(mds.service.GetTotalAMMVolume(newMarket))) + assert.Equal(t, "1999", mds.service.GetBestBidPrice(newMarket).String()) + assert.Equal(t, "2001", mds.service.GetBestAskPrice(newMarket).String()) +} + +func TestAMMStepOverFairPrice(t *testing.T) { + ctx := context.Background() + mds := getService(t) + defer mds.ctrl.Finish() + + // this is for an awkward case where an AMM's position exists between the position of two ticks + // for example if an AMM's base is at 2000, and it has 5 volume between 2000 -> 2001 our accurate + // expansion will step from 2000 -> 2001 and say there is 5 SELL volume at price 2001. + // + // Say the AMM now trades 1, when we expand and step from 2000 -> 2001 there should be only 4 SELL volume + // at 2001 and now 1 BUY volume at 1999 + + marketID := vgcrypto.RandomHash() + ensureLiveOrders(t, mds, marketID) + ensureDecimalPlaces(t, mds) + mds.pos.EXPECT().GetByMarketAndParty(gomock.Any(), gomock.Any(), gomock.Any()).Return(entities.Position{OpenVolume: 0}, nil) + mds.marketData.EXPECT().GetMarketDataByID(gomock.Any(), gomock.Any()).Times(1).Return(entities.MarketData{MidPrice: num.DecimalFromInt64(2000)}, nil) + + // data node is starting from network history, initialise market-depth based on whats aleady there + pool := ensureAMMs(t, mds, marketID) + mds.service.Initialise(ctx) + + assert.Equal(t, "1999", mds.service.GetBestBidPrice(marketID).String()) + assert.Equal(t, "2001", mds.service.GetBestAskPrice(marketID).String()) + assert.Equal(t, 3, int(mds.service.GetVolumeAtPrice(marketID, types.SideBuy, 1999))) + assert.Equal(t, 3, int(mds.service.GetVolumeAtPrice(marketID, types.SideSell, 2001))) + + // now a single trade happens making the AMM 1 short + mds.pos.EXPECT().GetByMarketAndParty(gomock.Any(), gomock.Any(), gomock.Any()).Return(entities.Position{OpenVolume: 1}, nil) + mds.marketData.EXPECT().GetMarketDataByID(gomock.Any(), gomock.Any()).Times(1).Return(entities.MarketData{MidPrice: num.DecimalFromInt64(2000)}, nil) + mds.service.AddOrder( + &types.Order{ + ID: vgcrypto.RandomHash(), + Party: pool.AmmPartyID.String(), + MarketID: marketID, + Side: types.SideBuy, + Status: entities.OrderStatusFilled, + }, + time.Date(2022, 3, 8, 16, 15, 39, 901022000, time.UTC), + 37, + ) + + assert.Equal(t, "1999", mds.service.GetBestBidPrice(marketID).String()) + assert.Equal(t, "2000", mds.service.GetBestAskPrice(marketID).String()) + assert.Equal(t, 2, int(mds.service.GetVolumeAtPrice(marketID, types.SideBuy, 1999))) + assert.Equal(t, 1, int(mds.service.GetVolumeAtPrice(marketID, types.SideSell, 2000))) + assert.Equal(t, 3, int(mds.service.GetVolumeAtPrice(marketID, types.SideSell, 2001))) +} + +func TestAMMSmallBounds(t *testing.T) { + ctx := context.Background() + mds := getServiceWithConfig(t, + service.MarketDepthConfig{ + AmmFullExpansionPercentage: 0.000001, + AmmEstimatedStepPercentage: 0.000001, + AmmMaxEstimatedSteps: 2, + }, + ) + defer mds.ctrl.Finish() + + marketID := vgcrypto.RandomHash() + ensureLiveOrders(t, mds, marketID) + ensureDecimalPlaces(t, mds) + mds.pos.EXPECT().GetByMarketAndParty(gomock.Any(), gomock.Any(), gomock.Any()).Return(entities.Position{OpenVolume: 0}, nil) + mds.marketData.EXPECT().GetMarketDataByID(gomock.Any(), gomock.Any()).Times(1).Return(entities.MarketData{MidPrice: num.DecimalFromInt64(2000)}, nil) + + // data node is starting from network history, initialise market-depth based on whats aleady there + ensureAMMs(t, mds, marketID) + mds.service.Initialise(ctx) + + assert.Equal(t, "1999", mds.service.GetBestBidPrice(marketID).String()) + assert.Equal(t, "2001", mds.service.GetBestAskPrice(marketID).String()) + assert.Equal(t, 3, int(mds.service.GetVolumeAtPrice(marketID, types.SideBuy, 1999))) + assert.Equal(t, 3, int(mds.service.GetVolumeAtPrice(marketID, types.SideSell, 2001))) + + // anywhere else is zero + assert.Equal(t, 0, int(mds.service.GetVolumeAtPrice(marketID, types.SideBuy, 1998))) + assert.Equal(t, 0, int(mds.service.GetVolumeAtPrice(marketID, types.SideSell, 2002))) +} + +func ensureLiveOrders(t *testing.T, mds *MDS, marketID string) { + t.Helper() + mds.orders.EXPECT().GetLiveOrders(gomock.Any()).Return([]entities.Order{ + { + ID: entities.OrderID(vgcrypto.RandomHash()), + MarketID: entities.MarketID(marketID), + PartyID: entities.PartyID(vgcrypto.RandomHash()), + Side: types.SideBuy, + Price: decimal.NewFromInt(1800), + Size: 10, + Remaining: 10, + Type: entities.OrderTypeLimit, + Status: entities.OrderStatusActive, + VegaTime: time.Date(2022, 3, 8, 14, 14, 45, 762739000, time.UTC), + SeqNum: 32, + }, + { + ID: entities.OrderID(vgcrypto.RandomHash()), + MarketID: entities.MarketID(marketID), + PartyID: entities.PartyID(vgcrypto.RandomHash()), + Side: types.SideSell, + Type: entities.OrderTypeLimit, + Status: entities.OrderStatusActive, + Price: decimal.NewFromInt(2200), + Size: 10, + Remaining: 10, + VegaTime: time.Date(2022, 3, 8, 14, 15, 39, 901022000, time.UTC), + SeqNum: 33, + }, + }, nil).Times(1) +} + +func getAMMDefinition(t *testing.T, marketID string) entities.AMMPool { + t.Helper() + return entities.AMMPool{ + PartyID: entities.PartyID(vgcrypto.RandomHash()), + AmmPartyID: entities.PartyID(vgcrypto.RandomHash()), + MarketID: entities.MarketID(marketID), + ParametersLowerBound: ptr.From(num.DecimalFromInt64(1800)), + LowerVirtualLiquidity: num.DecimalFromFloat(580723.51752738390596462639919437474617), + LowerTheoreticalPosition: num.DecimalFromFloat(702.4119613637248987), + ParametersBase: num.DecimalFromInt64(2000), + ParametersUpperBound: ptr.From(num.DecimalFromInt64(2200)), + UpperVirtualLiquidity: num.DecimalFromFloat(610600.1174758454383959875699679680084), + UpperTheoreticalPosition: num.DecimalFromFloat(635.3954521864637116), + } +} + +func ensureAMMs(t *testing.T, mds *MDS, marketID string) entities.AMMPool { + t.Helper() + + pool := getAMMDefinition(t, marketID) + mds.amm.EXPECT().ListActive(gomock.Any()).Return([]entities.AMMPool{pool}, nil).Times(1) + return pool +} + +func ensureDecimalPlaces(t *testing.T, mds *MDS) { + t.Helper() + + market := entities.Market{ + TradableInstrument: entities.TradableInstrument{ + TradableInstrument: &vega.TradableInstrument{ + Instrument: &vega.Instrument{ + Product: &vega.Instrument_Future{ + Future: &vega.Future{}, + }, + }, + }, + }, + DecimalPlaces: 1, + TickSize: ptr.From(num.DecimalOne()), + } + mds.markets.EXPECT().GetByID(gomock.Any(), gomock.Any()).Return(market, nil) + + asset := entities.Asset{ + Decimals: 1, + } + mds.assets.EXPECT().GetByID(gomock.Any(), gomock.Any()).Return(asset, nil) +} diff --git a/datanode/service/market_depth_test.go b/datanode/service/market_depth_test.go index 9db8b4ae835..85538c82ad0 100644 --- a/datanode/service/market_depth_test.go +++ b/datanode/service/market_depth_test.go @@ -33,9 +33,37 @@ import ( "github.com/stretchr/testify/require" ) -func getTestMDS(t *testing.T) *service.MarketDepth { +type MDS struct { + service *service.MarketDepth + ctrl *gomock.Controller + pos *mocks.MockPositionStore + amm *mocks.MockAMMStore + orders *mocks.MockOrderStore + marketData *mocks.MockMarketDataStore + markets *mocks.MockMarketStore + assets *mocks.MockAssetStore +} + +func getTestMDS(t *testing.T) *MDS { t.Helper() - return service.NewMarketDepth(nil, logging.NewTestLogger()) + ctrl := gomock.NewController(t) + pos := mocks.NewMockPositionStore(ctrl) + orders := mocks.NewMockOrderStore(ctrl) + marketData := mocks.NewMockMarketDataStore(ctrl) + amm := mocks.NewMockAMMStore(ctrl) + markets := mocks.NewMockMarketStore(ctrl) + + amm.EXPECT().ListActive(gomock.Any()).Return(nil, nil).AnyTimes() + + return &MDS{ + service: service.NewMarketDepth(service.NewDefaultConfig().MarketDepth, orders, amm, marketData, pos, nil, markets, logging.NewTestLogger()), + ctrl: ctrl, + pos: pos, + amm: amm, + orders: orders, + marketData: marketData, + markets: markets, + } } func buildOrder(id string, side types.Side, orderType types.OrderType, price uint64, size uint64, remaining uint64) *types.Order { @@ -59,32 +87,32 @@ func TestBuyPriceLevels(t *testing.T) { vegaTime := time.Now() order1 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 9, 9) - mds.AddOrder(order1, vegaTime, 1) + mds.service.AddOrder(order1, vegaTime, 1) order2 := buildOrder("Order2", types.SideBuy, types.OrderTypeLimit, 102, 7, 7) - mds.AddOrder(order2, vegaTime, 2) + mds.service.AddOrder(order2, vegaTime, 2) order3 := buildOrder("Order3", types.SideBuy, types.OrderTypeLimit, 101, 8, 8) - mds.AddOrder(order3, vegaTime, 3) + mds.service.AddOrder(order3, vegaTime, 3) order4 := buildOrder("Order4", types.SideBuy, types.OrderTypeLimit, 99, 10, 10) - mds.AddOrder(order4, vegaTime, 4) + mds.service.AddOrder(order4, vegaTime, 4) - assert.Equal(t, 4, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(4), mds.GetOrderCount("M")) + assert.Equal(t, 4, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(4), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(7), mds.GetVolumeAtPrice("M", types.SideBuy, 102)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 102)) + assert.Equal(t, uint64(7), mds.service.GetVolumeAtPrice("M", types.SideBuy, 102)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 102)) - assert.Equal(t, uint64(8), mds.GetVolumeAtPrice("M", types.SideBuy, 101)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 101)) + assert.Equal(t, uint64(8), mds.service.GetVolumeAtPrice("M", types.SideBuy, 101)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 101)) - assert.Equal(t, uint64(9), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(9), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(10), mds.GetVolumeAtPrice("M", types.SideBuy, 99)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 99)) + assert.Equal(t, uint64(10), mds.service.GetVolumeAtPrice("M", types.SideBuy, 99)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 99)) } func TestSellPriceLevels(t *testing.T) { @@ -92,32 +120,32 @@ func TestSellPriceLevels(t *testing.T) { vegaTime := time.Now() order1 := buildOrder("Order1", types.SideSell, types.OrderTypeLimit, 100, 9, 9) - mds.AddOrder(order1, vegaTime, 1) + mds.service.AddOrder(order1, vegaTime, 1) order2 := buildOrder("Order2", types.SideSell, types.OrderTypeLimit, 102, 7, 7) - mds.AddOrder(order2, vegaTime, 2) + mds.service.AddOrder(order2, vegaTime, 2) order3 := buildOrder("Order3", types.SideSell, types.OrderTypeLimit, 101, 8, 8) - mds.AddOrder(order3, vegaTime, 3) + mds.service.AddOrder(order3, vegaTime, 3) order4 := buildOrder("Order4", types.SideSell, types.OrderTypeLimit, 99, 10, 10) - mds.AddOrder(order4, vegaTime, 4) + mds.service.AddOrder(order4, vegaTime, 4) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 4, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(4), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 4, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(4), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(7), mds.GetVolumeAtPrice("M", types.SideSell, 102)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideSell, 102)) + assert.Equal(t, uint64(7), mds.service.GetVolumeAtPrice("M", types.SideSell, 102)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideSell, 102)) - assert.Equal(t, uint64(8), mds.GetVolumeAtPrice("M", types.SideSell, 101)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideSell, 101)) + assert.Equal(t, uint64(8), mds.service.GetVolumeAtPrice("M", types.SideSell, 101)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideSell, 101)) - assert.Equal(t, uint64(9), mds.GetVolumeAtPrice("M", types.SideSell, 100)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideSell, 100)) + assert.Equal(t, uint64(9), mds.service.GetVolumeAtPrice("M", types.SideSell, 100)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideSell, 100)) - assert.Equal(t, uint64(10), mds.GetVolumeAtPrice("M", types.SideSell, 99)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideSell, 99)) + assert.Equal(t, uint64(10), mds.service.GetVolumeAtPrice("M", types.SideSell, 99)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideSell, 99)) } func TestAddOrderToEmptyBook(t *testing.T) { @@ -125,14 +153,14 @@ func TestAddOrderToEmptyBook(t *testing.T) { vegaTime := time.Now() order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) - assert.Equal(t, 1, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(1), mds.GetOrderCount("M")) + assert.Equal(t, 1, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(1), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(10), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(10), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestCancelOrder(t *testing.T) { @@ -140,18 +168,18 @@ func TestCancelOrder(t *testing.T) { vegaTime := time.Now() order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) cancelorder := *order cancelorder.Status = types.OrderStatusCancelled - mds.AddOrder(&cancelorder, vegaTime, 2) + mds.service.AddOrder(&cancelorder, vegaTime, 2) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestStoppedOrder(t *testing.T) { @@ -159,18 +187,18 @@ func TestStoppedOrder(t *testing.T) { vegaTime := time.Now() order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) cancelorder := *order cancelorder.Status = types.OrderStatusStopped - mds.AddOrder(&cancelorder, vegaTime, 2) + mds.service.AddOrder(&cancelorder, vegaTime, 2) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestExpiredOrder(t *testing.T) { @@ -178,18 +206,18 @@ func TestExpiredOrder(t *testing.T) { vegaTime := time.Now() order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) cancelorder := *order cancelorder.Status = types.OrderStatusExpired - mds.AddOrder(&cancelorder, vegaTime, 2) + mds.service.AddOrder(&cancelorder, vegaTime, 2) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestAmendOrderPrice(t *testing.T) { @@ -199,23 +227,23 @@ func TestAmendOrderPrice(t *testing.T) { order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) order2 := buildOrder("Order2", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) - mds.AddOrder(order2, vegaTime, 2) + mds.service.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order2, vegaTime, 2) // Amend the price to force a change in price level amendorder := *order amendorder.Price = num.NewUint(90) amendorder.OriginalPrice = num.NewUint(90) - mds.AddOrder(&amendorder, vegaTime, 3) + mds.service.AddOrder(&amendorder, vegaTime, 3) - assert.Equal(t, 2, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(2), mds.GetOrderCount("M")) + assert.Equal(t, 2, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(2), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(10), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(10), mds.GetVolumeAtPrice("M", types.SideBuy, 90)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 90)) + assert.Equal(t, uint64(10), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(10), mds.service.GetVolumeAtPrice("M", types.SideBuy, 90)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 90)) } func TestAmendOrderVolumeUp(t *testing.T) { @@ -223,19 +251,19 @@ func TestAmendOrderVolumeUp(t *testing.T) { vegaTime := time.Now() order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) amendorder := *order amendorder.Size = 20 amendorder.Remaining = 20 - mds.AddOrder(&amendorder, vegaTime, 2) + mds.service.AddOrder(&amendorder, vegaTime, 2) - assert.Equal(t, 1, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(1), mds.GetOrderCount("M")) + assert.Equal(t, 1, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(1), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(20), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(20), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestAmendOrderVolumeDown(t *testing.T) { @@ -243,19 +271,19 @@ func TestAmendOrderVolumeDown(t *testing.T) { vegaTime := time.Now() order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) amendorder := *order amendorder.Size = 5 amendorder.Remaining = 5 - mds.AddOrder(&amendorder, vegaTime, 2) + mds.service.AddOrder(&amendorder, vegaTime, 2) - assert.Equal(t, 1, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(1), mds.GetOrderCount("M")) + assert.Equal(t, 1, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(1), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(5), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(5), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestAmendOrderVolumeDownToZero(t *testing.T) { @@ -263,19 +291,19 @@ func TestAmendOrderVolumeDownToZero(t *testing.T) { vegaTime := time.Now() order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) amendorder := *order amendorder.Size = 0 amendorder.Remaining = 0 - mds.AddOrder(&amendorder, vegaTime, 2) + mds.service.AddOrder(&amendorder, vegaTime, 2) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestPartialFill(t *testing.T) { @@ -283,18 +311,18 @@ func TestPartialFill(t *testing.T) { vegaTime := time.Now() order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) pforder := *order pforder.Remaining = 5 - mds.AddOrder(&pforder, vegaTime, 2) + mds.service.AddOrder(&pforder, vegaTime, 2) - assert.Equal(t, 1, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(1), mds.GetOrderCount("M")) + assert.Equal(t, 1, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(1), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(5), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(5), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestIOCPartialFill(t *testing.T) { @@ -304,14 +332,14 @@ func TestIOCPartialFill(t *testing.T) { order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 5) order.Status = types.OrderStatusPartiallyFilled order.TimeInForce = types.OrderTimeInForceIOC - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestFullyFill(t *testing.T) { @@ -319,19 +347,19 @@ func TestFullyFill(t *testing.T) { vegaTime := time.Now() order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) fforder := *order fforder.Remaining = 0 fforder.Status = types.OrderStatusFilled - mds.AddOrder(&fforder, vegaTime, 2) + mds.service.AddOrder(&fforder, vegaTime, 2) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestMarketOrder(t *testing.T) { @@ -340,14 +368,14 @@ func TestMarketOrder(t *testing.T) { // market orders should not stay on the book marketorder := buildOrder("Order1", types.SideBuy, types.OrderTypeMarket, 100, 10, 10) - mds.AddOrder(marketorder, vegaTime, 1) + mds.service.AddOrder(marketorder, vegaTime, 1) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestFOKOrder(t *testing.T) { @@ -357,14 +385,14 @@ func TestFOKOrder(t *testing.T) { // FOK orders do not stay on the book fokorder := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) fokorder.TimeInForce = types.OrderTimeInForceFOK - mds.AddOrder(fokorder, vegaTime, 1) + mds.service.AddOrder(fokorder, vegaTime, 1) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestIOCOrder(t *testing.T) { @@ -374,14 +402,14 @@ func TestIOCOrder(t *testing.T) { // IOC orders do not stay on the book iocorder := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) iocorder.TimeInForce = types.OrderTimeInForceIOC - mds.AddOrder(iocorder, vegaTime, 1) + mds.service.AddOrder(iocorder, vegaTime, 1) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestRejectedOrder(t *testing.T) { @@ -391,14 +419,14 @@ func TestRejectedOrder(t *testing.T) { // Rejected orders should be ignored order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) order.Status = types.OrderStatusRejected - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestInvalidOrder(t *testing.T) { @@ -408,14 +436,14 @@ func TestInvalidOrder(t *testing.T) { // Invalid orders should be ignored order := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 10) order.Status = types.OrderStatusUnspecified - mds.AddOrder(order, vegaTime, 1) + mds.service.AddOrder(order, vegaTime, 1) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestPartialMatchOrders(t *testing.T) { @@ -427,17 +455,17 @@ func TestPartialMatchOrders(t *testing.T) { order3 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 5) order4 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 1) - mds.AddOrder(order1, vegaTime, 1) - mds.AddOrder(order2, vegaTime, 2) - mds.AddOrder(order3, vegaTime, 3) - mds.AddOrder(order4, vegaTime, 4) + mds.service.AddOrder(order1, vegaTime, 1) + mds.service.AddOrder(order2, vegaTime, 2) + mds.service.AddOrder(order3, vegaTime, 3) + mds.service.AddOrder(order4, vegaTime, 4) - assert.Equal(t, 1, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(1), mds.GetOrderCount("M")) + assert.Equal(t, 1, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(1), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(1), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(1), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(1), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(1), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestFullyMatchOrders(t *testing.T) { @@ -450,17 +478,17 @@ func TestFullyMatchOrders(t *testing.T) { order4 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 100, 10, 0) order4.Status = types.OrderStatusFilled - mds.AddOrder(order1, vegaTime, 1) - mds.AddOrder(order2, vegaTime, 2) - mds.AddOrder(order3, vegaTime, 3) - mds.AddOrder(order4, vegaTime, 4) + mds.service.AddOrder(order1, vegaTime, 1) + mds.service.AddOrder(order2, vegaTime, 2) + mds.service.AddOrder(order3, vegaTime, 3) + mds.service.AddOrder(order4, vegaTime, 4) - assert.Equal(t, 0, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(0), mds.GetOrderCount("M")) + assert.Equal(t, 0, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(0), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 100)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 100)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 100)) } func TestRemovingPriceLevels(t *testing.T) { @@ -473,17 +501,17 @@ func TestRemovingPriceLevels(t *testing.T) { order4 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 101, 10, 0) order4.Status = types.OrderStatusFilled - mds.AddOrder(order1, vegaTime, 1) - mds.AddOrder(order2, vegaTime, 2) - mds.AddOrder(order3, vegaTime, 3) - mds.AddOrder(order4, vegaTime, 4) + mds.service.AddOrder(order1, vegaTime, 1) + mds.service.AddOrder(order2, vegaTime, 2) + mds.service.AddOrder(order3, vegaTime, 3) + mds.service.AddOrder(order4, vegaTime, 4) - assert.Equal(t, 2, mds.GetBuyPriceLevels("M")) - assert.Equal(t, 0, mds.GetSellPriceLevels("M")) - assert.Equal(t, int64(2), mds.GetOrderCount("M")) + assert.Equal(t, 2, mds.service.GetBuyPriceLevels("M")) + assert.Equal(t, 0, mds.service.GetSellPriceLevels("M")) + assert.Equal(t, int64(2), mds.service.GetOrderCount("M")) - assert.Equal(t, uint64(0), mds.GetVolumeAtPrice("M", types.SideBuy, 101)) - assert.Equal(t, uint64(0), mds.GetOrderCountAtPrice("M", types.SideBuy, 101)) + assert.Equal(t, uint64(0), mds.service.GetVolumeAtPrice("M", types.SideBuy, 101)) + assert.Equal(t, uint64(0), mds.service.GetOrderCountAtPrice("M", types.SideBuy, 101)) } func TestMarketDepthFields(t *testing.T) { @@ -491,9 +519,9 @@ func TestMarketDepthFields(t *testing.T) { vegaTime := time.Now() order1 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 101, 10, 10) - mds.AddOrder(order1, vegaTime, 1) + mds.service.AddOrder(order1, vegaTime, 1) - md := mds.GetMarketDepth("M", 0) + md := mds.service.GetMarketDepth("M", 0) assert.NotNil(t, md) assert.Equal(t, "M", md.MarketId) @@ -514,15 +542,15 @@ func TestParkingOrder(t *testing.T) { // Create a valid and live pegged order order1 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 101, 10, 10) order1.PeggedOrder = &types.PeggedOrder{Reference: types.PeggedReferenceBestBid, Offset: num.NewUint(1)} - mds.AddOrder(order1, vegaTime, 1) + mds.service.AddOrder(order1, vegaTime, 1) // Park it order2 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 0, 10, 10) order2.PeggedOrder = &types.PeggedOrder{Reference: types.PeggedReferenceBestBid, Offset: num.NewUint(1)} order2.Status = types.OrderStatusParked - mds.AddOrder(order2, vegaTime, 2) + mds.service.AddOrder(order2, vegaTime, 2) - md := mds.GetMarketDepth("M", 0) + md := mds.service.GetMarketDepth("M", 0) assert.NotNil(t, md) assert.Equal(t, "M", md.MarketId) @@ -533,9 +561,9 @@ func TestParkingOrder(t *testing.T) { order3 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 101, 10, 10) order3.PeggedOrder = &types.PeggedOrder{Reference: types.PeggedReferenceBestBid, Offset: num.NewUint(1)} order3.Status = types.OrderStatusActive - mds.AddOrder(order3, vegaTime, 3) + mds.service.AddOrder(order3, vegaTime, 3) - md2 := mds.GetMarketDepth("M", 0) + md2 := mds.service.GetMarketDepth("M", 0) assert.NotNil(t, md2) assert.Equal(t, "M", md2.MarketId) @@ -551,9 +579,9 @@ func TestParkedOrder(t *testing.T) { order1 := buildOrder("Order1", types.SideBuy, types.OrderTypeLimit, 101, 10, 10) order1.PeggedOrder = &types.PeggedOrder{Reference: types.PeggedReferenceBestBid, Offset: num.NewUint(1)} order1.Status = types.OrderStatusParked - mds.AddOrder(order1, vegaTime, 1) + mds.service.AddOrder(order1, vegaTime, 1) - md := mds.GetMarketDepth("M", 0) + md := mds.service.GetMarketDepth("M", 0) assert.NotNil(t, md) assert.Equal(t, "M", md.MarketId) @@ -569,56 +597,56 @@ func TestParkedOrder2(t *testing.T) { order1 := buildOrder("Pegged1", types.SideBuy, types.OrderTypeLimit, 0, 10, 10) order1.PeggedOrder = &types.PeggedOrder{Reference: types.PeggedReferenceBestBid, Offset: num.NewUint(1)} order1.Status = types.OrderStatusParked - mds.AddOrder(order1, vegaTime, 1) + mds.service.AddOrder(order1, vegaTime, 1) // Create normal order order2 := buildOrder("Normal1", types.SideBuy, types.OrderTypeLimit, 100, 1, 1) - mds.AddOrder(order2, vegaTime, 2) + mds.service.AddOrder(order2, vegaTime, 2) // Unpark pegged order order3 := buildOrder("Pegged1", types.SideBuy, types.OrderTypeLimit, 99, 10, 10) order3.PeggedOrder = &types.PeggedOrder{Reference: types.PeggedReferenceBestBid, Offset: num.NewUint(1)} order3.Status = types.OrderStatusActive - mds.AddOrder(order3, vegaTime, 3) + mds.service.AddOrder(order3, vegaTime, 3) // Cancel normal order order4 := buildOrder("Normal1", types.SideBuy, types.OrderTypeLimit, 100, 1, 1) order4.Status = types.OrderStatusCancelled - mds.AddOrder(order4, vegaTime, 4) + mds.service.AddOrder(order4, vegaTime, 4) // Park pegged order order5 := buildOrder("Pegged1", types.SideBuy, types.OrderTypeLimit, 99, 10, 10) order5.PeggedOrder = &types.PeggedOrder{Reference: types.PeggedReferenceBestBid, Offset: num.NewUint(1)} order5.Status = types.OrderStatusParked - mds.AddOrder(order5, vegaTime, 5) + mds.service.AddOrder(order5, vegaTime, 5) // Create normal order order6 := buildOrder("Normal2", types.SideBuy, types.OrderTypeLimit, 100, 1, 1) - mds.AddOrder(order6, vegaTime, 6) + mds.service.AddOrder(order6, vegaTime, 6) // Unpark pegged order order7 := buildOrder("Pegged1", types.SideBuy, types.OrderTypeLimit, 99, 10, 10) order7.PeggedOrder = &types.PeggedOrder{Reference: types.PeggedReferenceBestBid, Offset: num.NewUint(1)} order7.Status = types.OrderStatusActive - mds.AddOrder(order7, vegaTime, 7) + mds.service.AddOrder(order7, vegaTime, 7) // Fill normal order order8 := buildOrder("Normal2", types.SideBuy, types.OrderTypeLimit, 100, 1, 0) order8.Status = types.OrderStatusFilled - mds.AddOrder(order8, vegaTime, 8) + mds.service.AddOrder(order8, vegaTime, 8) // Create new matching order order9 := buildOrder("Normal3", types.SideSell, types.OrderTypeLimit, 100, 1, 0) order9.Status = types.OrderStatusFilled - mds.AddOrder(order9, vegaTime, 9) + mds.service.AddOrder(order9, vegaTime, 9) // Park pegged order order10 := buildOrder("Pegged1", types.SideBuy, types.OrderTypeLimit, 99, 10, 10) order10.PeggedOrder = &types.PeggedOrder{Reference: types.PeggedReferenceBestBid, Offset: num.NewUint(1)} order10.Status = types.OrderStatusParked - mds.AddOrder(order10, vegaTime, 10) + mds.service.AddOrder(order10, vegaTime, 10) - md := mds.GetMarketDepth("M", 0) + md := mds.service.GetMarketDepth("M", 0) assert.NotNil(t, md) assert.Equal(t, "M", md.MarketId) @@ -633,6 +661,8 @@ func TestInitFromSqlStore(t *testing.T) { t.Run("Init from SQL Store when SQL Store is in use", func(t *testing.T) { store := mocks.NewMockOrderStore(ctrl) + amm := mocks.NewMockAMMStore(ctrl) + amm.EXPECT().ListActive(gomock.Any()).Return(nil, nil).AnyTimes() store.EXPECT().GetLiveOrders(gomock.Any()).Return([]entities.Order{ { ID: "22EEA97BF1D9067D7533D0E671FC97C22146CE6785B4B142EBDF53FF0ED73E25", @@ -803,7 +833,7 @@ func TestInitFromSqlStore(t *testing.T) { SeqNum: 66, }, }, nil).Times(1) - svc := service.NewMarketDepth(store, logging.NewTestLogger()) + svc := service.NewMarketDepth(service.NewDefaultConfig().MarketDepth, store, amm, nil, nil, nil, nil, logging.NewTestLogger()) require.NoError(t, svc.Initialise(ctx)) }) } diff --git a/datanode/service/mocks/mocks.go b/datanode/service/mocks/mocks.go index 8880b80c808..9d8e18ba223 100644 --- a/datanode/service/mocks/mocks.go +++ b/datanode/service/mocks/mocks.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: code.vegaprotocol.io/vega/datanode/service (interfaces: OrderStore,ChainStore,MarketStore,MarketDataStore,PositionStore) +// Source: code.vegaprotocol.io/vega/datanode/service (interfaces: OrderStore,ChainStore,MarketStore,MarketDataStore,PositionStore,AccountStore,BalanceStore,RewardStore,AMMStore,AssetStore) // Package mocks is a generated GoMock package. package mocks @@ -457,3 +457,389 @@ func (mr *MockPositionStoreMockRecorder) GetByTxHash(arg0, arg1 interface{}) *go mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByTxHash", reflect.TypeOf((*MockPositionStore)(nil).GetByTxHash), arg0, arg1) } + +// MockAccountStore is a mock of AccountStore interface. +type MockAccountStore struct { + ctrl *gomock.Controller + recorder *MockAccountStoreMockRecorder +} + +// MockAccountStoreMockRecorder is the mock recorder for MockAccountStore. +type MockAccountStoreMockRecorder struct { + mock *MockAccountStore +} + +// NewMockAccountStore creates a new mock instance. +func NewMockAccountStore(ctrl *gomock.Controller) *MockAccountStore { + mock := &MockAccountStore{ctrl: ctrl} + mock.recorder = &MockAccountStoreMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAccountStore) EXPECT() *MockAccountStoreMockRecorder { + return m.recorder +} + +// GetAll mocks base method. +func (m *MockAccountStore) GetAll(arg0 context.Context) ([]entities.Account, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAll", arg0) + ret0, _ := ret[0].([]entities.Account) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAll indicates an expected call of GetAll. +func (mr *MockAccountStoreMockRecorder) GetAll(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAll", reflect.TypeOf((*MockAccountStore)(nil).GetAll), arg0) +} + +// GetBalancesByTxHash mocks base method. +func (m *MockAccountStore) GetBalancesByTxHash(arg0 context.Context, arg1 entities.TxHash) ([]entities.AccountBalance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetBalancesByTxHash", arg0, arg1) + ret0, _ := ret[0].([]entities.AccountBalance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBalancesByTxHash indicates an expected call of GetBalancesByTxHash. +func (mr *MockAccountStoreMockRecorder) GetBalancesByTxHash(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBalancesByTxHash", reflect.TypeOf((*MockAccountStore)(nil).GetBalancesByTxHash), arg0, arg1) +} + +// GetByRawID mocks base method. +func (m *MockAccountStore) GetByRawID(arg0 context.Context, arg1 string) (entities.Account, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByRawID", arg0, arg1) + ret0, _ := ret[0].(entities.Account) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByRawID indicates an expected call of GetByRawID. +func (mr *MockAccountStoreMockRecorder) GetByRawID(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByRawID", reflect.TypeOf((*MockAccountStore)(nil).GetByRawID), arg0, arg1) +} + +// GetByTxHash mocks base method. +func (m *MockAccountStore) GetByTxHash(arg0 context.Context, arg1 entities.TxHash) ([]entities.Account, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByTxHash", arg0, arg1) + ret0, _ := ret[0].([]entities.Account) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByTxHash indicates an expected call of GetByTxHash. +func (mr *MockAccountStoreMockRecorder) GetByTxHash(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByTxHash", reflect.TypeOf((*MockAccountStore)(nil).GetByTxHash), arg0, arg1) +} + +// Obtain mocks base method. +func (m *MockAccountStore) Obtain(arg0 context.Context, arg1 *entities.Account) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Obtain", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Obtain indicates an expected call of Obtain. +func (mr *MockAccountStoreMockRecorder) Obtain(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Obtain", reflect.TypeOf((*MockAccountStore)(nil).Obtain), arg0, arg1) +} + +// Query mocks base method. +func (m *MockAccountStore) Query(arg0 context.Context, arg1 entities.AccountFilter) ([]entities.Account, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", arg0, arg1) + ret0, _ := ret[0].([]entities.Account) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Query indicates an expected call of Query. +func (mr *MockAccountStoreMockRecorder) Query(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockAccountStore)(nil).Query), arg0, arg1) +} + +// QueryBalances mocks base method. +func (m *MockAccountStore) QueryBalances(arg0 context.Context, arg1 entities.AccountFilter, arg2 entities.CursorPagination) ([]entities.AccountBalance, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "QueryBalances", arg0, arg1, arg2) + ret0, _ := ret[0].([]entities.AccountBalance) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// QueryBalances indicates an expected call of QueryBalances. +func (mr *MockAccountStoreMockRecorder) QueryBalances(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "QueryBalances", reflect.TypeOf((*MockAccountStore)(nil).QueryBalances), arg0, arg1, arg2) +} + +// MockBalanceStore is a mock of BalanceStore interface. +type MockBalanceStore struct { + ctrl *gomock.Controller + recorder *MockBalanceStoreMockRecorder +} + +// MockBalanceStoreMockRecorder is the mock recorder for MockBalanceStore. +type MockBalanceStoreMockRecorder struct { + mock *MockBalanceStore +} + +// NewMockBalanceStore creates a new mock instance. +func NewMockBalanceStore(ctrl *gomock.Controller) *MockBalanceStore { + mock := &MockBalanceStore{ctrl: ctrl} + mock.recorder = &MockBalanceStoreMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockBalanceStore) EXPECT() *MockBalanceStoreMockRecorder { + return m.recorder +} + +// Add mocks base method. +func (m *MockBalanceStore) Add(arg0 entities.AccountBalance) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Add", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Add indicates an expected call of Add. +func (mr *MockBalanceStoreMockRecorder) Add(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockBalanceStore)(nil).Add), arg0) +} + +// Flush mocks base method. +func (m *MockBalanceStore) Flush(arg0 context.Context) ([]entities.AccountBalance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Flush", arg0) + ret0, _ := ret[0].([]entities.AccountBalance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Flush indicates an expected call of Flush. +func (mr *MockBalanceStoreMockRecorder) Flush(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Flush", reflect.TypeOf((*MockBalanceStore)(nil).Flush), arg0) +} + +// Query mocks base method. +func (m *MockBalanceStore) Query(arg0 context.Context, arg1 entities.AccountFilter, arg2 entities.DateRange, arg3 entities.CursorPagination) (*[]entities.AggregatedBalance, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Query", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*[]entities.AggregatedBalance) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// Query indicates an expected call of Query. +func (mr *MockBalanceStoreMockRecorder) Query(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockBalanceStore)(nil).Query), arg0, arg1, arg2, arg3) +} + +// MockRewardStore is a mock of RewardStore interface. +type MockRewardStore struct { + ctrl *gomock.Controller + recorder *MockRewardStoreMockRecorder +} + +// MockRewardStoreMockRecorder is the mock recorder for MockRewardStore. +type MockRewardStoreMockRecorder struct { + mock *MockRewardStore +} + +// NewMockRewardStore creates a new mock instance. +func NewMockRewardStore(ctrl *gomock.Controller) *MockRewardStore { + mock := &MockRewardStore{ctrl: ctrl} + mock.recorder = &MockRewardStoreMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockRewardStore) EXPECT() *MockRewardStoreMockRecorder { + return m.recorder +} + +// Add mocks base method. +func (m *MockRewardStore) Add(arg0 context.Context, arg1 entities.Reward) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Add", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// Add indicates an expected call of Add. +func (mr *MockRewardStoreMockRecorder) Add(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Add", reflect.TypeOf((*MockRewardStore)(nil).Add), arg0, arg1) +} + +// GetAll mocks base method. +func (m *MockRewardStore) GetAll(arg0 context.Context) ([]entities.Reward, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetAll", arg0) + ret0, _ := ret[0].([]entities.Reward) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAll indicates an expected call of GetAll. +func (mr *MockRewardStoreMockRecorder) GetAll(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAll", reflect.TypeOf((*MockRewardStore)(nil).GetAll), arg0) +} + +// GetByCursor mocks base method. +func (m *MockRewardStore) GetByCursor(arg0 context.Context, arg1 []string, arg2 *string, arg3, arg4 *uint64, arg5 entities.CursorPagination, arg6, arg7, arg8 *string) ([]entities.Reward, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByCursor", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) + ret0, _ := ret[0].([]entities.Reward) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetByCursor indicates an expected call of GetByCursor. +func (mr *MockRewardStoreMockRecorder) GetByCursor(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByCursor", reflect.TypeOf((*MockRewardStore)(nil).GetByCursor), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) +} + +// GetByTxHash mocks base method. +func (m *MockRewardStore) GetByTxHash(arg0 context.Context, arg1 entities.TxHash) ([]entities.Reward, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByTxHash", arg0, arg1) + ret0, _ := ret[0].([]entities.Reward) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByTxHash indicates an expected call of GetByTxHash. +func (mr *MockRewardStoreMockRecorder) GetByTxHash(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByTxHash", reflect.TypeOf((*MockRewardStore)(nil).GetByTxHash), arg0, arg1) +} + +// GetEpochSummaries mocks base method. +func (m *MockRewardStore) GetEpochSummaries(arg0 context.Context, arg1 entities.RewardSummaryFilter, arg2 entities.CursorPagination) ([]entities.EpochRewardSummary, entities.PageInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetEpochSummaries", arg0, arg1, arg2) + ret0, _ := ret[0].([]entities.EpochRewardSummary) + ret1, _ := ret[1].(entities.PageInfo) + ret2, _ := ret[2].(error) + return ret0, ret1, ret2 +} + +// GetEpochSummaries indicates an expected call of GetEpochSummaries. +func (mr *MockRewardStoreMockRecorder) GetEpochSummaries(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetEpochSummaries", reflect.TypeOf((*MockRewardStore)(nil).GetEpochSummaries), arg0, arg1, arg2) +} + +// GetSummaries mocks base method. +func (m *MockRewardStore) GetSummaries(arg0 context.Context, arg1 []string, arg2 *string) ([]entities.RewardSummary, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetSummaries", arg0, arg1, arg2) + ret0, _ := ret[0].([]entities.RewardSummary) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetSummaries indicates an expected call of GetSummaries. +func (mr *MockRewardStoreMockRecorder) GetSummaries(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSummaries", reflect.TypeOf((*MockRewardStore)(nil).GetSummaries), arg0, arg1, arg2) +} + +// MockAMMStore is a mock of AMMStore interface. +type MockAMMStore struct { + ctrl *gomock.Controller + recorder *MockAMMStoreMockRecorder +} + +// MockAMMStoreMockRecorder is the mock recorder for MockAMMStore. +type MockAMMStoreMockRecorder struct { + mock *MockAMMStore +} + +// NewMockAMMStore creates a new mock instance. +func NewMockAMMStore(ctrl *gomock.Controller) *MockAMMStore { + mock := &MockAMMStore{ctrl: ctrl} + mock.recorder = &MockAMMStoreMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAMMStore) EXPECT() *MockAMMStoreMockRecorder { + return m.recorder +} + +// ListActive mocks base method. +func (m *MockAMMStore) ListActive(arg0 context.Context) ([]entities.AMMPool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ListActive", arg0) + ret0, _ := ret[0].([]entities.AMMPool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListActive indicates an expected call of ListActive. +func (mr *MockAMMStoreMockRecorder) ListActive(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListActive", reflect.TypeOf((*MockAMMStore)(nil).ListActive), arg0) +} + +// MockAssetStore is a mock of AssetStore interface. +type MockAssetStore struct { + ctrl *gomock.Controller + recorder *MockAssetStoreMockRecorder +} + +// MockAssetStoreMockRecorder is the mock recorder for MockAssetStore. +type MockAssetStoreMockRecorder struct { + mock *MockAssetStore +} + +// NewMockAssetStore creates a new mock instance. +func NewMockAssetStore(ctrl *gomock.Controller) *MockAssetStore { + mock := &MockAssetStore{ctrl: ctrl} + mock.recorder = &MockAssetStoreMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockAssetStore) EXPECT() *MockAssetStoreMockRecorder { + return m.recorder +} + +// GetByID mocks base method. +func (m *MockAssetStore) GetByID(arg0 context.Context, arg1 string) (entities.Asset, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetByID", arg0, arg1) + ret0, _ := ret[0].(entities.Asset) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetByID indicates an expected call of GetByID. +func (mr *MockAssetStoreMockRecorder) GetByID(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByID", reflect.TypeOf((*MockAssetStore)(nil).GetByID), arg0, arg1) +} diff --git a/datanode/service/position.go b/datanode/service/position.go index ccea16eea47..cd828fdd5b5 100644 --- a/datanode/service/position.go +++ b/datanode/service/position.go @@ -23,6 +23,7 @@ import ( "code.vegaprotocol.io/vega/logging" lru "github.com/hashicorp/golang-lru" + "golang.org/x/exp/slices" ) type PositionStore interface { @@ -169,3 +170,13 @@ func (p *Position) Observe(ctx context.Context, retries int, partyID, marketID s }) return ch, ref } + +func (p *Position) ObserveMany(ctx context.Context, retries int, marketID string, parties ...string) (<-chan []entities.Position, uint64) { + ch, ref := p.observer.Observe(ctx, + retries, + func(pos entities.Position) bool { + return (len(marketID) == 0 || marketID == pos.MarketID.String()) && + (len(parties) == 0 || slices.Contains(parties, pos.PartyID.String())) + }) + return ch, ref +} diff --git a/datanode/service/rewards.go b/datanode/service/rewards.go index c068857e48d..f85338f24fe 100644 --- a/datanode/service/rewards.go +++ b/datanode/service/rewards.go @@ -22,20 +22,20 @@ import ( "code.vegaprotocol.io/vega/logging" ) -type rewardStore interface { +type RewardStore interface { Add(ctx context.Context, r entities.Reward) error GetAll(ctx context.Context) ([]entities.Reward, error) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]entities.Reward, error) - GetByCursor(ctx context.Context, partyID *string, assetID *string, fromEpoch, toEpoch *uint64, p entities.CursorPagination, teamID, gameID *string) ([]entities.Reward, entities.PageInfo, error) - GetSummaries(ctx context.Context, partyID *string, assetID *string) ([]entities.RewardSummary, error) + GetByCursor(ctx context.Context, partyID []string, assetID *string, fromEpoch, toEpoch *uint64, p entities.CursorPagination, teamID, gameID, marketID *string) ([]entities.Reward, entities.PageInfo, error) + GetSummaries(ctx context.Context, partyID []string, assetID *string) ([]entities.RewardSummary, error) GetEpochSummaries(ctx context.Context, filter entities.RewardSummaryFilter, p entities.CursorPagination) ([]entities.EpochRewardSummary, entities.PageInfo, error) } type Reward struct { - store rewardStore + store RewardStore } -func NewReward(store rewardStore, log *logging.Logger) *Reward { +func NewReward(store RewardStore, log *logging.Logger) *Reward { return &Reward{ store: store, } @@ -57,12 +57,12 @@ func (r *Reward) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]ent return r.store.GetByTxHash(ctx, txHash) } -func (r *Reward) GetByCursor(ctx context.Context, partyID, assetID *string, fromEpoch, toEpoch *uint64, p entities.CursorPagination, teamID, gameID *string) ([]entities.Reward, entities.PageInfo, error) { - return r.store.GetByCursor(ctx, partyID, assetID, fromEpoch, toEpoch, p, teamID, gameID) +func (r *Reward) GetByCursor(ctx context.Context, partyIDs []string, assetID *string, fromEpoch, toEpoch *uint64, p entities.CursorPagination, teamID, gameID, marketID *string) ([]entities.Reward, entities.PageInfo, error) { + return r.store.GetByCursor(ctx, partyIDs, assetID, fromEpoch, toEpoch, p, teamID, gameID, marketID) } -func (r *Reward) GetSummaries(ctx context.Context, partyID *string, assetID *string) ([]entities.RewardSummary, error) { - return r.store.GetSummaries(ctx, partyID, assetID) +func (r *Reward) GetSummaries(ctx context.Context, partyIDs []string, assetID *string) ([]entities.RewardSummary, error) { + return r.store.GetSummaries(ctx, partyIDs, assetID) } func (r *Reward) GetEpochRewardSummaries(ctx context.Context, filter entities.RewardSummaryFilter, p entities.CursorPagination) ([]entities.EpochRewardSummary, entities.PageInfo, error) { diff --git a/datanode/service/service.go b/datanode/service/service.go index 987a38cb79a..f2579f15cf6 100644 --- a/datanode/service/service.go +++ b/datanode/service/service.go @@ -15,4 +15,4 @@ package service -//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/datanode/service OrderStore,ChainStore,MarketStore,MarketDataStore,PositionStore +//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/datanode/service OrderStore,ChainStore,MarketStore,MarketDataStore,PositionStore,AccountStore,BalanceStore,RewardStore,AMMStore,AssetStore diff --git a/datanode/service/stubs.go b/datanode/service/stubs.go index cd86a1fd563..442b65034ed 100644 --- a/datanode/service/stubs.go +++ b/datanode/service/stubs.go @@ -219,3 +219,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/accounts.go b/datanode/sqlstore/accounts.go index a11ca52ed97..ac29d1de92b 100644 --- a/datanode/sqlstore/accounts.go +++ b/datanode/sqlstore/accounts.go @@ -52,7 +52,7 @@ func NewAccounts(connectionSource *ConnectionSource) *Accounts { func (as *Accounts) Add(ctx context.Context, a *entities.Account) error { defer metrics.StartSQLQuery("Accounts", "Add")() - err := as.Connection.QueryRow(ctx, + err := as.QueryRow(ctx, `INSERT INTO accounts(id, party_id, asset_id, market_id, type, tx_hash, vega_time) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id`, @@ -66,6 +66,10 @@ func (as *Accounts) Add(ctx context.Context, a *entities.Account) error { return err } +func (as *Accounts) GetByRawID(ctx context.Context, accountID string) (entities.Account, error) { + return as.GetByID(ctx, entities.AccountID(accountID)) +} + func (as *Accounts) GetByID(ctx context.Context, accountID entities.AccountID) (entities.Account, error) { if account, ok := as.getAccountFromCache(accountID); ok { return account, nil @@ -83,7 +87,7 @@ func (as *Accounts) GetByID(ctx context.Context, accountID entities.AccountID) ( a := entities.Account{} defer metrics.StartSQLQuery("Accounts", "GetByID")() - if err := pgxscan.Get(ctx, as.Connection, &a, + if err := pgxscan.Get(ctx, as.ConnectionSource, &a, `SELECT id, party_id, asset_id, market_id, type, tx_hash, vega_time FROM accounts WHERE id=$1`, accountID, @@ -98,7 +102,7 @@ func (as *Accounts) GetByID(ctx context.Context, accountID entities.AccountID) ( func (as *Accounts) GetAll(ctx context.Context) ([]entities.Account, error) { accounts := []entities.Account{} defer metrics.StartSQLQuery("Accounts", "GetAll")() - err := pgxscan.Select(ctx, as.Connection, &accounts, ` + err := pgxscan.Select(ctx, as.ConnectionSource, &accounts, ` SELECT id, party_id, asset_id, market_id, type, tx_hash, vega_time FROM accounts`) return accounts, err @@ -110,7 +114,7 @@ func (as *Accounts) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([] err := pgxscan.Select( ctx, - as.Connection, + as.ConnectionSource, &accounts, `SELECT id, party_id, asset_id, market_id, type, tx_hash, vega_time FROM accounts WHERE tx_hash=$1`, txHash, @@ -156,7 +160,7 @@ func (as *Accounts) Obtain(ctx context.Context, a *entities.Account) error { batch.Queue(insertQuery, accountID, a.PartyID, a.AssetID, a.MarketID, a.Type, a.TxHash, a.VegaTime) batch.Queue(selectQuery, a.PartyID, a.AssetID, a.MarketID, a.Type) defer metrics.StartSQLQuery("Accounts", "Obtain")() - results := as.Connection.SendBatch(ctx, &batch) + results := as.SendBatch(ctx, &batch) defer results.Close() if _, err := results.Exec(); err != nil { @@ -200,7 +204,7 @@ func (as *Accounts) Query(ctx context.Context, filter entities.AccountFilter) ([ accs := []entities.Account{} defer metrics.StartSQLQuery("Accounts", "Query")() - rows, err := as.Connection.Query(ctx, query, args...) + rows, err := as.ConnectionSource.Query(ctx, query, args...) if err != nil { return accs, fmt.Errorf("querying accounts: %w", err) } @@ -230,7 +234,7 @@ func (as *Accounts) QueryBalances(ctx context.Context, defer metrics.StartSQLQuery("Accounts", "QueryBalances")() accountBalances := make([]entities.AccountBalance, 0) - rows, err := as.Connection.Query(ctx, query, args...) + rows, err := as.ConnectionSource.Query(ctx, query, args...) if err != nil { return accountBalances, entities.PageInfo{}, fmt.Errorf("querying account balances: %w", err) } @@ -250,7 +254,7 @@ func (as *Accounts) GetBalancesByTxHash(ctx context.Context, txHash entities.TxH err := pgxscan.Select( ctx, - as.Connection, + as.ConnectionSource, &balances, fmt.Sprintf("%s WHERE balances.tx_hash=$1", accountBalancesQuery()), txHash, diff --git a/datanode/sqlstore/amm_pool.go b/datanode/sqlstore/amm_pool.go new file mode 100644 index 00000000000..87b9304dfeb --- /dev/null +++ b/datanode/sqlstore/amm_pool.go @@ -0,0 +1,226 @@ +// 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" + "strings" + + "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: "amm_party_id", Sorting: DESC}, + ColumnOrdering{Name: "market_id", Sorting: DESC}, + ColumnOrdering{Name: "id", Sorting: DESC}, + } + + activeStates = []entities.AMMStatus{entities.AMMStatusActive, entities.AMMStatusReduceOnly} +) + +func NewAMMPools(connectionSource *ConnectionSource) *AMMPools { + return &AMMPools{ + ConnectionSource: connectionSource, + } +} + +func (p *AMMPools) Upsert(ctx context.Context, pool entities.AMMPool) error { + defer metrics.StartSQLQuery("AMMs", "UpsertAMM") + if _, err := p.ConnectionSource.Exec(ctx, ` +insert into amms(party_id, market_id, id, amm_party_id, +commitment, status, status_reason, parameters_base, +parameters_lower_bound, parameters_upper_bound, +parameters_leverage_at_lower_bound, parameters_leverage_at_upper_bound, +created_at, last_updated, proposed_fee, +lower_virtual_liquidity, lower_theoretical_position, +upper_virtual_liquidity, upper_theoretical_position) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19) +on conflict (party_id, market_id, id, amm_party_id) 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_leverage_at_lower_bound=excluded.parameters_leverage_at_lower_bound, + parameters_leverage_at_upper_bound=excluded.parameters_leverage_at_upper_bound, + last_updated=excluded.last_updated, + proposed_fee=excluded.proposed_fee, + lower_virtual_liquidity=excluded.lower_virtual_liquidity, + lower_theoretical_position=excluded.lower_theoretical_position, + upper_virtual_liquidity=excluded.upper_virtual_liquidity, + upper_theoretical_position=excluded.upper_theoretical_position;`, + pool.PartyID, + pool.MarketID, + pool.ID, + pool.AmmPartyID, + pool.Commitment, + pool.Status, + pool.StatusReason, + pool.ParametersBase, + pool.ParametersLowerBound, + pool.ParametersUpperBound, + pool.ParametersLeverageAtLowerBound, + pool.ParametersLeverageAtUpperBound, + pool.CreatedAt, + pool.LastUpdated, + pool.ProposedFee, + pool.LowerVirtualLiquidity, + pool.LowerTheoreticalPosition, + pool.UpperVirtualLiquidity, + pool.UpperTheoreticalPosition, + ); 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 amms 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.AMMEdge](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("AMMs", "ListByMarket") + return listBy(ctx, p.ConnectionSource, "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("AMMs", "ListByParty") + + return listBy(ctx, p.ConnectionSource, "party_id", &partyID, pagination) +} + +func (p *AMMPools) GetSubKeysForParties(ctx context.Context, partyIDs []string, marketIDs []string) ([]string, error) { + if len(partyIDs) == 0 { + return nil, nil + } + parties := strings.Builder{} + args := make([]any, 0, len(partyIDs)+len(marketIDs)) + query := `SELECT amm_party_id FROM amms WHERE "` + for i, party := range partyIDs { + if i > 0 { + parties.WriteString(",") + } + parties.WriteString(nextBindVar(&args, party)) + } + query = fmt.Sprintf(`%s party_id IN (%s)`, query, parties.String()) + if len(marketIDs) > 0 { + markets := strings.Builder{} + for i, mID := range marketIDs { + if i > 0 { + markets.WriteString(",") + } + markets.WriteString(nextBindVar(&args, mID)) + } + query = fmt.Sprintf("%s AND market_id IN(%s)", query, markets.String()) + } + + subKeys := []string{} + if err := pgxscan.Select(ctx, p.ConnectionSource, &subKeys, query, args...); err != nil { + return nil, err + } + return subKeys, nil +} + +func (p *AMMPools) ListByPool(ctx context.Context, poolID entities.AMMPoolID, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMs", "ListByPool") + return listBy(ctx, p.ConnectionSource, "id", &poolID, pagination) +} + +func (p *AMMPools) ListBySubAccount(ctx context.Context, ammPartyID entities.PartyID, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMs", "ListByAMMParty") + return listBy(ctx, p.ConnectionSource, "amm_party_id", &ammPartyID, pagination) +} + +func (p *AMMPools) ListByStatus(ctx context.Context, status entities.AMMStatus, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMs", "ListByStatus") + return listBy(ctx, p.ConnectionSource, "status", &status, pagination) +} + +func (p *AMMPools) ListAll(ctx context.Context, pagination entities.CursorPagination) ([]entities.AMMPool, entities.PageInfo, error) { + defer metrics.StartSQLQuery("AMMs", "ListAll") + var ( + pools []entities.AMMPool + pageInfo entities.PageInfo + args []interface{} + ) + query := `SELECT * FROM amms` + query, args, err := PaginateQuery[entities.AMMPoolCursor](query, args, ammPoolsOrdering, pagination) + if err != nil { + return nil, pageInfo, err + } + + if err := pgxscan.Select(ctx, p.ConnectionSource, &pools, query, args...); err != nil { + return nil, pageInfo, fmt.Errorf("could not list AMMs: %w", err) + } + + pools, pageInfo = entities.PageEntities[*v2.AMMEdge](pools, pagination) + return pools, pageInfo, nil +} + +func (p *AMMPools) ListActive(ctx context.Context) ([]entities.AMMPool, error) { + defer metrics.StartSQLQuery("AMMs", "ListAll") + var ( + pools []entities.AMMPool + args []interface{} + whereClause string + ) + + states := strings.Builder{} + for i, status := range activeStates { + if i > 0 { + states.WriteString(",") + } + states.WriteString(nextBindVar(&args, status)) + } + whereClause += fmt.Sprintf("status IN (%s)", states.String()) + query := fmt.Sprintf(`SELECT * from amms WHERE %s`, whereClause) + + if err := pgxscan.Select(ctx, p.ConnectionSource, &pools, query, args...); err != nil { + return nil, fmt.Errorf("could not list active AMMs: %w", err) + } + + return pools, nil +} diff --git a/datanode/sqlstore/amm_pool_test.go b/datanode/sqlstore/amm_pool_test.go new file mode 100644 index 00000000000..c420aaa0abc --- /dev/null +++ b/datanode/sqlstore/amm_pool_test.go @@ -0,0 +1,817 @@ +// 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()) + ammPartyID := entities.PartyID(GenerateID()) + + t.Run("Upsert statuses", func(t *testing.T) { + upsertTests := []struct { + Status entities.AMMStatus + Reason entities.AMMStatusReason + }{ + {entities.AMMStatusActive, entities.AMMStatusReasonUnspecified}, + {entities.AMMStatusStopped, entities.AMMStatusReasonUnspecified}, + {entities.AMMStatusCancelled, entities.AMMStatusReasonUnspecified}, + {entities.AMMStatusRejected, entities.AMMStatusReasonCancelledByParty}, + {entities.AMMStatusRejected, entities.AMMStatusReasonCannotRebase}, + {entities.AMMStatusRejected, entities.AMMStatusReasonMarketClosed}, + {entities.AMMStatusRejected, entities.AMMStatusReasonCannotFillCommitment}, + {entities.AMMStatusRejected, entities.AMMStatusReasonCommitmentTooLow}, + {entities.AMMStatusRejected, entities.AMMStatusReasonPartyAlreadyOwnsAPool}, + {entities.AMMStatusRejected, entities.AMMStatusReasonPartyClosedOut}, + } + + upsertTime := block.VegaTime + for i, test := range upsertTests { + upsertTime = upsertTime.Add(time.Duration(i) * time.Minute) + pool := entities.AMMPool{ + PartyID: partyID, + MarketID: marketID, + ID: poolID, + AmmPartyID: ammPartyID, + Commitment: num.DecimalFromInt64(100), + Status: test.Status, + StatusReason: test.Reason, + ParametersBase: num.DecimalFromInt64(100), + ParametersLowerBound: ptr.From(num.DecimalFromInt64(100)), + ParametersUpperBound: ptr.From(num.DecimalFromInt64(100)), + ParametersLeverageAtLowerBound: ptr.From(num.DecimalFromInt64(100)), + ParametersLeverageAtUpperBound: ptr.From(num.DecimalFromInt64(100)), + CreatedAt: block.VegaTime, + LastUpdated: upsertTime, + LowerVirtualLiquidity: num.DecimalOne(), + UpperVirtualLiquidity: num.DecimalOne(), + LowerTheoreticalPosition: num.DecimalOne(), + UpperTheoreticalPosition: num.DecimalOne(), + } + require.NoError(t, ps.Upsert(ctx, pool)) + var upserted entities.AMMPool + require.NoError(t, pgxscan.Get( + ctx, + connectionSource, + &upserted, + `SELECT * FROM amms WHERE party_id = $1 AND market_id = $2 AND id = $3 AND amm_party_id = $4`, + partyID, marketID, poolID, ammPartyID)) + 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, + ID: poolID, + AmmPartyID: ammPartyID, + Commitment: amount, + Status: entities.AMMStatusActive, + StatusReason: entities.AMMStatusReasonUnspecified, + ParametersBase: amount, + ParametersLowerBound: ptr.From(amount), + ParametersUpperBound: ptr.From(amount), + ParametersLeverageAtLowerBound: ptr.From(amount), + ParametersLeverageAtUpperBound: ptr.From(amount), + CreatedAt: block.VegaTime, + LastUpdated: upsertTime, + LowerVirtualLiquidity: num.DecimalOne(), + UpperVirtualLiquidity: num.DecimalOne(), + LowerTheoreticalPosition: num.DecimalOne(), + UpperTheoreticalPosition: num.DecimalOne(), + } + require.NoError(t, ps.Upsert(ctx, pool)) + var upserted entities.AMMPool + require.NoError(t, pgxscan.Get( + ctx, + connectionSource, + &upserted, + `SELECT * FROM amms WHERE party_id = $1 AND market_id = $2 AND id = $3 AND amm_party_id = $4`, + partyID, marketID, poolID, ammPartyID)) + assert.Equal(t, pool, upserted) + } + }) + + t.Run("Upsert with empty leverages", func(t *testing.T) { + upsertTime := block.VegaTime + + pool := entities.AMMPool{ + PartyID: partyID, + MarketID: marketID, + ID: poolID, + AmmPartyID: ammPartyID, + Commitment: num.DecimalFromInt64(100), + Status: entities.AMMStatusActive, + StatusReason: entities.AMMStatusReasonUnspecified, + ParametersBase: num.DecimalFromInt64(1800), + ParametersLowerBound: ptr.From(num.DecimalFromInt64(2000)), + ParametersUpperBound: ptr.From(num.DecimalFromInt64(2200)), + ParametersLeverageAtLowerBound: nil, + ParametersLeverageAtUpperBound: nil, + CreatedAt: block.VegaTime, + LastUpdated: upsertTime, + LowerVirtualLiquidity: num.DecimalOne(), + UpperVirtualLiquidity: num.DecimalOne(), + LowerTheoreticalPosition: num.DecimalOne(), + UpperTheoreticalPosition: num.DecimalOne(), + } + require.NoError(t, ps.Upsert(ctx, pool)) + var upserted entities.AMMPool + require.NoError(t, pgxscan.Get( + ctx, + connectionSource, + &upserted, + `SELECT * FROM amms WHERE party_id = $1 AND market_id = $2 AND id = $3 AND amm_party_id = $4`, + partyID, marketID, poolID, ammPartyID)) + assert.Equal(t, pool, upserted) + }) +} + +type partyAccounts struct { + PartyID entities.PartyID + AMMPartyID entities.PartyID +} + +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 derived-party associated for AMM and this derived-party 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()) + ammPartyID := entities.PartyID(GenerateID()) + + parties = append(parties, partyAccounts{PartyID: partyID, AMMPartyID: ammPartyID}) + 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.AMMStatusActive + statusReason := entities.AMMStatusReasonUnspecified + if (i+j+k)%2 == 0 { + status = entities.AMMStatusStopped + statusReason = entities.AMMStatusReasonCancelledByParty + } + pool := entities.AMMPool{ + PartyID: partyID, + MarketID: marketID, + ID: poolID, + AmmPartyID: ammPartyID, + Commitment: num.DecimalFromInt64(100), + Status: status, + StatusReason: statusReason, + ParametersBase: num.DecimalFromInt64(100), + ParametersLowerBound: ptr.From(num.DecimalFromInt64(100)), + ParametersUpperBound: ptr.From(num.DecimalFromInt64(100)), + ParametersLeverageAtLowerBound: ptr.From(num.DecimalFromInt64(100)), + ParametersLeverageAtUpperBound: ptr.From(num.DecimalFromInt64(100)), + CreatedAt: block.VegaTime, + LastUpdated: block.VegaTime, + LowerVirtualLiquidity: num.DecimalOne(), + UpperVirtualLiquidity: num.DecimalOne(), + LowerTheoreticalPosition: num.DecimalOne(), + UpperTheoreticalPosition: num.DecimalOne(), + } + 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].AmmPartyID < pools[j].AmmPartyID) || + (pools[i].CreatedAt == pools[j].CreatedAt && pools[i].PartyID == pools[j].PartyID && pools[i].AmmPartyID == pools[j].AmmPartyID && pools[i].MarketID < pools[j].MarketID) || + (pools[i].CreatedAt == pools[j].CreatedAt && pools[i].PartyID == pools[j].PartyID && pools[i].AmmPartyID == pools[j].AmmPartyID && pools[i].MarketID == pools[j].MarketID && pools[i].ID <= pools[j].ID) + }) + + 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.ID == 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.AmmPartyID == party.AMMPartyID + }) + pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListBySubAccount(ctx, party.AMMPartyID, 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.AmmPartyID == party.AMMPartyID + }) + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListBySubAccount(ctx, party.AMMPartyID, 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.AmmPartyID == party.AMMPartyID + }) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListBySubAccount(ctx, party.AMMPartyID, 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.AmmPartyID == party.AMMPartyID + }) + 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.AMMPartyID, 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.AmmPartyID == party.AMMPartyID + }) + 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.AMMPartyID, 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.AMMStatusActive + }) + pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByStatus(ctx, entities.AMMStatusActive, 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.AMMStatusActive + }) + pagination, err := entities.NewCursorPagination(ptr.From(int32(5)), nil, nil, nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByStatus(ctx, entities.AMMStatusActive, 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.AMMStatusActive + }) + pagination, err := entities.NewCursorPagination(nil, nil, ptr.From(int32(5)), nil, true) + require.NoError(t, err) + listedPools, pageInfo, err := ps.ListByStatus(ctx, entities.AMMStatusActive, 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.AMMStatusActive + }) + 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.AMMStatusActive, 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.AMMStatusActive + }) + 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.AMMStatusActive, 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_ListActive(t *testing.T) { + ctx := tempTransaction(t) + + ps, in, _, _, _ := setupAMMPoolsTest(ctx, t) + var nActive int + for _, p := range in { + if p.Status == entities.AMMStatusActive || p.Status == entities.AMMStatusReduceOnly { + nActive++ + } + } + require.NotEqual(t, 0, nActive) + + out, err := ps.ListActive(ctx) + require.NoError(t, err) + assert.Equal(t, nActive, len(out)) +} diff --git a/datanode/sqlstore/assets.go b/datanode/sqlstore/assets.go index b57e62613fc..270fcc5d976 100644 --- a/datanode/sqlstore/assets.go +++ b/datanode/sqlstore/assets.go @@ -47,7 +47,7 @@ func NewAssets(connectionSource *ConnectionSource) *Assets { func (as *Assets) Add(ctx context.Context, a entities.Asset) error { defer metrics.StartSQLQuery("Assets", "Add")() - _, err := as.Connection.Exec(ctx, + _, err := as.Exec(ctx, `INSERT INTO assets(id, name, symbol, decimals, quantum, source, erc20_contract, lifetime_limit, withdraw_threshold, tx_hash, vega_time, status, chain_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) ON CONFLICT (id, vega_time) DO UPDATE SET @@ -102,7 +102,7 @@ func (as *Assets) GetByID(ctx context.Context, id string) (entities.Asset, error a := entities.Asset{} defer metrics.StartSQLQuery("Assets", "GetByID")() - err := pgxscan.Get(ctx, as.Connection, &a, + err := pgxscan.Get(ctx, as.ConnectionSource, &a, getAssetQuery(ctx)+` WHERE id=$1`, entities.AssetID(id)) @@ -116,7 +116,7 @@ func (as *Assets) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]en defer metrics.StartSQLQuery("Assets", "GetByTxHash")() var assets []entities.Asset - err := pgxscan.Select(ctx, as.Connection, &assets, `SELECT * FROM assets WHERE tx_hash=$1`, txHash) + err := pgxscan.Select(ctx, as.ConnectionSource, &assets, `SELECT * FROM assets WHERE tx_hash=$1`, txHash) if err != nil { return nil, as.wrapE(err) } @@ -127,7 +127,7 @@ func (as *Assets) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]en func (as *Assets) GetAll(ctx context.Context) ([]entities.Asset, error) { assets := []entities.Asset{} defer metrics.StartSQLQuery("Assets", "GetAll")() - err := pgxscan.Select(ctx, as.Connection, &assets, getAssetQuery(ctx)) + err := pgxscan.Select(ctx, as.ConnectionSource, &assets, getAssetQuery(ctx)) return assets, err } @@ -146,7 +146,7 @@ func (as *Assets) GetAllWithCursorPagination(ctx context.Context, pagination ent } defer metrics.StartSQLQuery("Assets", "GetAllWithCursorPagination")() - if err = pgxscan.Select(ctx, as.Connection, &assets, query, args...); err != nil { + if err = pgxscan.Select(ctx, as.ConnectionSource, &assets, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("could not get assets: %w", err) } diff --git a/datanode/sqlstore/assets_test.go b/datanode/sqlstore/assets_test.go index dd6f71123cd..47ee0abde8e 100644 --- a/datanode/sqlstore/assets_test.go +++ b/datanode/sqlstore/assets_test.go @@ -120,7 +120,7 @@ func TestAssetCache(t *testing.T) { require.NoError(t, err) assert.Equal(t, asset2, fetched) - // Commit the transaction and fetch the asset, we should get the asset with the new symbol + // after commit, the new asset should be there already err = connectionSource.Commit(txCtx) require.NoError(t, err) fetched, err = as.GetByID(ctx, string(asset.ID)) diff --git a/datanode/sqlstore/balances.go b/datanode/sqlstore/balances.go index ce198179909..84657aafb0f 100644 --- a/datanode/sqlstore/balances.go +++ b/datanode/sqlstore/balances.go @@ -42,7 +42,7 @@ func NewBalances(connectionSource *ConnectionSource) *Balances { func (bs *Balances) Flush(ctx context.Context) ([]entities.AccountBalance, error) { defer metrics.StartSQLQuery("Balances", "Flush")() - return bs.batcher.Flush(ctx, bs.Connection) + return bs.batcher.Flush(ctx, bs.ConnectionSource) } // Add inserts a row to the balance table. If there's already a balance for this @@ -99,7 +99,7 @@ func (bs *Balances) Query(ctx context.Context, filter entities.AccountFilter, da } defer metrics.StartSQLQuery("Balances", "Query")() - rows, err := bs.Connection.Query(ctx, query, args...) + rows, err := bs.ConnectionSource.Query(ctx, query, args...) if err != nil { return nil, pageInfo, fmt.Errorf("querying balances: %w", err) } diff --git a/datanode/sqlstore/blocks.go b/datanode/sqlstore/blocks.go index 0fcef7065d1..07a074190ef 100644 --- a/datanode/sqlstore/blocks.go +++ b/datanode/sqlstore/blocks.go @@ -50,7 +50,7 @@ func NewBlocks(connectionSource *ConnectionSource) *Blocks { func (bs *Blocks) Add(ctx context.Context, b entities.Block) error { defer metrics.StartSQLQuery("Blocks", "Add")() - _, err := bs.Connection.Exec(ctx, + _, err := bs.Exec(ctx, `insert into blocks(vega_time, height, hash) values ($1, $2, $3)`, b.VegaTime, b.Height, b.Hash) if err != nil { @@ -64,7 +64,7 @@ func (bs *Blocks) Add(ctx context.Context, b entities.Block) error { func (bs *Blocks) GetAll(ctx context.Context) ([]entities.Block, error) { defer metrics.StartSQLQuery("Blocks", "GetAll")() blocks := []entities.Block{} - err := pgxscan.Select(ctx, bs.Connection, &blocks, + err := pgxscan.Select(ctx, bs.ConnectionSource, &blocks, `SELECT vega_time, height, hash FROM blocks ORDER BY vega_time desc`) @@ -72,7 +72,7 @@ func (bs *Blocks) GetAll(ctx context.Context) ([]entities.Block, error) { } func (bs *Blocks) GetAtHeight(ctx context.Context, height int64) (entities.Block, error) { - connection := bs.Connection + connection := bs.ConnectionSource defer metrics.StartSQLQuery("Blocks", "GetAtHeight")() // Check if it's in our cache first @@ -102,7 +102,7 @@ func (bs *Blocks) GetLastBlock(ctx context.Context) (entities.Block, error) { } defer metrics.StartSQLQuery("Blocks", "GetLastBlock")() - lastBlock, err := bs.getLastBlockUsingConnection(ctx, bs.Connection) + lastBlock, err := bs.getLastBlockUsingConnection(ctx, bs.ConnectionSource) // FIXME(woot?): why do we set that before checking for error, that would clearly fuckup the cache or something innit? bs.lastBlock = lastBlock if err != nil { @@ -121,7 +121,7 @@ func (bs *Blocks) setLastBlock(b entities.Block) { func (bs *Blocks) GetOldestHistoryBlock(ctx context.Context) (entities.Block, error) { defer metrics.StartSQLQuery("Blocks", "GetOldestHistoryBlock")() - return bs.getOldestHistoryBlockUsingConnection(ctx, bs.Connection) + return bs.getOldestHistoryBlockUsingConnection(ctx, bs.ConnectionSource) } func (bs *Blocks) getOldestHistoryBlockUsingConnection(ctx context.Context, connection Connection) (entities.Block, error) { diff --git a/datanode/sqlstore/candles.go b/datanode/sqlstore/candles.go index 98beeb5de0f..6791a2de557 100644 --- a/datanode/sqlstore/candles.go +++ b/datanode/sqlstore/candles.go @@ -107,7 +107,7 @@ func (cs *Candles) getCandlesSubquery(ctx context.Context, descriptor candleDesc if from == nil || to == nil { datesQuery := fmt.Sprintf("select min(period_start) as start_date, max(period_start) as end_date from %s where market_id = $1", descriptor.view) marketID := entities.MarketID(descriptor.market) - err := pgxscan.Get(ctx, cs.Connection, &candlesDateRange, datesQuery, marketID) + err := pgxscan.Get(ctx, cs.ConnectionSource, &candlesDateRange, datesQuery, marketID) if err != nil { return "", args, fmt.Errorf("querying candles date range: %w", err) } @@ -195,7 +195,7 @@ func (cs *Candles) GetCandleDataForTimeSpan(ctx context.Context, candleID string query = fmt.Sprintf("with gap_filled_candles as (%s) %s", subQuery, query) defer metrics.StartSQLQuery("Candles", "GetCandleDataForTimeSpan")() - err = pgxscan.Select(ctx, cs.Connection, &candles, query, args...) + err = pgxscan.Select(ctx, cs.ConnectionSource, &candles, query, args...) if err != nil { return nil, pageInfo, fmt.Errorf("querying candles: %w", err) } @@ -244,7 +244,7 @@ func (cs *Candles) getIntervalToView(ctx context.Context) (map[string]string, er query := fmt.Sprintf("SELECT table_name AS view_name FROM INFORMATION_SCHEMA.views WHERE table_name LIKE '%s%%'", candlesViewNamePrePend) defer metrics.StartSQLQuery("Candles", "GetIntervalToView")() - rows, err := cs.Connection.Query(ctx, query) + rows, err := cs.Query(ctx, query) if err != nil { return nil, fmt.Errorf("fetching existing views for interval: %w", err) } @@ -324,13 +324,13 @@ func (cs *Candles) normaliseInterval(ctx context.Context, interval string) (stri var normalizedInterval string defer metrics.StartSQLQuery("Candles", "normaliseInterval")() - _, err := cs.Connection.Exec(ctx, "SET intervalstyle = 'postgres_verbose' ") + _, err := cs.Exec(ctx, "SET intervalstyle = 'postgres_verbose' ") if err != nil { return "", fmt.Errorf("normalising interval, failed to set interval style:%w", err) } query := fmt.Sprintf("select cast( INTERVAL '%s' as text)", interval) - row := cs.Connection.QueryRow(ctx, query) + row := cs.QueryRow(ctx, query) err = row.Scan(&normalizedInterval) if err != nil { @@ -347,7 +347,7 @@ func (cs *Candles) getIntervalSeconds(ctx context.Context, interval string) (int defer metrics.StartSQLQuery("Candles", "getIntervalSeconds")() query := fmt.Sprintf("SELECT EXTRACT(epoch FROM INTERVAL '%s')", interval) - row := cs.Connection.QueryRow(ctx, query) + row := cs.QueryRow(ctx, query) err := row.Scan(&seconds) if err != nil { diff --git a/datanode/sqlstore/chain.go b/datanode/sqlstore/chain.go index 8aa0b7b736b..53366b58848 100644 --- a/datanode/sqlstore/chain.go +++ b/datanode/sqlstore/chain.go @@ -40,13 +40,13 @@ func (c *Chain) Get(ctx context.Context) (entities.Chain, error) { chain := entities.Chain{} query := `SELECT id from chain` - return chain, c.wrapE(pgxscan.Get(ctx, c.Connection, &chain, query)) + return chain, c.wrapE(pgxscan.Get(ctx, c.ConnectionSource, &chain, query)) } func (c *Chain) Set(ctx context.Context, chain entities.Chain) error { defer metrics.StartSQLQuery("Chain", "Set")() query := `INSERT INTO chain(id) VALUES($1)` - _, err := c.Connection.Exec(ctx, query, chain.ID) + _, err := c.Exec(ctx, query, chain.ID) if e, ok := err.(*pgconn.PgError); ok { // 23505 is postgres error code for a unique constraint violation if e.Code == "23505" { diff --git a/datanode/sqlstore/checkpoints.go b/datanode/sqlstore/checkpoints.go index 4ecf31ba907..0d72ad96c70 100644 --- a/datanode/sqlstore/checkpoints.go +++ b/datanode/sqlstore/checkpoints.go @@ -43,7 +43,7 @@ func NewCheckpoints(connectionSource *ConnectionSource) *Checkpoints { func (c *Checkpoints) Add(ctx context.Context, r entities.Checkpoint) error { defer metrics.StartSQLQuery("Checkpoints", "Add")() - _, err := c.Connection.Exec(ctx, + _, err := c.Exec(ctx, `INSERT INTO checkpoints( hash, block_hash, @@ -70,7 +70,7 @@ func (c *Checkpoints) GetAll(ctx context.Context, pagination entities.CursorPagi return nps, pageInfo, err } - if err = pgxscan.Select(ctx, c.Connection, &nps, query, args...); err != nil { + if err = pgxscan.Select(ctx, c.ConnectionSource, &nps, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("could not get checkpoint data: %w", err) } diff --git a/datanode/sqlstore/connection_source.go b/datanode/sqlstore/connection_source.go index ce765826793..8ff00ed8626 100644 --- a/datanode/sqlstore/connection_source.go +++ b/datanode/sqlstore/connection_source.go @@ -18,13 +18,10 @@ package sqlstore import ( "context" "fmt" - "io" "strconv" - "sync" "code.vegaprotocol.io/vega/datanode/entities" "code.vegaprotocol.io/vega/libs/num" - "code.vegaprotocol.io/vega/logging" "github.com/jackc/pgconn" "github.com/jackc/pgtype" @@ -48,39 +45,6 @@ type Connection interface { Exec(ctx context.Context, sql string, arguments ...interface{}) (pgconn.CommandTag, error) } -type copyingConnection interface { - Connection - CopyTo(ctx context.Context, w io.Writer, sql string, args ...any) (pgconn.CommandTag, error) -} - -type ConnectionSource struct { - Connection copyingConnection - pool *pgxpool.Pool - log *logging.Logger - postCommitHooks []func() - mu sync.Mutex -} - -type ( - transactionContextKey struct{} - connectionContextKey struct{} -) - -func NewTransactionalConnectionSource(log *logging.Logger, connConfig ConnectionConfig) (*ConnectionSource, error) { - pool, err := CreateConnectionPool(connConfig) - if err != nil { - return nil, fmt.Errorf("failed to create connection pool: %w", err) - } - - connectionSource := &ConnectionSource{ - log: log.Named("connection-source"), - pool: pool, - Connection: &delegatingConnection{pool: pool}, - } - - return connectionSource, nil -} - func setMaxPoolSize(ctx context.Context, poolConfig *pgxpool.Config, conf ConnectionConfig) error { conn, err := pgx.Connect(ctx, poolConfig.ConnString()) if err != nil { @@ -107,112 +71,6 @@ func setMaxPoolSize(ctx context.Context, poolConfig *pgxpool.Config, conf Connec return nil } -func (s *ConnectionSource) WithConnection(ctx context.Context) (context.Context, error) { - poolConn, err := s.pool.Acquire(ctx) - conn := poolConn.Hijack() - if err != nil { - return context.Background(), errors.Errorf("failed to acquire connection:%s", err) - } - - return context.WithValue(ctx, connectionContextKey{}, conn), nil -} - -func (s *ConnectionSource) WithTransaction(ctx context.Context) (context.Context, error) { - var tx pgx.Tx - var err error - if outerTx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - tx, err = outerTx.Begin(ctx) - } else if conn, ok := ctx.Value(connectionContextKey{}).(*pgx.Conn); ok { - tx, err = conn.Begin(ctx) - } else { - tx, err = s.pool.Begin(ctx) - } - - if err != nil { - return ctx, errors.Errorf("failed to start transaction:%s", err) - } - - return context.WithValue(ctx, transactionContextKey{}, tx), nil -} - -func (s *ConnectionSource) AfterCommit(ctx context.Context, f func()) { - s.mu.Lock() - defer s.mu.Unlock() - - // If we're in a transaction, defer calling f() until Commit() is called - - if _, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - s.postCommitHooks = append(s.postCommitHooks, f) - return - } - - // If we're not in a transaction, call f() immediately - f() -} - -func (s *ConnectionSource) Commit(ctx context.Context) error { - if tx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - if err := tx.Commit(ctx); err != nil { - return fmt.Errorf("failed to commit transaction for context:%s, error:%w", ctx, err) - } - s.mu.Lock() - defer s.mu.Unlock() - for _, f := range s.postCommitHooks { - f() - } - s.postCommitHooks = s.postCommitHooks[:0] - } else { - return fmt.Errorf("no transaction is associated with the context") - } - - return nil -} - -func (s *ConnectionSource) Rollback(ctx context.Context) error { - if tx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - if err := tx.Rollback(ctx); err != nil { - return fmt.Errorf("failed to rollback transaction for context:%s, error:%w", ctx, err) - } - } else { - return fmt.Errorf("no transaction is associated with the context") - } - - return nil -} - -func (s *ConnectionSource) Close() { - s.pool.Close() -} - -func (s *ConnectionSource) RefreshMaterializedViews(ctx context.Context) error { - conn := ctx.Value(connectionContextKey{}).(*pgx.Conn) - materializedViewsToRefresh := []struct { - name string - concurrently bool - }{ - {"game_stats", false}, - {"game_stats_current", false}, - } - - for _, view := range materializedViewsToRefresh { - sql := "REFRESH MATERIALIZED VIEW " - if view.concurrently { - sql += "CONCURRENTLY " - } - sql += view.name - - _, err := conn.Exec(ctx, sql) - if err != nil { - return fmt.Errorf("failed to refresh materialized view %s: %w", view.name, err) - } - } - return nil -} - -func (s *ConnectionSource) wrapE(err error) error { - return wrapE(err) -} - func wrapE(err error) error { switch { case errors.Is(err, pgx.ErrNoRows): @@ -236,102 +94,18 @@ func registerNumericType(poolConfig *pgxpool.Config) { } } -type delegatingConnection struct { - pool *pgxpool.Pool -} - -func (t *delegatingConnection) CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error) { - if tx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - return tx.CopyFrom(ctx, tableName, columnNames, rowSrc) - } - if conn, ok := ctx.Value(connectionContextKey{}).(*pgx.Conn); ok { - return conn.CopyFrom(ctx, tableName, columnNames, rowSrc) - } - return t.pool.CopyFrom(ctx, tableName, columnNames, rowSrc) -} - -func (t *delegatingConnection) SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults { - if tx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - return tx.SendBatch(ctx, b) - } - if conn, ok := ctx.Value(connectionContextKey{}).(*pgx.Conn); ok { - return conn.SendBatch(ctx, b) - } - return t.pool.SendBatch(ctx, b) -} - -func (t *delegatingConnection) Exec(ctx context.Context, sql string, arguments ...interface{}) (commandTag pgconn.CommandTag, err error) { - if tx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - return tx.Exec(ctx, sql, arguments...) - } - if conn, ok := ctx.Value(connectionContextKey{}).(*pgx.Conn); ok { - return conn.Exec(ctx, sql, arguments...) - } - return t.pool.Exec(ctx, sql, arguments...) -} - -func (t *delegatingConnection) Query(ctx context.Context, sql string, args ...interface{}) (pgx.Rows, error) { - if tx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - return tx.Query(ctx, sql, args...) - } - if conn, ok := ctx.Value(connectionContextKey{}).(*pgx.Conn); ok { - return conn.Query(ctx, sql, args...) - } - return t.pool.Query(ctx, sql, args...) -} - -func (t *delegatingConnection) QueryRow(ctx context.Context, sql string, args ...interface{}) pgx.Row { - if tx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - return tx.QueryRow(ctx, sql, args...) - } - if conn, ok := ctx.Value(connectionContextKey{}).(*pgx.Conn); ok { - return conn.QueryRow(ctx, sql, args...) - } - return t.pool.QueryRow(ctx, sql, args...) -} - -func (t *delegatingConnection) QueryFunc(ctx context.Context, sql string, args []interface{}, scans []interface{}, f func(pgx.QueryFuncRow) error) (pgconn.CommandTag, error) { - if tx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - return tx.QueryFunc(ctx, sql, args, scans, f) - } - if conn, ok := ctx.Value(connectionContextKey{}).(*pgx.Conn); ok { - return conn.QueryFunc(ctx, sql, args, scans, f) - } - return t.pool.QueryFunc(ctx, sql, args, scans, f) -} - -func (t *delegatingConnection) CopyTo(ctx context.Context, w io.Writer, sql string, args ...any) (pgconn.CommandTag, error) { - var err error - sql, err = SanitizeSql(sql, args...) - if err != nil { - return nil, fmt.Errorf("failed to sanitize sql: %w", err) - } - if tx, ok := ctx.Value(transactionContextKey{}).(pgx.Tx); ok { - return tx.Conn().PgConn().CopyTo(ctx, w, sql) - } - if conn, ok := ctx.Value(connectionContextKey{}).(*pgx.Conn); ok { - return conn.PgConn().CopyTo(ctx, w, sql) - } - conn, err := t.pool.Acquire(ctx) - if err != nil { - return nil, err - } - defer conn.Release() - return conn.Conn().PgConn().CopyTo(ctx, w, sql) -} - -func CreateConnectionPool(conf ConnectionConfig) (*pgxpool.Pool, error) { +func CreateConnectionPool(ctx context.Context, conf ConnectionConfig) (*pgxpool.Pool, error) { poolConfig, err := conf.GetPoolConfig() if err != nil { return nil, fmt.Errorf("failed to get pool config: %w", err) } - setMaxPoolSize(context.Background(), poolConfig, conf) + setMaxPoolSize(ctx, poolConfig, conf) registerNumericType(poolConfig) poolConfig.MinConns = conf.MinConnPoolSize - pool, err := pgxpool.ConnectConfig(context.Background(), poolConfig) + pool, err := pgxpool.ConnectConfig(ctx, poolConfig) if err != nil { return nil, fmt.Errorf("error connecting to database: %w", err) } diff --git a/datanode/sqlstore/connection_tx.go b/datanode/sqlstore/connection_tx.go new file mode 100644 index 00000000000..e997c4163f3 --- /dev/null +++ b/datanode/sqlstore/connection_tx.go @@ -0,0 +1,337 @@ +// 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" + "io" + "sync" + "sync/atomic" + + "code.vegaprotocol.io/vega/logging" + + "github.com/jackc/pgconn" + "github.com/jackc/pgx/v4" + "github.com/jackc/pgx/v4/pgxpool" + "github.com/pkg/errors" +) + +type ConnectionSource struct { + pool *pgxpool.Pool + log *logging.Logger + isTest bool +} + +type wrappedTx struct { + parent *wrappedTx + mu sync.Mutex + postHooks []func() + id int64 + idgen *atomic.Int64 + tx pgx.Tx + subTx map[int64]*wrappedTx +} + +type ( + txKey struct{} + connKey struct{} +) + +func NewTransactionalConnectionSource(ctx context.Context, log *logging.Logger, connConfig ConnectionConfig) (*ConnectionSource, error) { + pool, err := CreateConnectionPool(ctx, connConfig) + if err != nil { + return nil, fmt.Errorf("failed to create connection pool: %w", err) + } + return &ConnectionSource{ + pool: pool, + log: log.Named("connection-source"), + }, nil +} + +func (c *ConnectionSource) ToggleTest() { + c.isTest = true +} + +func (c *ConnectionSource) WithConnection(ctx context.Context) (context.Context, error) { + poolConn, err := c.pool.Acquire(ctx) + if err != nil { + return context.Background(), errors.Errorf("failed to acquire connection:%s", err) + } + return context.WithValue(ctx, connKey{}, &wrappedConn{ + Conn: poolConn.Hijack(), + }), nil +} + +func (c *ConnectionSource) WithTransaction(ctx context.Context) (context.Context, error) { + var tx pgx.Tx + var err error + nTx := &wrappedTx{ + postHooks: []func(){}, + subTx: map[int64]*wrappedTx{}, + idgen: &atomic.Int64{}, + } + // start id at 0 + nTx.idgen.Store(0) + if ctxTx, ok := ctx.Value(txKey{}).(*wrappedTx); ok { + // register sub-transactions + nTx.id = ctxTx.idgen.Add(1) + tx, err = ctxTx.tx.Begin(ctx) + nTx.parent = ctxTx + if err == nil { + ctxTx.mu.Lock() + ctxTx.subTx[nTx.id] = nTx + ctxTx.mu.Unlock() + } + } else if conn, ok := ctx.Value(connKey{}).(*wrappedConn); ok { + tx, err = conn.Begin(ctx) + } else { + tx, err = c.pool.Begin(ctx) + } + if err != nil { + return ctx, errors.Wrapf(err, "failed to start transaction:%s", err) + } + nTx.tx = tx + return context.WithValue(ctx, txKey{}, nTx), nil +} + +func (c *ConnectionSource) AfterCommit(ctx context.Context, f func()) { + // if the context references an ongoing transaction, append the callback to be invoked on commit + if cTx, ok := ctx.Value(txKey{}).(*wrappedTx); ok { + cTx.mu.Lock() + cTx.postHooks = append(cTx.postHooks, f) + cTx.mu.Unlock() + return + } + // not in transaction, just call immediately. + f() +} + +func (c *ConnectionSource) Rollback(ctx context.Context) error { + // if we're in a transaction, roll it back starting with the sub-transactions. + tx, ok := ctx.Value(txKey{}).(*wrappedTx) + if !ok { + // no tx ongoing + return fmt.Errorf("no transaction is associated with the context") + } + return tx.Rollback(ctx) +} + +func (c *ConnectionSource) Commit(ctx context.Context) error { + tx, ok := ctx.Value(txKey{}).(*wrappedTx) + if !ok { + return fmt.Errorf("no transaction is associated with the context") + } + tx.mu.Lock() + defer tx.mu.Unlock() + post, err := tx.commit(ctx) + if err != nil { + return fmt.Errorf("failed to commit transaction for context: %s, error: %w", ctx, err) + } + // invoke all post-commit hooks once the transaction (and its sub transactions) have been committed + // make an exception for unit tests, so we don't need to commit DB transactions for hooks on the nested transaction. + if !c.isTest && tx.parent != nil { + // this is a nested transaction, don't invoke hooks until the parent is committed + // instead prepend the hooks and return. + tx.parent.mu.Lock() + tx.parent.postHooks = append(post, tx.parent.postHooks...) + // remove the reference to this transaction from its parent + delete(tx.parent.subTx, tx.id) + tx.parent.mu.Unlock() + return nil + } + // this is the main transactions, invoke all hooks now + for _, f := range post { + f() + } + if tx.parent != nil { + tx.parent.mu.Lock() + delete(tx.parent.subTx, tx.id) + tx.parent.mu.Unlock() + } + return nil +} + +func (c *ConnectionSource) Query(ctx context.Context, sql string, args ...any) (pgx.Rows, error) { + // this is nasty, but required for the API tests currently. + if c.isTest && c.pool == nil { + return nil, pgx.ErrNoRows + } + if tx, ok := ctx.Value(txKey{}).(*wrappedTx); ok { + return tx.tx.Query(ctx, sql, args...) + } + if conn, ok := ctx.Value(connKey{}).(*wrappedConn); ok { + return conn.Query(ctx, sql, args...) + } + return c.pool.Query(ctx, sql, args...) +} + +func (c *ConnectionSource) QueryRow(ctx context.Context, sql string, args ...interface{}) pgx.Row { + if tx, ok := ctx.Value(txKey{}).(*wrappedTx); ok { + return tx.tx.QueryRow(ctx, sql, args...) + } + if conn, ok := ctx.Value(connKey{}).(*wrappedConn); ok { + return conn.QueryRow(ctx, sql, args...) + } + return c.pool.QueryRow(ctx, sql, args...) +} + +func (c *ConnectionSource) QueryFunc(ctx context.Context, sql string, args []interface{}, scans []interface{}, f func(pgx.QueryFuncRow) error) (pgconn.CommandTag, error) { + if tx, ok := ctx.Value(txKey{}).(*wrappedTx); ok { + return tx.tx.QueryFunc(ctx, sql, args, scans, f) + } + if conn, ok := ctx.Value(connKey{}).(*wrappedConn); ok { + return conn.QueryFunc(ctx, sql, args, scans, f) + } + return c.pool.QueryFunc(ctx, sql, args, scans, f) +} + +func (c *ConnectionSource) SendBatch(ctx context.Context, b *pgx.Batch) pgx.BatchResults { + if tx, ok := ctx.Value(txKey{}).(*wrappedTx); ok { + return tx.tx.SendBatch(ctx, b) + } + if conn, ok := ctx.Value(connKey{}).(*wrappedConn); ok { + return conn.SendBatch(ctx, b) + } + return c.pool.SendBatch(ctx, b) +} + +func (c *ConnectionSource) CopyFrom(ctx context.Context, tableName pgx.Identifier, columnNames []string, rowSrc pgx.CopyFromSource) (int64, error) { + if tx, ok := ctx.Value(txKey{}).(*wrappedTx); ok { + return tx.tx.CopyFrom(ctx, tableName, columnNames, rowSrc) + } + if conn, ok := ctx.Value(connKey{}).(*wrappedConn); ok { + return conn.CopyFrom(ctx, tableName, columnNames, rowSrc) + } + return c.pool.CopyFrom(ctx, tableName, columnNames, rowSrc) +} + +func (c *ConnectionSource) CopyTo(ctx context.Context, w io.Writer, sql string, args ...any) (pgconn.CommandTag, error) { + // this is nasty, but required for the API tests currently. + if c.isTest && c.pool == nil { + return pgconn.CommandTag{}, nil + } + var err error + sql, err = SanitizeSql(sql, args...) + if err != nil { + return nil, fmt.Errorf("failed to sanitize sql: %w", err) + } + if tx, ok := ctx.Value(txKey{}).(*wrappedTx); ok { + return tx.tx.Conn().PgConn().CopyTo(ctx, w, sql) + } + if conn, ok := ctx.Value(connKey{}).(*wrappedConn); ok { + return conn.PgConn().CopyTo(ctx, w, sql) + } + conn, err := c.pool.Acquire(ctx) + if err != nil { + return nil, err + } + defer conn.Release() + return conn.Conn().PgConn().CopyTo(ctx, w, sql) +} + +func (c *ConnectionSource) Exec(ctx context.Context, sql string, args ...any) (pgconn.CommandTag, error) { + if tx, ok := ctx.Value(txKey{}).(*wrappedTx); ok { + return tx.tx.Exec(ctx, sql, args...) + } + if conn, ok := ctx.Value(connKey{}).(*wrappedConn); ok { + return conn.Exec(ctx, sql, args...) + } + return c.pool.Exec(ctx, sql, args...) +} + +type wrappedConn struct { + *pgx.Conn +} + +func (c *ConnectionSource) RefreshMaterializedViews(ctx context.Context) error { + conn := ctx.Value(connKey{}).(*wrappedConn) + materializedViewsToRefresh := []struct { + name string + concurrently bool + }{ + {"game_stats", false}, + {"game_stats_current", false}, + } + + for _, view := range materializedViewsToRefresh { + sql := "REFRESH MATERIALIZED VIEW " + if view.concurrently { + sql += "CONCURRENTLY " + } + sql += view.name + + _, err := conn.Exec(ctx, sql) + if err != nil { + return fmt.Errorf("failed to refresh materialized view %s: %w", view.name, err) + } + } + return nil +} + +func (c *ConnectionSource) Close() { + c.pool.Close() +} + +func (c *ConnectionSource) wrapE(err error) error { + return wrapE(err) +} + +func (t *wrappedTx) commit(ctx context.Context) ([]func(), error) { + // return callbacks so we only invoke them if no errors occurred + ret := t.postHooks + for id, sTx := range t.subTx { + // acquire the lock, release it as soon as possible + sTx.mu.Lock() + subCB, err := sTx.commit(ctx) + if err != nil { + sTx.mu.Unlock() + return nil, err + } + sTx.mu.Unlock() + delete(t.subTx, id) + // prepend callbacks from sub transactions + ret = append(subCB, ret...) + } + // actually commit this transaction + if err := t.tx.Commit(ctx); err != nil { + return nil, err + } + return ret, nil +} + +func (t *wrappedTx) Rollback(ctx context.Context) error { + for _, sTx := range t.subTx { + if err := sTx.Rollback(ctx); err != nil { + return err + } + } + if err := t.tx.Rollback(ctx); err != nil { + return fmt.Errorf("failed to rollback transaction for context:%s, error:%w", ctx, err) + } + if t.parent != nil { + t.parent.rmSubTx(t.id) + } + return nil +} + +func (t *wrappedTx) rmSubTx(id int64) { + t.mu.Lock() + defer t.mu.Unlock() + // this is called from Rollback, which is recursive already. + // no need to recursively remove the sub-tx + delete(t.subTx, id) +} diff --git a/datanode/sqlstore/delegations.go b/datanode/sqlstore/delegations.go index a3be367c48a..e5523cc0d31 100644 --- a/datanode/sqlstore/delegations.go +++ b/datanode/sqlstore/delegations.go @@ -47,7 +47,7 @@ func NewDelegations(connectionSource *ConnectionSource) *Delegations { func (ds *Delegations) Add(ctx context.Context, d entities.Delegation) error { defer metrics.StartSQLQuery("Delegations", "Add")() - _, err := ds.Connection.Exec(ctx, + _, err := ds.Exec(ctx, `INSERT INTO delegations( party_id, node_id, @@ -64,7 +64,7 @@ func (ds *Delegations) Add(ctx context.Context, d entities.Delegation) error { func (ds *Delegations) GetAll(ctx context.Context) ([]entities.Delegation, error) { defer metrics.StartSQLQuery("Delegations", "GetAll")() delegations := []entities.Delegation{} - err := pgxscan.Select(ctx, ds.Connection, &delegations, ` + err := pgxscan.Select(ctx, ds.ConnectionSource, &delegations, ` SELECT * from delegations;`) return delegations, err } @@ -75,7 +75,7 @@ func (ds *Delegations) GetByTxHash(ctx context.Context, txHash entities.TxHash) var delegations []entities.Delegation query := `SELECT * FROM delegations WHERE tx_hash = $1` - err := pgxscan.Select(ctx, ds.Connection, &delegations, query, txHash) + err := pgxscan.Select(ctx, ds.ConnectionSource, &delegations, query, txHash) if err != nil { return nil, err } @@ -124,7 +124,7 @@ func (ds *Delegations) Get(ctx context.Context, return nil, pageInfo, err } - err := pgxscan.Select(ctx, ds.Connection, &delegations, query, args...) + err := pgxscan.Select(ctx, ds.ConnectionSource, &delegations, query, args...) if err != nil { return nil, pageInfo, fmt.Errorf("querying delegations: %w", err) } @@ -137,7 +137,7 @@ func (ds *Delegations) Get(ctx context.Context, } } - err = pgxscan.Select(ctx, ds.Connection, &delegations, query, args...) + err = pgxscan.Select(ctx, ds.ConnectionSource, &delegations, query, args...) if err != nil { return nil, pageInfo, fmt.Errorf("querying delegations: %w", err) } diff --git a/datanode/sqlstore/deposits.go b/datanode/sqlstore/deposits.go index 9c01e9c3475..a20da8b3297 100644 --- a/datanode/sqlstore/deposits.go +++ b/datanode/sqlstore/deposits.go @@ -62,7 +62,7 @@ set tx_hash=EXCLUDED.tx_hash`, sqlDepositsColumns) defer metrics.StartSQLQuery("Deposits", "Upsert")() - if _, err := d.Connection.Exec(ctx, query, deposit.ID, deposit.Status, deposit.PartyID, deposit.Asset, deposit.Amount, + if _, err := d.Exec(ctx, query, deposit.ID, deposit.Status, deposit.PartyID, deposit.Asset, deposit.Amount, deposit.ForeignTxHash, deposit.CreditedTimestamp, deposit.CreatedTimestamp, deposit.TxHash, deposit.VegaTime); err != nil { err = fmt.Errorf("could not insert deposit into database: %w", err) return err @@ -81,7 +81,7 @@ func (d *Deposits) GetByID(ctx context.Context, depositID string) (entities.Depo defer metrics.StartSQLQuery("Deposits", "GetByID")() return deposit, d.wrapE(pgxscan.Get( - ctx, d.Connection, &deposit, query, entities.DepositID(depositID))) + ctx, d.ConnectionSource, &deposit, query, entities.DepositID(depositID))) } func (d *Deposits) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]entities.Deposit, error) { @@ -90,7 +90,7 @@ func (d *Deposits) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]e var deposits []entities.Deposit query := fmt.Sprintf(`SELECT %s FROM deposits WHERE tx_hash = $1`, sqlDepositsColumns) - err := pgxscan.Select(ctx, d.Connection, &deposits, query, txHash) + err := pgxscan.Select(ctx, d.ConnectionSource, &deposits, query, txHash) if err != nil { return nil, d.wrapE(err) } @@ -126,7 +126,7 @@ func (d *Deposits) getByPartyCursorPagination(ctx context.Context, party string, } defer metrics.StartSQLQuery("Deposits", "GetByParty")() - if err = pgxscan.Select(ctx, d.Connection, &deposits, query, args...); err != nil { + if err = pgxscan.Select(ctx, d.ConnectionSource, &deposits, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("could not get deposits by party: %w", err) } diff --git a/datanode/sqlstore/deposits_test.go b/datanode/sqlstore/deposits_test.go index 4e99fb2deea..317d94acf4b 100644 --- a/datanode/sqlstore/deposits_test.go +++ b/datanode/sqlstore/deposits_test.go @@ -76,7 +76,7 @@ func setupDepositStoreTests(t *testing.T) (*sqlstore.Blocks, *sqlstore.Deposits, t.Helper() bs := sqlstore.NewBlocks(connectionSource) ds := sqlstore.NewDeposits(connectionSource) - return bs, ds, connectionSource.Connection + return bs, ds, connectionSource } func testAddDepositForNewBlock(t *testing.T) { diff --git a/datanode/sqlstore/epochs.go b/datanode/sqlstore/epochs.go index 11c7422c8ab..6ead11a0a11 100644 --- a/datanode/sqlstore/epochs.go +++ b/datanode/sqlstore/epochs.go @@ -37,7 +37,7 @@ func NewEpochs(connectionSource *ConnectionSource) *Epochs { func (es *Epochs) Add(ctx context.Context, r entities.Epoch) error { defer metrics.StartSQLQuery("Epochs", "Add")() - _, err := es.Connection.Exec(ctx, + _, err := es.Exec(ctx, `INSERT INTO epochs( id, start_time, @@ -60,7 +60,7 @@ func (es *Epochs) GetAll(ctx context.Context) ([]entities.Epoch, error) { defer metrics.StartSQLQuery("Epochs", "GetAll")() epochs := []entities.Epoch{} query := `SELECT * FROM current_epochs order by id, vega_time desc;` - err := pgxscan.Select(ctx, es.Connection, &epochs, query) + err := pgxscan.Select(ctx, es.ConnectionSource, &epochs, query) return epochs, err } @@ -69,7 +69,7 @@ func (es *Epochs) Get(ctx context.Context, ID uint64) (entities.Epoch, error) { query := `SELECT * FROM current_epochs WHERE id = $1;` epoch := entities.Epoch{} - return epoch, es.wrapE(pgxscan.Get(ctx, es.Connection, &epoch, query, ID)) + return epoch, es.wrapE(pgxscan.Get(ctx, es.ConnectionSource, &epoch, query, ID)) } func (es *Epochs) GetByBlock(ctx context.Context, height uint64) (entities.Epoch, error) { @@ -77,7 +77,7 @@ func (es *Epochs) GetByBlock(ctx context.Context, height uint64) (entities.Epoch query := `SELECT * FROM current_epochs WHERE first_block <= $1 AND (last_block > $1 or last_block is NULL) ORDER BY id, vega_time desc;` epoch := entities.Epoch{} - return epoch, es.wrapE(pgxscan.Get(ctx, es.Connection, &epoch, query, height)) + return epoch, es.wrapE(pgxscan.Get(ctx, es.ConnectionSource, &epoch, query, height)) } func (es *Epochs) GetCurrent(ctx context.Context) (entities.Epoch, error) { @@ -85,5 +85,5 @@ func (es *Epochs) GetCurrent(ctx context.Context) (entities.Epoch, error) { epoch := entities.Epoch{} defer metrics.StartSQLQuery("Epochs", "GetCurrent")() - return epoch, es.wrapE(pgxscan.Get(ctx, es.Connection, &epoch, query)) + return epoch, es.wrapE(pgxscan.Get(ctx, es.ConnectionSource, &epoch, query)) } diff --git a/datanode/sqlstore/erc20_multisig_added_test.go b/datanode/sqlstore/erc20_multisig_added_test.go index 41afba8c708..fc9d330fa1e 100644 --- a/datanode/sqlstore/erc20_multisig_added_test.go +++ b/datanode/sqlstore/erc20_multisig_added_test.go @@ -40,7 +40,7 @@ func TestERC20MultiSigEvent(t *testing.T) { func setupERC20MultiSigEventStoreTests(t *testing.T) (*sqlstore.ERC20MultiSigSignerEvent, sqlstore.Connection) { t.Helper() ms := sqlstore.NewERC20MultiSigSignerEvent(connectionSource) - return ms, connectionSource.Connection + return ms, connectionSource } func testAddSigner(t *testing.T) { diff --git a/datanode/sqlstore/erc20_multisig_event.go b/datanode/sqlstore/erc20_multisig_event.go index 24045786555..ae4a7b62e4a 100644 --- a/datanode/sqlstore/erc20_multisig_event.go +++ b/datanode/sqlstore/erc20_multisig_event.go @@ -48,7 +48,7 @@ func (m *ERC20MultiSigSignerEvent) Add(ctx context.Context, e *entities.ERC20Mul VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) ON CONFLICT (id) DO NOTHING` - if _, err := m.Connection.Exec(ctx, query, + if _, err := m.Exec(ctx, query, e.ID, e.ValidatorID, e.SignerChange, @@ -105,7 +105,7 @@ func (m *ERC20MultiSigSignerEvent) GetAddedEvents(ctx context.Context, validator } defer metrics.StartSQLQuery("ERC20MultiSigSignerEvent", "GetAddedEvents")() - if err = pgxscan.Select(ctx, m.Connection, &out, query, args...); err != nil { + if err = pgxscan.Select(ctx, m.ConnectionSource, &out, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("failed to retrieve multisig signer events: %w", err) } @@ -165,7 +165,7 @@ func (m *ERC20MultiSigSignerEvent) GetRemovedEvents(ctx context.Context, validat } defer metrics.StartSQLQuery("ERC20MultiSigSignerEvent", "GetRemovedEvents")() - if err = pgxscan.Select(ctx, m.Connection, &out, query, args...); err != nil { + if err = pgxscan.Select(ctx, m.ConnectionSource, &out, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("failed to retrieve multisig signer events: %w", err) } @@ -195,7 +195,7 @@ func (m *ERC20MultiSigSignerEvent) GetRemovedByTxHash(ctx context.Context, txHas var events []entities.ERC20MultiSigSignerRemovedEvent query := `SELECT * FROM erc20_multisig_signer_events WHERE event=$1 AND tx_hash = $2` - if err := pgxscan.Select(ctx, m.Connection, &events, query, entities.ERC20MultiSigSignerEventTypeRemoved, txHash); err != nil { + if err := pgxscan.Select(ctx, m.ConnectionSource, &events, query, entities.ERC20MultiSigSignerEventTypeRemoved, txHash); err != nil { return nil, fmt.Errorf("failed to retrieve multisig removed signer events: %w", err) } @@ -208,7 +208,7 @@ func (m *ERC20MultiSigSignerEvent) GetAddedByTxHash(ctx context.Context, txHash var events []entities.ERC20MultiSigSignerAddedEvent query := `SELECT * FROM erc20_multisig_signer_events WHERE event=$1 AND tx_hash = $2` - if err := pgxscan.Select(ctx, m.Connection, &events, query, entities.ERC20MultiSigSignerEventTypeAdded, txHash); err != nil { + if err := pgxscan.Select(ctx, m.ConnectionSource, &events, query, entities.ERC20MultiSigSignerEventTypeAdded, txHash); err != nil { return nil, fmt.Errorf("failed to retrieve multisig added signer events: %w", err) } diff --git a/datanode/sqlstore/ethereum_key_rotations.go b/datanode/sqlstore/ethereum_key_rotations.go index 73368263b65..83ebdba043e 100644 --- a/datanode/sqlstore/ethereum_key_rotations.go +++ b/datanode/sqlstore/ethereum_key_rotations.go @@ -44,7 +44,7 @@ func NewEthereumKeyRotations(connectionSource *ConnectionSource) *EthereumKeyRot func (store *EthereumKeyRotations) Add(ctx context.Context, kr entities.EthereumKeyRotation) error { defer metrics.StartSQLQuery("EthereumKeyRotations", "Add")() - _, err := store.Connection.Exec(ctx, ` + _, err := store.Exec(ctx, ` INSERT INTO ethereum_key_rotations(node_id, old_address, new_address, block_height, tx_hash, vega_time, seq_num) VALUES ($1, $2, $3, $4, $5, $6, $7) `, kr.NodeID, kr.OldAddress, kr.NewAddress, kr.BlockHeight, kr.TxHash, kr.VegaTime, kr.SeqNum) @@ -75,7 +75,7 @@ func (store *EthereumKeyRotations) List(ctx context.Context, ethereumKeyRotations := []entities.EthereumKeyRotation{} - if err = pgxscan.Select(ctx, store.Connection, ðereumKeyRotations, query, args...); err != nil { + if err = pgxscan.Select(ctx, store.ConnectionSource, ðereumKeyRotations, query, args...); err != nil { return nil, entities.PageInfo{}, err } @@ -92,7 +92,7 @@ func (store *EthereumKeyRotations) GetByTxHash( var ethereumKeyRotations []entities.EthereumKeyRotation query := `SELECT * FROM ethereum_key_rotations WHERE tx_hash = $1` - if err := pgxscan.Select(ctx, store.Connection, ðereumKeyRotations, query, txHash); err != nil { + if err := pgxscan.Select(ctx, store.ConnectionSource, ðereumKeyRotations, query, txHash); err != nil { return nil, err } diff --git a/datanode/sqlstore/fees_stats.go b/datanode/sqlstore/fees_stats.go index d166faca935..5cf3cf08475 100644 --- a/datanode/sqlstore/fees_stats.go +++ b/datanode/sqlstore/fees_stats.go @@ -56,12 +56,7 @@ func NewFeesStats(src *ConnectionSource) *FeesStats { func (rfs *FeesStats) AddFeesStats(ctx context.Context, stats *entities.FeesStats) error { defer metrics.StartSQLQuery("FeesStats", "AddFeesStats")() - ctx, err := rfs.WithTransaction(ctx) - if err != nil { - return fmt.Errorf("could not initialise transaction: %w", err) - } - - if _, err := rfs.Connection.Exec( + if _, err := rfs.Exec( ctx, `INSERT INTO fees_stats( market_id, @@ -86,24 +81,16 @@ func (rfs *FeesStats) AddFeesStats(ctx context.Context, stats *entities.FeesStat stats.MakerFeesGenerated, stats.VegaTime, ); err != nil { - _ = rfs.Rollback(ctx) return fmt.Errorf("could not execute insertion in `fees_stats`: %w", err) } - partiesStats := computePartiesStats(stats) - batcher := NewListBatcher[*feesStatsForPartyRow]("fees_stats_by_party", feesStatsByPartyColumn) + partiesStats := computePartiesStats(stats) for _, s := range partiesStats { batcher.Add(s) } - - if _, err := batcher.Flush(ctx, rfs.Connection); err != nil { - _ = rfs.Rollback(ctx) - return fmt.Errorf("could not flush the batch insertion in `fees_stats_by_party`: %w", err) - } - - if err := rfs.Commit(ctx); err != nil { - return fmt.Errorf("an error occurred during transactions commit: %w", err) + if _, err := batcher.Flush(ctx, rfs.ConnectionSource); err != nil { + return err } return nil @@ -143,7 +130,7 @@ func (rfs *FeesStats) StatsForParty(ctx context.Context, partyID entities.PartyI ) var rows []feesStatsForPartyRow - if err := pgxscan.Select(ctx, rfs.Connection, &rows, query, args...); err != nil { + if err := pgxscan.Select(ctx, rfs.ConnectionSource, &rows, query, args...); err != nil { return nil, err } @@ -161,7 +148,7 @@ func (rfs *FeesStats) StatsForParty(ctx context.Context, partyID entities.PartyI return stats, nil } -func (rfs *FeesStats) GetFeesStats(ctx context.Context, marketID *entities.MarketID, assetID *entities.AssetID, epochSeq *uint64, partyID *string) (*entities.FeesStats, error) { +func (rfs *FeesStats) GetFeesStats(ctx context.Context, marketID *entities.MarketID, assetID *entities.AssetID, epochSeq *uint64, partyID *string, epochFrom, epochTo *uint64) (*entities.FeesStats, error) { defer metrics.StartSQLQuery("FeesStats", "GetFeesStats")() var ( stats []entities.FeesStats @@ -188,7 +175,19 @@ func (rfs *FeesStats) GetFeesStats(ctx context.Context, marketID *entities.Marke where = append(where, fmt.Sprintf("market_id = %s", nextBindVar(&args, *marketID))) } - if epochSeq == nil { // we want the most recent stat so order and limit the query + if epochFrom != nil && epochTo != nil && *epochFrom > *epochTo { + epochFrom, epochTo = epochTo, epochFrom + } + if epochFrom != nil { + where = append(where, fmt.Sprintf("epoch_seq >= %s", nextBindVar(&args, *epochFrom))) + epochSeq = nil + } + if epochTo != nil { + where = append(where, fmt.Sprintf("epoch_seq <= %s", nextBindVar(&args, *epochTo))) + epochSeq = nil + } + + if epochSeq == nil && epochFrom == nil && epochTo == nil { // we want the most recent stat so order and limit the query where = append(where, "epoch_seq = (SELECT MAX(epoch_seq) FROM fees_stats)") } @@ -202,7 +201,7 @@ func (rfs *FeesStats) GetFeesStats(ctx context.Context, marketID *entities.Marke query = fmt.Sprintf("%s order by market_id, asset_id, epoch_seq desc", query) - if err = pgxscan.Select(ctx, rfs.Connection, &stats, query, args...); err != nil { + if err = pgxscan.Select(ctx, rfs.ConnectionSource, &stats, query, args...); err != nil { return nil, err } diff --git a/datanode/sqlstore/fees_stats_test.go b/datanode/sqlstore/fees_stats_test.go index aa029c20050..9f9f6a0b718 100644 --- a/datanode/sqlstore/fees_stats_test.go +++ b/datanode/sqlstore/fees_stats_test.go @@ -84,7 +84,7 @@ func testAddFeesStatsEpochNotExists(t *testing.T) { // Check that the stats were added var got entities.FeesStats - err = pgxscan.Get(ctx, connectionSource.Connection, &got, + err = pgxscan.Get(ctx, connectionSource, &got, `SELECT * FROM fees_stats WHERE market_id = $1 AND asset_id = $2 AND epoch_seq = $3`, market.ID, asset.ID, want.EpochSeq, ) @@ -137,13 +137,13 @@ func testGetFeesStatsForMarketAndEpoch(t *testing.T) { // get the stats for the first market and epoch want := stats[0] - got, err := stores.fs.GetFeesStats(ctx, &want.MarketID, nil, &want.EpochSeq, nil) + got, err := stores.fs.GetFeesStats(ctx, &want.MarketID, nil, &want.EpochSeq, nil, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) // get the stats for the second market and epoch want = stats[3] - got, err = stores.fs.GetFeesStats(ctx, &want.MarketID, nil, &want.EpochSeq, nil) + got, err = stores.fs.GetFeesStats(ctx, &want.MarketID, nil, &want.EpochSeq, nil, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) } @@ -155,13 +155,13 @@ func testGetFeesStatsForAssetAndEpoch(t *testing.T) { // get the stats for the first market and epoch want := stats[0] - got, err := stores.fs.GetFeesStats(ctx, nil, &want.AssetID, &want.EpochSeq, nil) + got, err := stores.fs.GetFeesStats(ctx, nil, &want.AssetID, &want.EpochSeq, nil, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) // get the stats for the second market and epoch want = stats[6] - got, err = stores.fs.GetFeesStats(ctx, nil, &want.AssetID, &want.EpochSeq, nil) + got, err = stores.fs.GetFeesStats(ctx, nil, &want.AssetID, &want.EpochSeq, nil, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) } @@ -173,13 +173,13 @@ func testGetFeesStatsForMarketLatest(t *testing.T) { // get the stats for the first market and epoch want := stats[2] - got, err := stores.fs.GetFeesStats(ctx, &want.MarketID, nil, nil, nil) + got, err := stores.fs.GetFeesStats(ctx, &want.MarketID, nil, nil, nil, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) // get the stats for the second market and epoch want = stats[8] - got, err = stores.fs.GetFeesStats(ctx, &want.MarketID, nil, nil, nil) + got, err = stores.fs.GetFeesStats(ctx, &want.MarketID, nil, nil, nil, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) } @@ -191,13 +191,13 @@ func testGetFeesStatsForAssetLatest(t *testing.T) { // get the stats for the first market and epoch want := stats[2] - got, err := stores.fs.GetFeesStats(ctx, nil, &want.AssetID, nil, nil) + got, err := stores.fs.GetFeesStats(ctx, nil, &want.AssetID, nil, nil, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) // get the stats for the second market and epoch want = stats[8] - got, err = stores.fs.GetFeesStats(ctx, nil, &want.AssetID, nil, nil) + got, err = stores.fs.GetFeesStats(ctx, nil, &want.AssetID, nil, nil, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) } @@ -206,7 +206,7 @@ func testGetFeesStatsNoAssetOrMarket(t *testing.T) { stores := setupFeesStatsStores(t) ctx := tempTransaction(t) - _, err := stores.fs.GetFeesStats(ctx, ptr.From(entities.MarketID("deadbeef01")), ptr.From(entities.AssetID("deadbeef02")), nil, nil) + _, err := stores.fs.GetFeesStats(ctx, ptr.From(entities.MarketID("deadbeef01")), ptr.From(entities.AssetID("deadbeef02")), nil, nil, nil, nil) require.Error(t, err) } @@ -249,7 +249,7 @@ func testGetFeesStatsForPartyAndEpoch(t *testing.T) { VegaTime: expected.VegaTime, } - got, err := stores.fs.GetFeesStats(ctx, nil, &want.AssetID, ptr.From(want.EpochSeq), &want.ReferrerRewardsGenerated[0].Referrer) + got, err := stores.fs.GetFeesStats(ctx, nil, &want.AssetID, ptr.From(want.EpochSeq), &want.ReferrerRewardsGenerated[0].Referrer, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) } @@ -292,7 +292,7 @@ func testGetFeesStatsForPartyLatest(t *testing.T) { MakerFeesGenerated: []*eventspb.MakerFeesGenerated{}, VegaTime: expected.VegaTime, } - got, err := stores.fs.GetFeesStats(ctx, nil, &want.AssetID, nil, &want.ReferrerRewardsGenerated[0].Referrer) + got, err := stores.fs.GetFeesStats(ctx, nil, &want.AssetID, nil, &want.ReferrerRewardsGenerated[0].Referrer, nil, nil) require.NoError(t, err) assert.Equal(t, want, *got) } diff --git a/datanode/sqlstore/funding_payments.go b/datanode/sqlstore/funding_payments.go index df00ea8c3f6..8623d577cd1 100644 --- a/datanode/sqlstore/funding_payments.go +++ b/datanode/sqlstore/funding_payments.go @@ -50,7 +50,7 @@ func (fp *FundingPayments) Add( defer metrics.StartSQLQuery("FundingPayments", "Add")() for _, v := range fundingPayments { - _, err := fp.Connection.Exec(ctx, + _, err := fp.Exec(ctx, `insert into funding_payment(market_id, party_id, funding_period_seq, amount, vega_time, tx_hash) values ($1, $2, $3, $4, $5, $6)`, v.MarketID, v.PartyID, v.FundingPeriodSeq, v.Amount, v.VegaTime, v.TxHash) @@ -85,7 +85,7 @@ func (fp *FundingPayments) List( return fundingPayments, pageInfo, err } - err = pgxscan.Select(ctx, fp.Connection, &fundingPayments, query, args...) + err = pgxscan.Select(ctx, fp.ConnectionSource, &fundingPayments, query, args...) if err != nil { return fundingPayments, pageInfo, err } diff --git a/datanode/sqlstore/funding_period.go b/datanode/sqlstore/funding_period.go index 235d1bdc06d..edd44a65e9d 100644 --- a/datanode/sqlstore/funding_period.go +++ b/datanode/sqlstore/funding_period.go @@ -51,7 +51,7 @@ func NewFundingPeriods(connectionSource *ConnectionSource) *FundingPeriods { func (fp *FundingPeriods) AddFundingPeriod(ctx context.Context, period *entities.FundingPeriod) error { defer metrics.StartSQLQuery("FundingPeriods", "AddFundingPeriod")() - _, err := fp.Connection.Exec(ctx, + _, err := fp.Exec(ctx, `insert into funding_period(market_id, funding_period_seq, start_time, end_time, funding_payment, funding_rate, external_twap, internal_twap, vega_time, tx_hash) values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) on conflict (market_id, funding_period_seq) do update @@ -71,7 +71,7 @@ values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) on conflict (market_id, funding func (fp *FundingPeriods) AddDataPoint(ctx context.Context, dataPoint *entities.FundingPeriodDataPoint) error { defer metrics.StartSQLQuery("FundingPeriodDataPoint", "AddDataPoint")() - _, err := fp.Connection.Exec(ctx, + _, err := fp.Exec(ctx, `insert into funding_period_data_points(market_id, funding_period_seq, data_point_type, price, timestamp, twap, vega_time, tx_hash) values ($1, $2, $3, $4, $5, $6, $7, $8) on conflict (market_id, funding_period_seq, data_point_type, vega_time) do update set price = EXCLUDED.price, twap = EXCLUDED.twap, timestamp = EXCLUDED.timestamp, tx_hash = EXCLUDED.tx_hash`, @@ -103,7 +103,7 @@ func (fp *FundingPeriods) ListFundingPeriods(ctx context.Context, marketID entit return periods, pageInfo, err } - err = pgxscan.Select(ctx, fp.Connection, &periods, query, args...) + err = pgxscan.Select(ctx, fp.ConnectionSource, &periods, query, args...) if err != nil { return periods, pageInfo, err } @@ -142,7 +142,7 @@ func (fp *FundingPeriods) ListFundingPeriodDataPoints(ctx context.Context, marke return dataPoints, pageInfo, err } - err = pgxscan.Select(ctx, fp.Connection, &dataPoints, query, args...) + err = pgxscan.Select(ctx, fp.ConnectionSource, &dataPoints, query, args...) if err != nil { return dataPoints, pageInfo, err } diff --git a/datanode/sqlstore/funding_period_test.go b/datanode/sqlstore/funding_period_test.go index 45d55ba8926..c0db1f388cc 100644 --- a/datanode/sqlstore/funding_period_test.go +++ b/datanode/sqlstore/funding_period_test.go @@ -124,7 +124,7 @@ func testAddFundingPeriodShouldUpdateIfMarketExistsAndSequenceExists(t *testing. require.NoError(t, err) var dbResult entities.FundingPeriod - err = pgxscan.Get(ctx, stores.fp.Connection, &dbResult, `select * from funding_period where market_id = $1 and funding_period_seq = $2`, stores.markets[0].ID, 1) + err = pgxscan.Get(ctx, stores.fp, &dbResult, `select * from funding_period where market_id = $1 and funding_period_seq = $2`, stores.markets[0].ID, 1) require.NoError(t, err) assert.Equal(t, period, dbResult) @@ -139,7 +139,7 @@ func testAddFundingPeriodShouldUpdateIfMarketExistsAndSequenceExists(t *testing. err = stores.fp.AddFundingPeriod(ctx, &period) require.NoError(t, err) - err = pgxscan.Get(ctx, stores.fp.Connection, &dbResult, `select * from funding_period where market_id = $1 and funding_period_seq = $2`, stores.markets[0].ID, 1) + err = pgxscan.Get(ctx, stores.fp, &dbResult, `select * from funding_period where market_id = $1 and funding_period_seq = $2`, stores.markets[0].ID, 1) require.NoError(t, err) assert.Equal(t, period, dbResult) } @@ -241,7 +241,7 @@ func testShouldUpdateDataPointInSameBlock(t *testing.T) { require.NoError(t, err) var inserted []entities.FundingPeriodDataPoint - err = pgxscan.Select(ctx, connectionSource.Connection, &inserted, + err = pgxscan.Select(ctx, connectionSource, &inserted, `SELECT * FROM funding_period_data_points where market_id = $1 and funding_period_seq = $2 and data_point_type = $3 and vega_time = $4`, stores.markets[0].ID, 1, entities.FundingPeriodDataPointSourceExternal, stores.blocks[4].VegaTime) require.NoError(t, err) @@ -262,7 +262,7 @@ func testShouldUpdateDataPointInSameBlock(t *testing.T) { err = stores.fp.AddDataPoint(ctx, &dp2) require.NoError(t, err) - err = pgxscan.Select(ctx, connectionSource.Connection, &inserted, + err = pgxscan.Select(ctx, connectionSource, &inserted, `SELECT * FROM funding_period_data_points where market_id = $1 and funding_period_seq = $2 and data_point_type = $3 and vega_time = $4`, stores.markets[0].ID, 1, entities.FundingPeriodDataPointSourceExternal, stores.blocks[4].VegaTime) require.NoError(t, err) @@ -799,7 +799,7 @@ func TestFundingPeriodDataPointSource(t *testing.T) { } require.NoError(t, stores.fp.AddDataPoint(ctx, &dp)) got := entities.FundingPeriodDataPoint{} - require.NoError(t, pgxscan.Get(ctx, stores.fp.Connection, &got, + require.NoError(t, pgxscan.Get(ctx, stores.fp, &got, `select * from funding_period_data_points where market_id = $1 and funding_period_seq = $2 and data_point_type = $3`, dp.MarketID, dp.FundingPeriodSeq, dp.DataPointType), ) diff --git a/datanode/sqlstore/game_scores.go b/datanode/sqlstore/game_scores.go new file mode 100644 index 00000000000..559fcd419a5 --- /dev/null +++ b/datanode/sqlstore/game_scores.go @@ -0,0 +1,352 @@ +// 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" + "encoding/hex" + "fmt" + "strings" + "time" + + "code.vegaprotocol.io/vega/datanode/entities" + "code.vegaprotocol.io/vega/datanode/metrics" + "code.vegaprotocol.io/vega/libs/ptr" + v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2" + + "github.com/georgysavva/scany/pgxscan" + "github.com/shopspring/decimal" +) + +type GameScores struct { + *ConnectionSource +} + +var gamesTeamOrderding = TableOrdering{ + ColumnOrdering{Name: "game_id", Sorting: ASC}, + ColumnOrdering{Name: "epoch_id", Sorting: DESC}, + ColumnOrdering{Name: "team_id", Sorting: ASC}, +} + +var gamesPartyOrderding = TableOrdering{ + ColumnOrdering{Name: "game_id", Sorting: ASC}, + ColumnOrdering{Name: "epoch_id", Sorting: DESC}, + ColumnOrdering{Name: "party_id", Sorting: ASC}, +} + +func NewGameScores(connectionSource *ConnectionSource) *GameScores { + r := &GameScores{ + ConnectionSource: connectionSource, + } + return r +} + +func (gs *GameScores) AddPartyScore(ctx context.Context, r entities.GamePartyScore) error { + defer metrics.StartSQLQuery("GameScores", "AddPartyScores")() + _, err := gs.Exec(ctx, + `INSERT INTO game_party_scores( + game_id, + team_id, + epoch_id, + party_id, + score, + staking_balance, + open_volume, + total_fees_paid, + is_eligible, + rank, + vega_time + ) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11);`, + r.GameID, r.TeamID, r.EpochID, r.PartyID, r.Score, r.StakingBalance, r.OpenVolume, r.TotalFeesPaid, r.IsEligible, + r.Rank, r.VegaTime) + return err +} + +func (gs *GameScores) AddTeamScore(ctx context.Context, r entities.GameTeamScore) error { + defer metrics.StartSQLQuery("GameScores", "AddPartyScores")() + _, err := gs.Exec(ctx, + `INSERT INTO game_team_scores( + game_id, + team_id, + epoch_id, + score, + vega_time + ) + VALUES ($1, $2, $3, $4, $5);`, + r.GameID, r.TeamID, r.EpochID, r.Score, r.VegaTime) + return err +} + +// scany does not like deserializing byte arrays to strings so if an ID +// needs to be nillable, we need to scan it into a temporary struct that will +// define the ID field as a byte array and then parse the value accordingly. +type scannedPartyGameScore struct { + GameID entities.GameID + TeamID []byte + EpochID int64 + PartyID entities.PartyID + Score decimal.Decimal + StakingBalance decimal.Decimal + OpenVolume decimal.Decimal + TotalFeesPaid decimal.Decimal + IsEligible bool + Rank *uint64 + VegaTime time.Time + TxHash entities.TxHash + SeqNum uint64 +} + +func (gs *GameScores) ListPartyScores( + ctx context.Context, + gameIDs []entities.GameID, + partyIDs []entities.PartyID, + teamIDs []entities.TeamID, + epochFromID *uint64, + epochToID *uint64, + pagination entities.CursorPagination, +) ([]entities.GamePartyScore, entities.PageInfo, error) { + var pageInfo entities.PageInfo + where, args, err := filterPartyQuery(gameIDs, partyIDs, teamIDs, epochFromID, epochToID) + if err != nil { + return nil, pageInfo, err + } + + query := `SELECT t1.* FROM game_party_scores_current t1` + if epochFromID != nil || epochToID != nil { + var epochWhere string + if epochFromID != nil && epochToID == nil { + epochWhere = fmt.Sprintf("epoch_id >= %d", *epochFromID) + } else if epochFromID == nil && epochToID != nil { + epochWhere = fmt.Sprintf("epoch_id <= %d", *epochToID) + } else { + epochWhere = fmt.Sprintf("epoch_id >= %d and epoch_id <= %d", *epochFromID, *epochToID) + } + query = `SELECT t1.* FROM game_party_scores t1 + JOIN ( + SELECT + party_id, + epoch_id, + MAX(vega_time) AS latest_time + FROM + game_party_scores + WHERE ` + epochWhere + ` + GROUP BY + party_id, + epoch_id + ) t2 ON t1.party_id = t2.party_id AND t1.epoch_id = t2.epoch_id AND t1.vega_time = t2.latest_time + ` + } + query = fmt.Sprintf("%s %s", query, where) + query, args, err = PaginateQuery[entities.PartyGameScoreCursor](query, args, gamesPartyOrderding, pagination) + if err != nil { + return nil, pageInfo, err + } + + sPgs := []scannedPartyGameScore{} + defer metrics.StartSQLQuery("GameScores", "ListPartyScores")() + + if err = pgxscan.Select(ctx, gs.ConnectionSource, &sPgs, query, args...); err != nil { + return nil, pageInfo, fmt.Errorf("querying game party scores: %w", err) + } + + pgs := parseScannedPartyGameScores(sPgs) + ret, pageInfo := entities.PageEntities[*v2.GamePartyScoresEdge](pgs, pagination) + return ret, pageInfo, nil +} + +func filterPartyQuery(gameIDs []entities.GameID, partyIDs []entities.PartyID, teamIDs []entities.TeamID, epochFromID, epochToID *uint64) (string, []any, error) { + var ( + args []any + conditions []string + ) + + if len(gameIDs) > 0 { + gids := make([][]byte, len(gameIDs)) + for i, gid := range gameIDs { + bytes, err := gid.Bytes() + if err != nil { + return "", nil, fmt.Errorf("could not decode game ID: %w", err) + } + gids[i] = bytes + } + conditions = append(conditions, fmt.Sprintf("t1.game_id = ANY(%s)", nextBindVar(&args, gids))) + } + + if epochFromID != nil { + conditions = append(conditions, fmt.Sprintf("t1.epoch_id >= %s", nextBindVar(&args, epochFromID))) + } + + if epochToID != nil { + conditions = append(conditions, fmt.Sprintf("t1.epoch_id <= %s", nextBindVar(&args, epochToID))) + } + + if len(partyIDs) > 0 { + pids := make([][]byte, len(partyIDs)) + for i, pid := range partyIDs { + bytes, err := pid.Bytes() + if err != nil { + return "", nil, fmt.Errorf("could not decode party ID: %w", err) + } + pids[i] = bytes + } + conditions = append(conditions, fmt.Sprintf("t1.party_id = ANY(%s)", nextBindVar(&args, pids))) + } + + if len(teamIDs) > 0 { + tids := make([][]byte, len(teamIDs)) + for i, tid := range teamIDs { + bytes, err := tid.Bytes() + if err != nil { + return "", nil, fmt.Errorf("could not decode team ID: %w", err) + } + tids[i] = bytes + } + conditions = append(conditions, fmt.Sprintf("t1.team_id = ANY(%s)", nextBindVar(&args, tids))) + } + + whereClause := strings.Join(conditions, " AND ") + if len(whereClause) > 0 { + return " WHERE " + whereClause, args, nil + } + return "", args, nil +} + +func filterTeamQuery(gameIDs []entities.GameID, teamIDs []entities.TeamID, epochFromID, epochToID *uint64) (string, []any, error) { + var ( + args []any + conditions []string + ) + + if epochFromID != nil { + conditions = append(conditions, fmt.Sprintf("t1.epoch_id >= %s", nextBindVar(&args, epochFromID))) + } + + if epochToID != nil { + conditions = append(conditions, fmt.Sprintf("t1.epoch_id <= %s", nextBindVar(&args, epochToID))) + } + + if len(gameIDs) > 0 { + gids := make([][]byte, len(gameIDs)) + for i, gid := range gameIDs { + bytes, err := gid.Bytes() + if err != nil { + return "", nil, fmt.Errorf("could not decode game ID: %w", err) + } + gids[i] = bytes + } + conditions = append(conditions, fmt.Sprintf("t1.game_id = ANY(%s)", nextBindVar(&args, gids))) + } + if len(teamIDs) > 0 { + tids := make([][]byte, len(teamIDs)) + for i, tid := range teamIDs { + bytes, err := tid.Bytes() + if err != nil { + return "", nil, fmt.Errorf("could not decode team ID: %w", err) + } + tids[i] = bytes + } + conditions = append(conditions, fmt.Sprintf("t1.team_id = ANY(%s)", nextBindVar(&args, tids))) + } + if len(conditions) > 0 { + return " WHERE " + strings.Join(conditions, " AND "), args, nil + } + return "", args, nil +} + +func (gs *GameScores) ListTeamScores( + ctx context.Context, + gameIDs []entities.GameID, + teamIDs []entities.TeamID, + epochFromID *uint64, + epochToID *uint64, + pagination entities.CursorPagination, +) ([]entities.GameTeamScore, entities.PageInfo, error) { + var pageInfo entities.PageInfo + where, args, err := filterTeamQuery(gameIDs, teamIDs, epochFromID, epochToID) + if err != nil { + return nil, pageInfo, err + } + + query := `select t1.* from game_team_scores_current t1` + if epochFromID != nil || epochToID != nil { + var epochWhere string + if epochFromID != nil && epochToID == nil { + epochWhere = fmt.Sprintf("epoch_id >= %d", *epochFromID) + } else if epochFromID == nil && epochToID != nil { + epochWhere = fmt.Sprintf("epoch_id <= %d", *epochToID) + } else { + epochWhere = fmt.Sprintf("epoch_id >= %d and epoch_id <= %d", *epochFromID, *epochToID) + } + query = `SELECT t1.* FROM game_team_scores t1 + JOIN ( + SELECT + team_id, + epoch_id, + MAX(vega_time) AS latest_time + FROM + game_team_scores + WHERE ` + epochWhere + ` + GROUP BY + team_id, + epoch_id + ) t2 ON t1.team_id = t2.team_id AND t1.epoch_id = t2.epoch_id AND t1.vega_time = t2.latest_time + ` + } + query = fmt.Sprintf("%s %s", query, where) + query, args, err = PaginateQuery[entities.TeamGameScoreCursor](query, args, gamesTeamOrderding, pagination) + if err != nil { + return nil, pageInfo, err + } + + tgs := []entities.GameTeamScore{} + defer metrics.StartSQLQuery("GameScores", "ListTeamScores")() + + if err = pgxscan.Select(ctx, gs.ConnectionSource, &tgs, query, args...); err != nil { + return nil, pageInfo, fmt.Errorf("querying game team scores: %w", err) + } + + ret, pageInfo := entities.PageEntities[*v2.GameTeamScoresEdge](tgs, pagination) + return ret, pageInfo, nil +} + +func parseScannedPartyGameScores(scanned []scannedPartyGameScore) []entities.GamePartyScore { + pgs := make([]entities.GamePartyScore, 0, len(scanned)) + for _, s := range scanned { + var teamID *entities.TeamID + if s.TeamID != nil { + id := hex.EncodeToString(s.TeamID) + if id != "" { + teamID = ptr.From(entities.TeamID(id)) + } + } + + pgs = append(pgs, entities.GamePartyScore{ + GameID: s.GameID, + TeamID: teamID, + EpochID: s.EpochID, + PartyID: s.PartyID, + Score: s.Score, + StakingBalance: s.StakingBalance, + OpenVolume: s.OpenVolume, + TotalFeesPaid: s.TotalFeesPaid, + IsEligible: s.IsEligible, + Rank: s.Rank, + VegaTime: s.VegaTime, + }) + } + return pgs +} diff --git a/datanode/sqlstore/game_scores_test.go b/datanode/sqlstore/game_scores_test.go new file mode 100644 index 00000000000..0dd072c50f9 --- /dev/null +++ b/datanode/sqlstore/game_scores_test.go @@ -0,0 +1,388 @@ +// 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" + "sort" + "testing" + "time" + + "code.vegaprotocol.io/vega/datanode/entities" + "code.vegaprotocol.io/vega/datanode/sqlstore" + "code.vegaprotocol.io/vega/libs/num" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type gameScoresTestStore struct { + gs *sqlstore.GameScores +} + +func newGameScoresTestStore(t *testing.T) *gameScoresTestStore { + t.Helper() + return &gameScoresTestStore{ + gs: sqlstore.NewGameScores(connectionSource), + } +} + +func TestInsertPartyScores(t *testing.T) { + ctx := tempTransaction(t) + store := newGameScoresTestStore(t) + now := time.Now() + gps := entities.GamePartyScore{ + GameID: "FFFF", + EpochID: 1, + PartyID: "EEEE", + Score: num.DecimalOne(), + StakingBalance: num.DecimalTwo(), + OpenVolume: num.DecimalZero(), + TotalFeesPaid: num.DecimalFromInt64(4), + IsEligible: true, + VegaTime: now, + } + + t.Run("can insert successfully", func(t *testing.T) { + assert.NoError(t, store.gs.AddPartyScore(ctx, gps)) + }) + + team := entities.TeamID("AAAA") + gps.GameID = "BBBB" + gps.TeamID = &team + t.Run("can insert successfully with team", func(t *testing.T) { + assert.NoError(t, store.gs.AddPartyScore(ctx, gps)) + }) + + rank := uint64(2) + gps.PartyID = "BBBB" + gps.Rank = &rank + t.Run("can insert successfully with rank", func(t *testing.T) { + assert.NoError(t, store.gs.AddPartyScore(ctx, gps)) + }) +} + +func TestInsertTeamScores(t *testing.T) { + ctx := tempTransaction(t) + store := newGameScoresTestStore(t) + now := time.Now() + gts := entities.GameTeamScore{ + GameID: "FFFF", + EpochID: 1, + TeamID: "EEEE", + Score: num.DecimalOne(), + VegaTime: now, + } + + t.Run("can insert successfully", func(t *testing.T) { + require.NoError(t, store.gs.AddTeamScore(ctx, gts)) + }) +} + +func prepopoulatePartyScores(t *testing.T, ctx context.Context, gs *gameScoresTestStore, now time.Time) []entities.GamePartyScore { + t.Helper() + team1 := entities.TeamID("AAAA") + team2 := entities.TeamID("BBBB") + team3 := entities.TeamID("CCCC") + gps := []entities.GamePartyScore{ + { + GameID: "EEEE", + EpochID: 1, + PartyID: "FFFE", + TeamID: &team3, + Score: num.DecimalFromFloat(0.1), + StakingBalance: num.DecimalFromInt64(1), + OpenVolume: num.DecimalFromInt64(2), + TotalFeesPaid: num.DecimalFromInt64(3), + IsEligible: true, + VegaTime: now, + }, + { + GameID: "FFFF", + EpochID: 1, + PartyID: "FFFE", + TeamID: &team1, + Score: num.DecimalFromFloat(0.1), + StakingBalance: num.DecimalFromInt64(1), + OpenVolume: num.DecimalFromInt64(2), + TotalFeesPaid: num.DecimalFromInt64(3), + IsEligible: true, + VegaTime: now, + }, + { + GameID: "EEFF", + EpochID: 1, + PartyID: "FFFD", + TeamID: &team2, + Score: num.DecimalFromFloat(0.2), + StakingBalance: num.DecimalFromInt64(11), + OpenVolume: num.DecimalFromInt64(22), + TotalFeesPaid: num.DecimalFromInt64(33), + IsEligible: true, + VegaTime: now, + }, + { + GameID: "FFFF", + EpochID: 1, + PartyID: "FFFD", + Score: num.DecimalFromFloat(0.2), + StakingBalance: num.DecimalFromInt64(111), + OpenVolume: num.DecimalFromInt64(222), + TotalFeesPaid: num.DecimalFromInt64(333), + IsEligible: true, + VegaTime: now, + }, + { + GameID: "FFFF", + EpochID: 1, + PartyID: "FFFC", + TeamID: &team3, + Score: num.DecimalFromFloat(0.3), + StakingBalance: num.DecimalFromInt64(1111), + OpenVolume: num.DecimalFromInt64(2222), + TotalFeesPaid: num.DecimalFromInt64(3333), + IsEligible: true, + VegaTime: now, + }, + { + GameID: "FFFF", + EpochID: 1, + PartyID: "FFFB", + TeamID: &team3, + Score: num.DecimalFromFloat(0.4), + StakingBalance: num.DecimalFromInt64(11111), + OpenVolume: num.DecimalFromInt64(22222), + TotalFeesPaid: num.DecimalFromInt64(33333), + IsEligible: true, + VegaTime: now, + }, + { + GameID: "FFFF", + EpochID: 1, + PartyID: "FFFA", + Score: num.DecimalFromFloat(0.5), + StakingBalance: num.DecimalTwo(), + OpenVolume: num.DecimalZero(), + TotalFeesPaid: num.DecimalFromInt64(4), + IsEligible: true, + VegaTime: now, + }, + { + GameID: "FFFF", + EpochID: 2, + PartyID: "FFFA", + Score: num.DecimalFromFloat(0.8), + StakingBalance: num.DecimalFromInt64(6), + OpenVolume: num.DecimalFromInt64(3), + TotalFeesPaid: num.DecimalFromInt64(1), + IsEligible: true, + VegaTime: now.Add(1 * time.Second), + }, + { + GameID: "FFFF", + EpochID: 2, + PartyID: "FFFA", + Score: num.DecimalFromFloat(0.7), + StakingBalance: num.DecimalFromInt64(9), + OpenVolume: num.DecimalFromInt64(8), + TotalFeesPaid: num.DecimalFromInt64(7), + IsEligible: true, + VegaTime: now.Add(2 * time.Second), + }, + } + for _, gps1 := range gps { + require.NoError(t, gs.gs.AddPartyScore(ctx, gps1)) + } + sort.Slice(gps, func(i, j int) bool { + if gps[i].GameID == gps[j].GameID { + return gps[i].PartyID > gps[j].PartyID + } + return gps[i].GameID > gps[j].GameID + }) + + return gps +} + +func TestListPartyScoresNoFilters(t *testing.T) { + ctx := tempTransaction(t) + store := newGameScoresTestStore(t) + now := time.Now() + pagination, _ := entities.NewCursorPagination(nil, nil, nil, nil, true) + partyScores := prepopoulatePartyScores(t, ctx, store, now) + scores, _, err := store.gs.ListPartyScores(ctx, nil, nil, nil, nil, nil, pagination) + require.NoError(t, err) + // as we're not filtering by epochs we're getting the current scores so that's equal to all the ones from epoch 1 (which are all distinct) + require.Equal(t, len(partyScores)-2, len(scores)) + + // now insert a fresh score for an existing party for the same game + now = now.Add(time.Hour) + partyScores[0].VegaTime = now + partyScores[0].Score = num.DecimalE() + require.NoError(t, store.gs.AddPartyScore(ctx, partyScores[0])) + require.Equal(t, len(partyScores)-2, len(scores)) +} + +func TestListPartyScoresPartyFilters(t *testing.T) { + ctx := tempTransaction(t) + store := newGameScoresTestStore(t) + now := time.Now() + pagination, _ := entities.NewCursorPagination(nil, nil, nil, nil, true) + prepopoulatePartyScores(t, ctx, store, now) + scores, _, err := store.gs.ListPartyScores(ctx, nil, []entities.PartyID{"FFFD"}, nil, nil, nil, pagination) + require.NoError(t, err) + require.Equal(t, 2, len(scores)) + + scores, _, err = store.gs.ListPartyScores(ctx, nil, []entities.PartyID{"FFFD", "FFFE"}, nil, nil, nil, pagination) + require.NoError(t, err) + require.Equal(t, 4, len(scores)) +} + +func TestListPartyScoresGameFilters(t *testing.T) { + ctx := tempTransaction(t) + store := newGameScoresTestStore(t) + now := time.Now() + pagination, _ := entities.NewCursorPagination(nil, nil, nil, nil, true) + ps := prepopoulatePartyScores(t, ctx, store, now) + scores, _, err := store.gs.ListPartyScores(ctx, []entities.GameID{"EEFF"}, nil, nil, nil, nil, pagination) + require.NoError(t, err) + require.Equal(t, 1, len(scores)) + + scores, _, err = store.gs.ListPartyScores(ctx, []entities.GameID{"FFFF", "EEEE"}, nil, nil, nil, nil, pagination) + require.NoError(t, err) + require.Equal(t, len(ps)-3, len(scores)) +} + +func TestListPartyScoresTeamFilters(t *testing.T) { + ctx := tempTransaction(t) + store := newGameScoresTestStore(t) + now := time.Now() + pagination, _ := entities.NewCursorPagination(nil, nil, nil, nil, true) + prepopoulatePartyScores(t, ctx, store, now) + scores, _, err := store.gs.ListPartyScores(ctx, nil, nil, []entities.TeamID{"AAAA"}, nil, nil, pagination) + require.NoError(t, err) + require.Equal(t, 1, len(scores)) + scores, _, err = store.gs.ListPartyScores(ctx, nil, nil, []entities.TeamID{"AAAA", "BBBB"}, nil, nil, pagination) + require.NoError(t, err) + require.Equal(t, 2, len(scores)) +} + +func TestListPartyScoresAllFilters(t *testing.T) { + ctx := tempTransaction(t) + store := newGameScoresTestStore(t) + now := time.Now() + pagination, _ := entities.NewCursorPagination(nil, nil, nil, nil, true) + prepopoulatePartyScores(t, ctx, store, now) + + // all filters populated + scores, _, err := store.gs.ListPartyScores(ctx, []entities.GameID{"FFFF"}, []entities.PartyID{"FFFB"}, []entities.TeamID{"CCCC"}, nil, nil, pagination) + require.NoError(t, err) + require.Equal(t, 1, len(scores)) + require.Equal(t, num.DecimalFromFloat(0.4), scores[0].Score) + require.Equal(t, num.DecimalFromInt64(11111), scores[0].StakingBalance) + require.Equal(t, num.DecimalFromInt64(22222), scores[0].OpenVolume) + require.Equal(t, num.DecimalFromInt64(33333), scores[0].TotalFeesPaid) +} + +func TestListPartyScoresEpochFilter(t *testing.T) { + ctx := tempTransaction(t) + store := newGameScoresTestStore(t) + now := time.Now() + pagination, _ := entities.NewCursorPagination(nil, nil, nil, nil, true) + prepopoulatePartyScores(t, ctx, store, now) + + // all filters populated + from := uint64(1) + to := uint64(2) + // provide to and from + scores, _, err := store.gs.ListPartyScores(ctx, []entities.GameID{"FFFF"}, []entities.PartyID{"FFFA"}, nil, &from, &to, pagination) + require.NoError(t, err) + require.Equal(t, 2, len(scores)) + require.Equal(t, num.DecimalFromFloat(0.5), scores[0].Score) + require.Equal(t, num.DecimalFromInt64(2), scores[0].StakingBalance) + require.Equal(t, num.DecimalFromInt64(0), scores[0].OpenVolume) + require.Equal(t, num.DecimalFromInt64(4), scores[0].TotalFeesPaid) + require.Equal(t, num.DecimalFromFloat(0.7), scores[1].Score) + require.Equal(t, num.DecimalFromInt64(9), scores[1].StakingBalance) + require.Equal(t, num.DecimalFromInt64(8), scores[1].OpenVolume) + require.Equal(t, num.DecimalFromInt64(7), scores[1].TotalFeesPaid) + + // do not provide from, expect the same result as we should get basically all epochs + scores, _, err = store.gs.ListPartyScores(ctx, []entities.GameID{"FFFF"}, []entities.PartyID{"FFFA"}, nil, nil, &to, pagination) + require.NoError(t, err) + require.Equal(t, 2, len(scores)) + require.Equal(t, num.DecimalFromFloat(0.5), scores[0].Score) + require.Equal(t, num.DecimalFromInt64(2), scores[0].StakingBalance) + require.Equal(t, num.DecimalFromInt64(0), scores[0].OpenVolume) + require.Equal(t, num.DecimalFromInt64(4), scores[0].TotalFeesPaid) + require.Equal(t, num.DecimalFromFloat(0.7), scores[1].Score) + require.Equal(t, num.DecimalFromInt64(9), scores[1].StakingBalance) + require.Equal(t, num.DecimalFromInt64(8), scores[1].OpenVolume) + require.Equal(t, num.DecimalFromInt64(7), scores[1].TotalFeesPaid) + + // do not provide to, expect the same result as we should get basically all epochs + scores, _, err = store.gs.ListPartyScores(ctx, []entities.GameID{"FFFF"}, []entities.PartyID{"FFFA"}, nil, &from, nil, pagination) + require.NoError(t, err) + require.Equal(t, 2, len(scores)) + require.Equal(t, num.DecimalFromFloat(0.5), scores[0].Score) + require.Equal(t, num.DecimalFromInt64(2), scores[0].StakingBalance) + require.Equal(t, num.DecimalFromInt64(0), scores[0].OpenVolume) + require.Equal(t, num.DecimalFromInt64(4), scores[0].TotalFeesPaid) + require.Equal(t, num.DecimalFromFloat(0.7), scores[1].Score) + require.Equal(t, num.DecimalFromInt64(9), scores[1].StakingBalance) + require.Equal(t, num.DecimalFromInt64(8), scores[1].OpenVolume) + require.Equal(t, num.DecimalFromInt64(7), scores[1].TotalFeesPaid) + + // set from to the second (and last) epoch + from = 2 + scores, _, err = store.gs.ListPartyScores(ctx, []entities.GameID{"FFFF"}, []entities.PartyID{"FFFA"}, nil, &from, nil, pagination) + require.NoError(t, err) + require.Equal(t, 1, len(scores)) + require.Equal(t, num.DecimalFromFloat(0.7), scores[0].Score) + require.Equal(t, num.DecimalFromInt64(9), scores[0].StakingBalance) + require.Equal(t, num.DecimalFromInt64(8), scores[0].OpenVolume) + require.Equal(t, num.DecimalFromInt64(7), scores[0].TotalFeesPaid) + + // set to to 1 so we get only the first epoch + to = 1 + scores, _, err = store.gs.ListPartyScores(ctx, []entities.GameID{"FFFF"}, []entities.PartyID{"FFFA"}, nil, nil, &to, pagination) + require.NoError(t, err) + require.Equal(t, 1, len(scores)) + require.Equal(t, num.DecimalFromFloat(0.5), scores[0].Score) + require.Equal(t, num.DecimalFromInt64(2), scores[0].StakingBalance) + require.Equal(t, num.DecimalFromInt64(0), scores[0].OpenVolume) + require.Equal(t, num.DecimalFromInt64(4), scores[0].TotalFeesPaid) + + // now set both to and from to 1 + to = 1 + from = 1 + scores, _, err = store.gs.ListPartyScores(ctx, []entities.GameID{"FFFF"}, []entities.PartyID{"FFFA"}, nil, &from, &to, pagination) + require.NoError(t, err) + require.Equal(t, 1, len(scores)) + require.Equal(t, num.DecimalFromFloat(0.5), scores[0].Score) + require.Equal(t, num.DecimalFromInt64(2), scores[0].StakingBalance) + require.Equal(t, num.DecimalFromInt64(0), scores[0].OpenVolume) + require.Equal(t, num.DecimalFromInt64(4), scores[0].TotalFeesPaid) + + // and to 2 + to = 2 + from = 2 + scores, _, err = store.gs.ListPartyScores(ctx, []entities.GameID{"FFFF"}, []entities.PartyID{"FFFA"}, nil, &from, &to, pagination) + require.NoError(t, err) + require.Equal(t, num.DecimalFromFloat(0.7), scores[0].Score) + require.Equal(t, num.DecimalFromInt64(9), scores[0].StakingBalance) + require.Equal(t, num.DecimalFromInt64(8), scores[0].OpenVolume) + require.Equal(t, num.DecimalFromInt64(7), scores[0].TotalFeesPaid) +} diff --git a/datanode/sqlstore/games.go b/datanode/sqlstore/games.go index 8e4bc87189c..c34cf013799 100644 --- a/datanode/sqlstore/games.go +++ b/datanode/sqlstore/games.go @@ -91,7 +91,7 @@ func (g *Games) ListGames(ctx context.Context, gameID *string, entityScope *vega return nil, pageInfo, err } - if err := pgxscan.Select(ctx, g.Connection, &gameRewards, query, args...); err != nil { + if err := pgxscan.Select(ctx, g.ConnectionSource, &gameRewards, query, args...); err != nil { return nil, pageInfo, err } diff --git a/datanode/sqlstore/games_test.go b/datanode/sqlstore/games_test.go index e44ee232c3f..df3aec3f4a0 100644 --- a/datanode/sqlstore/games_test.go +++ b/datanode/sqlstore/games_test.go @@ -617,9 +617,9 @@ func setupGamesData(ctx context.Context, t *testing.T, stores gameStores, block } // IMPORTANT!!!! We MUST refresh the materialized views or the tests will fail because there will be NO DATA!!! - _, err := connectionSource.Connection.Exec(ctx, "REFRESH MATERIALIZED VIEW game_stats") + _, err := connectionSource.Exec(ctx, "REFRESH MATERIALIZED VIEW game_stats") require.NoError(t, err) - _, err = connectionSource.Connection.Exec(ctx, "REFRESH MATERIALIZED VIEW game_stats_current") + _, err = connectionSource.Exec(ctx, "REFRESH MATERIALIZED VIEW game_stats_current") require.NoError(t, err) return orderResults(results), gameIDs, rewards, teams, individuals diff --git a/datanode/sqlstore/key_rotations.go b/datanode/sqlstore/key_rotations.go index 29dc0fcf04e..470d19d4924 100644 --- a/datanode/sqlstore/key_rotations.go +++ b/datanode/sqlstore/key_rotations.go @@ -45,7 +45,7 @@ func NewKeyRotations(connectionSource *ConnectionSource) *KeyRotations { func (store *KeyRotations) Upsert(ctx context.Context, kr *entities.KeyRotation) error { defer metrics.StartSQLQuery("KeyRotations", "Upsert")() - _, err := store.Connection.Exec(ctx, ` + _, err := store.Exec(ctx, ` INSERT INTO key_rotations(node_id, old_pub_key, new_pub_key, block_height, tx_hash, vega_time) VALUES ($1, $2, $3, $4, $5, $6) ON CONFLICT (node_id, vega_time) DO UPDATE SET @@ -73,7 +73,7 @@ func (store *KeyRotations) GetAllPubKeyRotations(ctx context.Context, pagination return nil, pageInfo, err } - if err = pgxscan.Select(ctx, store.Connection, &keyRotations, query, args...); err != nil { + if err = pgxscan.Select(ctx, store.ConnectionSource, &keyRotations, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("failed to retrieve key rotations: %w", err) } @@ -88,7 +88,7 @@ func (store *KeyRotations) GetByTxHash(ctx context.Context, txHash entities.TxHa var keyRotations []entities.KeyRotation query := `SELECT * FROM key_rotations WHERE tx_hash = $1` - if err := pgxscan.Select(ctx, store.Connection, &keyRotations, query, txHash); err != nil { + if err := pgxscan.Select(ctx, store.ConnectionSource, &keyRotations, query, txHash); err != nil { return nil, fmt.Errorf("failed to retrieve key rotations: %w", err) } @@ -116,7 +116,7 @@ func (store *KeyRotations) GetPubKeyRotationsPerNode(ctx context.Context, nodeID query := fmt.Sprintf(`SELECT * FROM key_rotations WHERE node_id = %s`, nextBindVar(&args, id)) query, args = orderAndPaginateWithCursor(query, pagination, cursorParams, args...) - if err := pgxscan.Select(ctx, store.Connection, &keyRotations, query, args...); err != nil { + if err := pgxscan.Select(ctx, store.ConnectionSource, &keyRotations, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("failed to retrieve key rotations: %w", err) } diff --git a/datanode/sqlstore/ledger.go b/datanode/sqlstore/ledger.go index 6dfe83ef8f2..8eafa818c43 100644 --- a/datanode/sqlstore/ledger.go +++ b/datanode/sqlstore/ledger.go @@ -66,7 +66,7 @@ func (ls *Ledger) Flush(ctx context.Context) ([]entities.LedgerEntry, error) { ls.pending = nil - return ls.batcher.Flush(ctx, ls.Connection) + return ls.batcher.Flush(ctx, ls.ConnectionSource) } func (ls *Ledger) Add(le entities.LedgerEntry) error { @@ -78,7 +78,7 @@ func (ls *Ledger) GetByLedgerEntryTime(ctx context.Context, ledgerEntryTime time defer metrics.StartSQLQuery("Ledger", "GetByID")() le := entities.LedgerEntry{} - return le, ls.wrapE(pgxscan.Get(ctx, ls.Connection, &le, + return le, ls.wrapE(pgxscan.Get(ctx, ls.ConnectionSource, &le, `SELECT ledger_entry_time, quantity, tx_hash, vega_time, transfer_time, type, account_from_balance, account_to_balance FROM ledger WHERE ledger_entry_time =$1`, ledgerEntryTime)) @@ -87,7 +87,7 @@ func (ls *Ledger) GetByLedgerEntryTime(ctx context.Context, ledgerEntryTime time func (ls *Ledger) GetAll(ctx context.Context) ([]entities.LedgerEntry, error) { defer metrics.StartSQLQuery("Ledger", "GetAll")() ledgerEntries := []entities.LedgerEntry{} - err := pgxscan.Select(ctx, ls.Connection, &ledgerEntries, ` + err := pgxscan.Select(ctx, ls.ConnectionSource, &ledgerEntries, ` SELECT ledger_entry_time, quantity, tx_hash, vega_time, transfer_time, type, account_from_balance, account_to_balance FROM ledger`) return ledgerEntries, err @@ -97,7 +97,7 @@ func (ls *Ledger) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]en ledgerEntries := []entities.LedgerEntry{} defer metrics.StartSQLQuery("Ledger", "GetByTxHash")() - err := pgxscan.Select(ctx, ls.Connection, &ledgerEntries, ` + err := pgxscan.Select(ctx, ls.ConnectionSource, &ledgerEntries, ` SELECT ledger_entry_time, account_from_id, account_to_id, quantity, tx_hash, vega_time, transfer_time, type, account_from_balance, account_to_balance FROM ledger WHERE tx_hash=$1`, txHash, @@ -206,7 +206,7 @@ func (ls *Ledger) Query( return nil, pageInfo, err } - if err := pgxscan.Select(ctx, ls.Connection, &entries, query, args...); err != nil { + if err := pgxscan.Select(ctx, ls.ConnectionSource, &entries, query, args...); err != nil { return nil, pageInfo, err } @@ -345,7 +345,7 @@ func (ls *Ledger) Export( query = fmt.Sprintf("copy (%s ORDER BY l.ledger_entry_time) to STDOUT (FORMAT csv, HEADER)", query) - tag, err := ls.Connection.CopyTo(ctx, writer, query, args...) + tag, err := ls.CopyTo(ctx, writer, query, args...) if err != nil { return fmt.Errorf("copying to stdout: %w", err) } diff --git a/datanode/sqlstore/liquidity_provision.go b/datanode/sqlstore/liquidity_provision.go index bbb8aeda26c..e08dc180f7f 100644 --- a/datanode/sqlstore/liquidity_provision.go +++ b/datanode/sqlstore/liquidity_provision.go @@ -88,7 +88,7 @@ func NewLiquidityProvision(connectionSource *ConnectionSource, log *logging.Logg func (lp *LiquidityProvision) Flush(ctx context.Context) error { defer metrics.StartSQLQuery("LiquidityProvision", "Flush")() - flushed, err := lp.batcher.Flush(ctx, lp.Connection) + flushed, err := lp.batcher.Flush(ctx, lp.ConnectionSource) if err != nil { return err } @@ -139,7 +139,7 @@ func (lp *LiquidityProvision) GetByTxHash(ctx context.Context, txHash entities.T var liquidityProvisions []entities.LiquidityProvision query := fmt.Sprintf(`SELECT %s FROM liquidity_provisions WHERE tx_hash = $1`, sqlOracleLiquidityProvisionColumns) - err := pgxscan.Select(ctx, lp.Connection, &liquidityProvisions, query, txHash) + err := pgxscan.Select(ctx, lp.ConnectionSource, &liquidityProvisions, query, txHash) if err != nil { return nil, err } @@ -179,7 +179,7 @@ func (lp *LiquidityProvision) ListProviders(ctx context.Context, partyID *entiti batch.Queue(feeQuery, feeArgs...) batch.Queue(slaQuery, slaArgs...) - results := lp.Connection.SendBatch(ctx, batch) + results := lp.SendBatch(ctx, batch) defer results.Close() feeRows, err := results.Query() @@ -335,7 +335,7 @@ func (lp *LiquidityProvision) getWithCursorPagination(ctx context.Context, party var liquidityProvisions []entities.CurrentAndPreviousLiquidityProvisions - if err = pgxscan.Select(ctx, lp.Connection, &liquidityProvisions, query, bindVars...); err != nil { + if err = pgxscan.Select(ctx, lp.ConnectionSource, &liquidityProvisions, query, bindVars...); err != nil { return nil, entities.PageInfo{}, err } diff --git a/datanode/sqlstore/liquidity_provision_test.go b/datanode/sqlstore/liquidity_provision_test.go index df955e7c4e0..d8b76a40bed 100644 --- a/datanode/sqlstore/liquidity_provision_test.go +++ b/datanode/sqlstore/liquidity_provision_test.go @@ -61,7 +61,7 @@ func setupLPTests(t *testing.T) (*sqlstore.Blocks, *sqlstore.LiquidityProvision, bs := sqlstore.NewBlocks(connectionSource) lp := sqlstore.NewLiquidityProvision(connectionSource, logging.NewTestLogger()) - return bs, lp, connectionSource.Connection + return bs, lp, connectionSource } func testInsertNewInCurrentBlock(t *testing.T) { diff --git a/datanode/sqlstore/margin_level_test.go b/datanode/sqlstore/margin_level_test.go index 66c196e7899..379215b40ba 100644 --- a/datanode/sqlstore/margin_level_test.go +++ b/datanode/sqlstore/margin_level_test.go @@ -91,7 +91,7 @@ func setupMarginLevelTests(t *testing.T, ctx context.Context) (*testBlockSource, accountStore := sqlstore.NewAccounts(connectionSource) ml := sqlstore.NewMarginLevels(connectionSource) - return testBlockSource, ml, accountStore, connectionSource.Connection + return testBlockSource, ml, accountStore, connectionSource } func testInsertMarginLevels(t *testing.T) { diff --git a/datanode/sqlstore/margin_levels.go b/datanode/sqlstore/margin_levels.go index f108b07a0c4..031161ee13f 100644 --- a/datanode/sqlstore/margin_levels.go +++ b/datanode/sqlstore/margin_levels.go @@ -60,7 +60,7 @@ func (ml *MarginLevels) Add(marginLevel entities.MarginLevels) error { func (ml *MarginLevels) Flush(ctx context.Context) ([]entities.MarginLevels, error) { defer metrics.StartSQLQuery("MarginLevels", "Flush")() - return ml.batcher.Flush(ctx, ml.Connection) + return ml.batcher.Flush(ctx, ml.ConnectionSource) } func buildAccountWhereClause(partyID, marketID string) (string, []interface{}) { @@ -108,7 +108,7 @@ func (ml *MarginLevels) GetMarginLevelsByIDWithCursorPagination(ctx context.Cont } var marginLevels []entities.MarginLevels - if err = pgxscan.Select(ctx, ml.Connection, &marginLevels, query, bindVars...); err != nil { + if err = pgxscan.Select(ctx, ml.ConnectionSource, &marginLevels, query, bindVars...); err != nil { return nil, entities.PageInfo{}, err } @@ -120,7 +120,7 @@ func (ml *MarginLevels) GetByTxHash(ctx context.Context, txHash entities.TxHash) var marginLevels []entities.MarginLevels query := fmt.Sprintf(`SELECT %s FROM margin_levels WHERE tx_hash = $1`, sqlMarginLevelColumns) - if err := pgxscan.Select(ctx, ml.Connection, &marginLevels, query, txHash); err != nil { + if err := pgxscan.Select(ctx, ml.ConnectionSource, &marginLevels, query, txHash); err != nil { return nil, err } diff --git a/datanode/sqlstore/margin_modes.go b/datanode/sqlstore/margin_modes.go index 49fa061ed56..eaa6c91a7e3 100644 --- a/datanode/sqlstore/margin_modes.go +++ b/datanode/sqlstore/margin_modes.go @@ -43,7 +43,7 @@ type MarginModes struct { func (t *MarginModes) UpdatePartyMarginMode(ctx context.Context, update entities.PartyMarginMode) error { defer metrics.StartSQLQuery("MarginModes", "UpdatePartyMarginMode")() - if _, err := t.Connection.Exec( + if _, err := t.Exec( ctx, `INSERT INTO party_margin_modes(market_id, party_id, margin_mode, margin_factor, min_theoretical_margin_factor, max_theoretical_leverage, at_epoch) VALUES ($1, $2, $3, $4, $5, $6, $7) @@ -95,7 +95,7 @@ func (t *MarginModes) ListPartyMarginModes(ctx context.Context, pagination entit return nil, pageInfo, err } - if err := pgxscan.Select(ctx, t.Connection, &modes, query, args...); err != nil { + if err := pgxscan.Select(ctx, t.ConnectionSource, &modes, query, args...); err != nil { return nil, pageInfo, err } diff --git a/datanode/sqlstore/market_data.go b/datanode/sqlstore/market_data.go index 2928e19f8fb..adae3f643c6 100644 --- a/datanode/sqlstore/market_data.go +++ b/datanode/sqlstore/market_data.go @@ -93,7 +93,7 @@ func (md *MarketData) Flush(ctx context.Context) ([]*entities.MarketData, error) } defer metrics.StartSQLQuery("MarketData", "Flush")() if rows != nil { - copyCount, err := md.Connection.CopyFrom( + copyCount, err := md.CopyFrom( ctx, pgx.Identifier{"market_data"}, md.columns, pgx.CopyFromRows(rows), ) @@ -118,7 +118,7 @@ func (md *MarketData) GetMarketDataByID(ctx context.Context, marketID string) (e var marketData entities.MarketData query := fmt.Sprintf("select %s from current_market_data where market = $1", selectMarketDataColumns) - return marketData, md.wrapE(pgxscan.Get(ctx, md.Connection, &marketData, query, entities.MarketID(marketID))) + return marketData, md.wrapE(pgxscan.Get(ctx, md.ConnectionSource, &marketData, query, entities.MarketID(marketID))) } func (md *MarketData) GetMarketsData(ctx context.Context) ([]entities.MarketData, error) { @@ -128,7 +128,7 @@ func (md *MarketData) GetMarketsData(ctx context.Context) ([]entities.MarketData query := fmt.Sprintf("select %s from current_market_data", selectMarketDataColumns) defer metrics.StartSQLQuery("MarketData", "GetMarketsData")() - err := pgxscan.Select(ctx, md.Connection, &marketData, query) + err := pgxscan.Select(ctx, md.ConnectionSource, &marketData, query) return marketData, err } @@ -190,7 +190,7 @@ func (md *MarketData) getHistoricMarketData(ctx context.Context, marketID string } var pagedData []entities.MarketData - if err = pgxscan.Select(ctx, md.Connection, &pagedData, query, args...); err != nil { + if err = pgxscan.Select(ctx, md.ConnectionSource, &pagedData, query, args...); err != nil { return pagedData, pageInfo, err } diff --git a/datanode/sqlstore/market_data_test.go b/datanode/sqlstore/market_data_test.go index 06f1c273af6..2cb19882082 100644 --- a/datanode/sqlstore/market_data_test.go +++ b/datanode/sqlstore/market_data_test.go @@ -97,7 +97,7 @@ func shouldWorkForAllValuesOfCompositePriceType(t *testing.T) { addMarketData(t, ctx, "AUCTION_TRIGGER_LIQUIDITY", pt) var got entities.MarketData - err := connectionSource.Connection.QueryRow(ctx, `select mark_price_type from market_data`).Scan(&got.MarkPriceType) + err := connectionSource.QueryRow(ctx, `select mark_price_type from market_data`).Scan(&got.MarkPriceType) require.NoError(t, err) mdProto := got.ToProto() @@ -143,7 +143,7 @@ func addMarketData(t *testing.T, ctx context.Context, trigger, priceType string) func shouldWorkForAllValuesOfAuctionTrigger(t *testing.T) { var auctionTrigger vegapb.AuctionTrigger enums := getEnums(t, auctionTrigger) - assert.Len(t, enums, 8) + assert.Len(t, enums, 9) for e, trigger := range enums { t.Run(trigger, func(t *testing.T) { @@ -152,7 +152,7 @@ func shouldWorkForAllValuesOfAuctionTrigger(t *testing.T) { addMarketData(t, ctx, trigger, "COMPOSITE_PRICE_TYPE_LAST_TRADE") var got entities.MarketData - err := connectionSource.Connection.QueryRow(ctx, `select auction_trigger from market_data`).Scan(&got.AuctionTrigger) + err := connectionSource.QueryRow(ctx, `select auction_trigger from market_data`).Scan(&got.AuctionTrigger) require.NoError(t, err) mdProto := got.ToProto() @@ -170,7 +170,7 @@ func shouldInsertAValidMarketDataRecord(t *testing.T) { var rowCount int - err := connectionSource.Connection.QueryRow(ctx, `select count(*) from market_data`).Scan(&rowCount) + err := connectionSource.QueryRow(ctx, `select count(*) from market_data`).Scan(&rowCount) require.NoError(t, err) assert.Equal(t, 0, rowCount) @@ -202,7 +202,7 @@ func shouldInsertAValidMarketDataRecord(t *testing.T) { _, err = md.Flush(ctx) require.NoError(t, err) - err = connectionSource.Connection.QueryRow(ctx, `select count(*) from market_data`).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from market_data`).Scan(&rowCount) assert.NoError(t, err) assert.Equal(t, 1, rowCount) } diff --git a/datanode/sqlstore/markets.go b/datanode/sqlstore/markets.go index 61f9bfd4f99..b810b8bfe2f 100644 --- a/datanode/sqlstore/markets.go +++ b/datanode/sqlstore/markets.go @@ -95,7 +95,7 @@ const ( sqlMarketsColumns = `id, tx_hash, vega_time, instrument_id, tradable_instrument, decimal_places, fees, opening_auction, price_monitoring_settings, liquidity_monitoring_parameters, trading_mode, state, market_timestamps, position_decimal_places, lp_price_range, linear_slippage_factor, quadratic_slippage_factor, - parent_market_id, insurance_pool_fraction, liquidity_sla_parameters, liquidation_strategy, mark_price_configuration, tick_size` + parent_market_id, insurance_pool_fraction, liquidity_sla_parameters, liquidation_strategy, mark_price_configuration, tick_size, enable_tx_reordering` ) func NewMarkets(connectionSource *ConnectionSource) *Markets { @@ -108,7 +108,7 @@ func NewMarkets(connectionSource *ConnectionSource) *Markets { func (m *Markets) Upsert(ctx context.Context, market *entities.Market) error { query := fmt.Sprintf(`insert into markets(%s) -values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23) +values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24) on conflict (id, vega_time) do update set instrument_id=EXCLUDED.instrument_id, @@ -131,15 +131,16 @@ set liquidity_sla_parameters=EXCLUDED.liquidity_sla_parameters, liquidation_strategy=EXCLUDED.liquidation_strategy, mark_price_configuration=EXCLUDED.mark_price_configuration, - tick_size=EXCLUDED.tick_size;`, sqlMarketsColumns) + tick_size=EXCLUDED.tick_size, + enable_tx_reordering=EXCLUDED.enable_tx_reordering;`, sqlMarketsColumns) defer metrics.StartSQLQuery("Markets", "Upsert")() - if _, err := m.Connection.Exec(ctx, query, market.ID, market.TxHash, market.VegaTime, market.InstrumentID, market.TradableInstrument, market.DecimalPlaces, + if _, err := m.Exec(ctx, query, market.ID, market.TxHash, market.VegaTime, market.InstrumentID, market.TradableInstrument, market.DecimalPlaces, market.Fees, market.OpeningAuction, market.PriceMonitoringSettings, market.LiquidityMonitoringParameters, market.TradingMode, market.State, market.MarketTimestamps, market.PositionDecimalPlaces, market.LpPriceRange, market.LinearSlippageFactor, market.QuadraticSlippageFactor, market.ParentMarketID, market.InsurancePoolFraction, market.LiquiditySLAParameters, market.LiquidationStrategy, - market.MarkPriceConfiguration, market.TickSize); err != nil { + market.MarkPriceConfiguration, market.TickSize, market.EnableTXReordering); err != nil { err = fmt.Errorf("could not insert market into database: %w", err) return err } @@ -166,7 +167,7 @@ func getSelect() string { select mc.id, mc.tx_hash, mc.vega_time, mc.instrument_id, mc.tradable_instrument, mc.decimal_places, mc.fees, mc.opening_auction, mc.price_monitoring_settings, mc.liquidity_monitoring_parameters, mc.trading_mode, mc.state, mc.market_timestamps, mc.position_decimal_places, mc.lp_price_range, mc.linear_slippage_factor, mc.quadratic_slippage_factor, - mc.parent_market_id, mc.insurance_pool_fraction, ml.market_id as successor_market_id, mc.liquidity_sla_parameters, mc.liquidation_strategy, mc.mark_price_configuration, tick_size + mc.parent_market_id, mc.insurance_pool_fraction, ml.market_id as successor_market_id, mc.liquidity_sla_parameters, mc.liquidation_strategy, mc.mark_price_configuration, mc.tick_size, mc.enable_tx_reordering from markets_current mc left join lineage ml on mc.id = ml.parent_market_id ` @@ -188,7 +189,7 @@ order by id, vega_time desc `, getSelect()) defer metrics.StartSQLQuery("Markets", "GetByID")() - err := pgxscan.Get(ctx, m.Connection, &market, query, entities.MarketID(marketID)) + err := pgxscan.Get(ctx, m.ConnectionSource, &market, query, entities.MarketID(marketID)) if err == nil { m.cache[marketID] = market @@ -202,7 +203,7 @@ func (m *Markets) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]en var markets []entities.Market query := fmt.Sprintf(`%s where tx_hash = $1`, getSelect()) - err := pgxscan.Select(ctx, m.Connection, &markets, query, txHash) + err := pgxscan.Select(ctx, m.ConnectionSource, &markets, query, txHash) if err == nil { m.cacheLock.Lock() @@ -258,7 +259,7 @@ func (m *Markets) GetAllPaged(ctx context.Context, marketID string, pagination e return markets, pageInfo, err } - if err = pgxscan.Select(ctx, m.Connection, &markets, query, args...); err != nil { + if err = pgxscan.Select(ctx, m.ConnectionSource, &markets, query, args...); err != nil { return markets, pageInfo, err } @@ -310,7 +311,7 @@ left join lineage s on l.successor_market_id = s.parent_id query = fmt.Sprintf("%s %s", preQuery, query) - if err = pgxscan.Select(ctx, m.Connection, &markets, query, args...); err != nil { + if err = pgxscan.Select(ctx, m.ConnectionSource, &markets, query, args...); err != nil { return nil, entities.PageInfo{}, m.wrapE(err) } @@ -329,7 +330,7 @@ left join lineage s on l.successor_market_id = s.parent_id proposalsQuery := fmt.Sprintf(`select * from proposals_current where terms->'newMarket'->'changes'->'successor'->>'parentMarketId' in ('%s') order by vega_time, id`, strings.Join(parentMarketList, "', '")) - if err = pgxscan.Select(ctx, m.Connection, &proposals, proposalsQuery); err != nil { + if err = pgxscan.Select(ctx, m.ConnectionSource, &proposals, proposalsQuery); err != nil { return nil, entities.PageInfo{}, m.wrapE(err) } diff --git a/datanode/sqlstore/markets_test.go b/datanode/sqlstore/markets_test.go index a014e7cf23d..28bb945410f 100644 --- a/datanode/sqlstore/markets_test.go +++ b/datanode/sqlstore/markets_test.go @@ -203,10 +203,9 @@ func shouldInsertAValidMarketRecord(t *testing.T) { ctx := tempTransaction(t) - conn := connectionSource.Connection var rowCount int - err := conn.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) + err := connectionSource.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) require.NoError(t, err) assert.Equal(t, 0, rowCount) @@ -219,7 +218,7 @@ func shouldInsertAValidMarketRecord(t *testing.T) { err = md.Upsert(ctx, market) require.NoError(t, err, "Saving market entity to database") - err = conn.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) assert.NoError(t, err) assert.Equal(t, 1, rowCount) } @@ -235,11 +234,10 @@ func shouldUpdateAValidMarketRecord(t *testing.T) { bs, md := setupMarketsTest(t) ctx := tempTransaction(t) - conn := connectionSource.Connection var rowCount int t.Run("should have no markets in the database", func(t *testing.T) { - err := conn.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) + err := connectionSource.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) require.NoError(t, err) assert.Equal(t, 0, rowCount) }) @@ -258,7 +256,7 @@ func shouldUpdateAValidMarketRecord(t *testing.T) { require.NoError(t, err, "Saving market entity to database") var got entities.Market - err = pgxscan.Get(ctx, conn, &got, `select * from markets where id = $1 and vega_time = $2`, market.ID, market.VegaTime) + err = pgxscan.Get(ctx, connectionSource, &got, `select * from markets where id = $1 and vega_time = $2`, market.ID, market.VegaTime) assert.NoError(t, err) assert.Equal(t, "TEST_INSTRUMENT", market.InstrumentID) assert.NotNil(t, got.LiquidationStrategy) @@ -278,7 +276,7 @@ func shouldUpdateAValidMarketRecord(t *testing.T) { require.NoError(t, err, "Saving market entity to database") var got entities.Market - err = pgxscan.Get(ctx, conn, &got, `select * from markets where id = $1 and vega_time = $2`, market.ID, market.VegaTime) + err = pgxscan.Get(ctx, connectionSource, &got, `select * from markets where id = $1 and vega_time = $2`, market.ID, market.VegaTime) assert.NoError(t, err) assert.Equal(t, "TEST_INSTRUMENT", market.InstrumentID) @@ -297,7 +295,7 @@ func shouldUpdateAValidMarketRecord(t *testing.T) { require.NoError(t, err, "Saving market entity to database") var got entities.Market - err = pgxscan.Get(ctx, conn, &got, `select * from markets where id = $1 and vega_time = $2`, market.ID, market.VegaTime) + err = pgxscan.Get(ctx, connectionSource, &got, `select * from markets where id = $1 and vega_time = $2`, market.ID, market.VegaTime) assert.NoError(t, err) assert.Equal(t, "TEST_INSTRUMENT", market.InstrumentID) @@ -315,19 +313,19 @@ func shouldUpdateAValidMarketRecord(t *testing.T) { err = md.Upsert(ctx, market) require.NoError(t, err, "Saving market entity to database") - err = conn.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) require.NoError(t, err) assert.Equal(t, 3, rowCount) var gotFirstBlock, gotSecondBlock entities.Market - err = pgxscan.Get(ctx, conn, &gotFirstBlock, `select * from markets where id = $1 and vega_time = $2`, market.ID, block.VegaTime) + err = pgxscan.Get(ctx, connectionSource, &gotFirstBlock, `select * from markets where id = $1 and vega_time = $2`, market.ID, block.VegaTime) assert.NoError(t, err) assert.Equal(t, "TEST_INSTRUMENT", market.InstrumentID) assert.Equal(t, marketProto.TradableInstrument, gotFirstBlock.TradableInstrument.ToProto()) - err = pgxscan.Get(ctx, conn, &gotSecondBlock, `select * from markets where id = $1 and vega_time = $2`, market.ID, newBlock.VegaTime) + err = pgxscan.Get(ctx, connectionSource, &gotSecondBlock, `select * from markets where id = $1 and vega_time = $2`, market.ID, newBlock.VegaTime) assert.NoError(t, err) assert.Equal(t, "TEST_INSTRUMENT", market.InstrumentID) @@ -340,10 +338,9 @@ func shouldInsertAValidSpotMarketRecord(t *testing.T) { ctx := tempTransaction(t) - conn := connectionSource.Connection var rowCount int - err := conn.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) + err := connectionSource.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) require.NoError(t, err) assert.Equal(t, 0, rowCount) @@ -356,7 +353,7 @@ func shouldInsertAValidSpotMarketRecord(t *testing.T) { err = md.Upsert(ctx, market) require.NoError(t, err, "Saving market entity to database") - err = conn.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) assert.NoError(t, err) assert.Equal(t, 1, rowCount) } @@ -366,10 +363,9 @@ func shouldInsertAValidPerpetualMarketRecord(t *testing.T) { ctx := tempTransaction(t) - conn := connectionSource.Connection var rowCount int - err := conn.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) + err := connectionSource.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) require.NoError(t, err) assert.Equal(t, 0, rowCount) @@ -382,7 +378,7 @@ func shouldInsertAValidPerpetualMarketRecord(t *testing.T) { err = md.Upsert(ctx, market) require.NoError(t, err, "Saving market entity to database") - err = conn.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from markets`).Scan(&rowCount) assert.NoError(t, err) assert.Equal(t, 1, rowCount) } @@ -1286,7 +1282,6 @@ func testMarketLineageCreated(t *testing.T) { ParentMarketID: successorMarketA.ID, } - conn := connectionSource.Connection var rowCount int64 source := &testBlockSource{bs, time.Now()} @@ -1296,7 +1291,7 @@ func testMarketLineageCreated(t *testing.T) { parentMarket.State = entities.MarketStateProposed err := md.Upsert(ctx, &parentMarket) require.NoError(t, err) - err = conn.QueryRow(ctx, `select count(*) from market_lineage where market_id = $1`, parentMarket.ID).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from market_lineage where market_id = $1`, parentMarket.ID).Scan(&rowCount) require.NoError(t, err) assert.Equal(t, int64(0), rowCount) @@ -1315,7 +1310,7 @@ func testMarketLineageCreated(t *testing.T) { require.NoError(t, err) var marketID, parentMarketID, rootID entities.MarketID - err = conn.QueryRow(ctx, + err = connectionSource.QueryRow(ctx, `select market_id, parent_market_id, root_id from market_lineage where market_id = $1`, parentMarket.ID, ).Scan(&marketID, &parentMarketID, &rootID) @@ -1332,7 +1327,7 @@ func testMarketLineageCreated(t *testing.T) { err := md.Upsert(ctx, &successorMarketA) require.NoError(t, err) // proposed market successor only, so it should not create a lineage record yet - err = conn.QueryRow(ctx, `select count(*) from market_lineage where market_id = $1`, successorMarketA.ID).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from market_lineage where market_id = $1`, successorMarketA.ID).Scan(&rowCount) require.NoError(t, err) assert.Equal(t, int64(0), rowCount) @@ -1351,7 +1346,7 @@ func testMarketLineageCreated(t *testing.T) { require.NoError(t, err) // proposed market successor has been accepted and is pending, so we should now have a lineage record pointing to the parent var marketID, parentMarketID, rootID entities.MarketID - err = conn.QueryRow(ctx, + err = connectionSource.QueryRow(ctx, `select market_id, parent_market_id, root_id from market_lineage where market_id = $1`, successorMarketA.ID, ).Scan(&marketID, &parentMarketID, &rootID) @@ -1368,7 +1363,7 @@ func testMarketLineageCreated(t *testing.T) { err := md.Upsert(ctx, &successorMarketB) require.NoError(t, err) // proposed market successor only, so it should not create a lineage record yet - err = conn.QueryRow(ctx, `select count(*) from market_lineage where market_id = $1`, successorMarketB.ID).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from market_lineage where market_id = $1`, successorMarketB.ID).Scan(&rowCount) require.NoError(t, err) assert.Equal(t, int64(0), rowCount) @@ -1386,7 +1381,7 @@ func testMarketLineageCreated(t *testing.T) { err = md.Upsert(ctx, &successorMarketB) require.NoError(t, err) var marketID, parentMarketID, rootID entities.MarketID - err = conn.QueryRow(ctx, + err = connectionSource.QueryRow(ctx, `select market_id, parent_market_id, root_id from market_lineage where market_id = $1`, successorMarketB.ID, ).Scan(&marketID, &parentMarketID, &rootID) @@ -1815,7 +1810,7 @@ func testMarketState(t *testing.T) { func testMarketTradingMode(t *testing.T) { var marketTradingMode vega.Market_TradingMode modes := getEnums(t, marketTradingMode) - assert.Len(t, modes, 7) + assert.Len(t, modes, 8) for m, mode := range modes { t.Run(mode, func(t *testing.T) { bs, md := setupMarketsTest(t) diff --git a/datanode/sqlstore/migrations/0108_game_scores.sql b/datanode/sqlstore/migrations/0108_game_scores.sql new file mode 100644 index 00000000000..35bdf948437 --- /dev/null +++ b/datanode/sqlstore/migrations/0108_game_scores.sql @@ -0,0 +1,117 @@ +-- +goose Up + +-- create the history and current tables for game team scores +create table if not exists game_team_scores ( + game_id bytea not null, + team_id bytea not null, + epoch_id bigint not null, + score NUMERIC NOT NULL, + vega_time timestamp with time zone not null, + primary key (vega_time, game_id, team_id) +); + +create table if not exists game_party_scores ( + game_id bytea not null, + party_id bytea not null, + team_id bytea, + epoch_id bigint not null, + score NUMERIC NOT NULL, + staking_balance HUGEINT, + open_volume HUGEINT, + total_fees_paid HUGEINT not null, + is_eligible boolean, + rank integer, + vega_time timestamp with time zone not null, + primary key (vega_time, game_id, party_id) +); + + +select create_hypertable('game_team_scores', 'vega_time', chunk_time_interval => INTERVAL '1 day'); +select create_hypertable('game_party_scores', 'vega_time', chunk_time_interval => INTERVAL '1 day'); + +create table if not exists game_team_scores_current ( + game_id bytea not null, + team_id bytea not null, + epoch_id bigint not null, + score NUMERIC NOT NULL, + vega_time timestamp with time zone not null, + primary key (game_id, team_id) +); + +create table if not exists game_party_scores_current ( + game_id bytea not null, + party_id bytea not null, + team_id bytea, + epoch_id bigint not null, + score NUMERIC NOT NULL, + staking_balance HUGEINT, + open_volume HUGEINT, + total_fees_paid HUGEINT not null, + is_eligible boolean, + rank integer, + vega_time timestamp with time zone not null, + primary key (game_id, party_id) +); + +-- create the trigger functions and triggers +-- +goose StatementBegin +create or replace function update_game_team_scores() + returns trigger + language plpgsql +as $$ + begin + insert into game_team_scores_current(game_id,team_id, epoch_id, score, vega_time) + values (new.game_id, new.team_id, new.epoch_id, new.score, new.vega_time) + on conflict(game_id, team_id) + do update set + epoch_id = excluded.epoch_id, + score = excluded.score, + vega_time = excluded.vega_time; + return null; + end; +$$; + +create or replace function update_game_party_scores() + returns trigger + language plpgsql +as $$ + begin + insert into game_party_scores_current(game_id,party_id, team_id, epoch_id, score, + staking_balance,open_volume,total_fees_paid,is_eligible,vega_time) + values (new.game_id, new.party_id, new.team_id, new.epoch_id, new.score, + new.staking_balance, new.open_volume, new.total_fees_paid, + new.is_eligible,new.vega_time) + on conflict(game_id, party_id) + do update set + epoch_id = excluded.epoch_id, + team_id = excluded.team_id, + score = excluded.score, + staking_balance = excluded.staking_balance, + open_volume = excluded.open_volume, + total_fees_paid = excluded.total_fees_paid, + is_eligible = excluded.is_eligible, + vega_time = excluded.vega_time; + return null; + end; +$$; +-- +goose StatementEnd + +create trigger update_game_team_scores + after insert or update + on game_team_scores + for each row execute function update_game_team_scores(); + +create trigger update_game_party_scores + after insert or update + on game_party_scores + for each row execute function update_game_party_scores(); + +-- +goose Down + +drop table if exists game_team_scores_current; +drop table if exists game_team_scores; +drop function if exists update_game_team_scores; + +drop table if exists game_party_scores_current; +drop table if exists game_party_scores; +drop function if exists update_game_party_scores; \ No newline at end of file diff --git a/datanode/sqlstore/migrations/0109_amm_pools.sql b/datanode/sqlstore/migrations/0109_amm_pools.sql new file mode 100644 index 00000000000..0604b265b40 --- /dev/null +++ b/datanode/sqlstore/migrations/0109_amm_pools.sql @@ -0,0 +1,48 @@ +-- +goose Up + +-- +goose StatementBegin +do $$ +begin + if not exists (select 1 from pg_type where typname = 'amm_status') then + create type amm_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_status_reason') then + create type amm_status_reason as enum( + 'STATUS_REASON_UNSPECIFIED', 'STATUS_REASON_CANCELLED_BY_PARTY', 'STATUS_REASON_CANNOT_FILL_COMMITMENT', + 'STATUS_REASON_PARTY_ALREADY_OWNS_AMM_FOR_MARKET', '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 amms ( + id bytea not null, + party_id bytea not null, + market_id bytea not null, + amm_party_id bytea not null, + commitment numeric not null, + status amm_status not null, + status_reason amm_status_reason not null, + parameters_base numeric not null, + parameters_lower_bound numeric, + parameters_upper_bound numeric, + parameters_leverage_at_upper_bound numeric, + parameters_leverage_at_lower_bound numeric, + created_at timestamp with time zone not null, + last_updated timestamp with time zone not null, + primary key (party_id, market_id, id, amm_party_id) +); + +-- +goose Down +drop table if exists amms; +drop type if exists amm_status_reason; +drop type if exists amm_status; diff --git a/datanode/sqlstore/migrations/0110_update_vesting_stats.sql b/datanode/sqlstore/migrations/0110_update_vesting_stats.sql new file mode 100644 index 00000000000..94d77db93c7 --- /dev/null +++ b/datanode/sqlstore/migrations/0110_update_vesting_stats.sql @@ -0,0 +1,73 @@ +-- +goose Up + +DROP TRIGGER IF EXISTS update_party_vesting_stats ON party_vesting_stats; +-- update the vesting stats table to include the summed quantum balance and reward bonus multiplier +ALTER TABLE party_vesting_stats +ADD COLUMN IF NOT EXISTS summed_reward_bonus_multiplier NUMERIC(1000, 16) NOT NULL DEFAULT 0, +ADD COLUMN IF NOT EXISTS summed_quantum_balance NUMERIC(1000, 16) NOT NULL DEFAULT 0; + +ALTER TABLE party_vesting_stats_current +ADD COLUMN IF NOT EXISTS summed_reward_bonus_multiplier NUMERIC(1000, 16) NOT NULL DEFAULT 0, +ADD COLUMN IF NOT EXISTS summed_quantum_balance NUMERIC(1000, 16) NOT NULL DEFAULT 0; + +-- create the trigger functions and triggers +-- +goose StatementBegin +create or replace function update_party_vesting_stats() + returns trigger + language plpgsql +as $$ + begin + insert into party_vesting_stats_current(party_id, at_epoch, reward_bonus_multiplier, quantum_balance, summed_reward_bonus_multiplier, summed_quantum_balance, vega_time) + values (new.party_id, new.at_epoch, new.reward_bonus_multiplier, new.quantum_balance, new.summed_reward_bonus_multiplier, new.summed_quantum_balance, new.vega_time) + on conflict(party_id) + do update set + at_epoch = excluded.at_epoch, + reward_bonus_multiplier = excluded.reward_bonus_multiplier, + quantum_balance = excluded.quantum_balance, + summed_reward_bonus_multiplier = excluded.summed_reward_bonus_multiplier, + summed_quantum_balance = excluded.summed_quantum_balance, + vega_time = excluded.vega_time; + return null; + end; +$$; +-- +goose StatementEnd + +CREATE TRIGGER update_party_vesting_stats + after insert or update + on party_vesting_stats + for each row execute function update_party_vesting_stats(); + +-- +goose Down + +DROP TRIGGER IF EXISTS update_party_vesting_stats ON party_vesting_stats; +ALTER TABLE party_vesting_stats +DROP COLUMN summed_reward_bonus_multiplier, +DROP COLUMN summed_quantum_balance; + +ALTER TABLE party_vesting_stats_current +DROP COLUMN summed_reward_bonus_multiplier, +DROP COLUMN summed_quantum_balance; + +-- +goose StatementBegin +create or replace function update_party_vesting_stats() + returns trigger + language plpgsql +as $$ + begin + insert into party_vesting_stats_current(party_id, at_epoch, reward_bonus_multiplier, quantum_balance, vega_time) + values (new.party_id, new.at_epoch, new.reward_bonus_multiplier, new.quantum_balance, new.vega_time) + on conflict(party_id) + do update set + at_epoch = excluded.at_epoch, + reward_bonus_multiplier = excluded.reward_bonus_multiplier, + quantum_balance = excluded.quantum_balance, + vega_time = excluded.vega_time; + return null; + end; +$$; +-- +goose StatementEnd + +CREATE TRIGGER update_party_vesting_stats + after insert or update + on party_vesting_stats + for each row execute function update_party_vesting_stats(); diff --git a/datanode/sqlstore/migrations/0111_enable_market_tx_reordering.sql b/datanode/sqlstore/migrations/0111_enable_market_tx_reordering.sql new file mode 100644 index 00000000000..4b731567ce5 --- /dev/null +++ b/datanode/sqlstore/migrations/0111_enable_market_tx_reordering.sql @@ -0,0 +1,84 @@ +-- +goose Up + +ALTER TABLE markets ADD COLUMN IF NOT EXISTS enable_tx_reordering bool default FALSE; +ALTER TABLE markets_current ADD COLUMN IF NOT EXISTS enable_tx_reordering bool default FALSE; + +-- +goose StatementBegin +CREATE OR REPLACE FUNCTION update_current_markets() + RETURNS TRIGGER + LANGUAGE PLPGSQL AS +$$ +BEGIN +INSERT INTO markets_current(id,tx_hash,vega_time,instrument_id,tradable_instrument,decimal_places,fees,opening_auction,price_monitoring_settings,liquidity_monitoring_parameters,trading_mode,state,market_timestamps,position_decimal_places,lp_price_range, linear_slippage_factor, quadratic_slippage_factor, parent_market_id, insurance_pool_fraction, liquidity_sla_parameters, liquidation_strategy, mark_price_configuration, tick_size, enable_tx_reordering) +VALUES (NEW.id,NEW.tx_hash,NEW.vega_time,NEW.instrument_id,NEW.tradable_instrument,NEW.decimal_places,NEW.fees,NEW.opening_auction,NEW.price_monitoring_settings,NEW.liquidity_monitoring_parameters,NEW.trading_mode,NEW.state,NEW.market_timestamps,NEW.position_decimal_places,NEW.lp_price_range, NEW.linear_slippage_factor, NEW.quadratic_slippage_factor, NEW.parent_market_id, NEW.insurance_pool_fraction, NEW.liquidity_sla_parameters, NEW.liquidation_strategy, NEW.mark_price_configuration, NEW.tick_size, NEW.enable_tx_reordering) + ON CONFLICT(id) DO UPDATE SET + tx_hash=EXCLUDED.tx_hash, + instrument_id=EXCLUDED.instrument_id, + tradable_instrument=EXCLUDED.tradable_instrument, + decimal_places=EXCLUDED.decimal_places, + fees=EXCLUDED.fees, + opening_auction=EXCLUDED.opening_auction, + price_monitoring_settings=EXCLUDED.price_monitoring_settings, + liquidity_monitoring_parameters=EXCLUDED.liquidity_monitoring_parameters, + trading_mode=EXCLUDED.trading_mode, + state=EXCLUDED.state, + market_timestamps=EXCLUDED.market_timestamps, + position_decimal_places=EXCLUDED.position_decimal_places, + lp_price_range=EXCLUDED.lp_price_range, + linear_slippage_factor=EXCLUDED.linear_slippage_factor, + quadratic_slippage_factor=EXCLUDED.quadratic_slippage_factor, + vega_time=EXCLUDED.vega_time, + parent_market_id=EXCLUDED.parent_market_id, + insurance_pool_fraction=EXCLUDED.insurance_pool_fraction, + liquidity_sla_parameters=EXCLUDED.liquidity_sla_parameters, + liquidation_strategy=EXCLUDED.liquidation_strategy, + mark_price_configuration=EXCLUDED.mark_price_configuration, + tick_size=EXCLUDED.tick_size, + enable_tx_reordering=EXCLUDED.enable_tx_reordering; +RETURN NULL; +END; +$$; +-- +goose StatementEnd + + +-- +goose Down +ALTER TABLE markets DROP COLUMN IF EXISTS enable_tx_reordering; +ALTER TABLE markets_current DROP COLUMN IF EXISTS enable_tx_reordering; + +-- +goose StatementBegin +CREATE OR REPLACE FUNCTION update_current_markets() + RETURNS TRIGGER + LANGUAGE PLPGSQL AS +$$ +BEGIN +INSERT INTO markets_current(id,tx_hash,vega_time,instrument_id,tradable_instrument,decimal_places,fees,opening_auction,price_monitoring_settings,liquidity_monitoring_parameters,trading_mode,state,market_timestamps,position_decimal_places,lp_price_range, linear_slippage_factor, quadratic_slippage_factor, parent_market_id, insurance_pool_fraction, liquidity_sla_parameters, liquidation_strategy, mark_price_configuration, tick_size) +VALUES (NEW.id,NEW.tx_hash,NEW.vega_time,NEW.instrument_id,NEW.tradable_instrument,NEW.decimal_places,NEW.fees,NEW.opening_auction,NEW.price_monitoring_settings,NEW.liquidity_monitoring_parameters,NEW.trading_mode,NEW.state,NEW.market_timestamps,NEW.position_decimal_places,NEW.lp_price_range, NEW.linear_slippage_factor, NEW.quadratic_slippage_factor, NEW.parent_market_id, NEW.insurance_pool_fraction, NEW.liquidity_sla_parameters, NEW.liquidation_strategy, NEW.mark_price_configuration, NEW.tick_size) + ON CONFLICT(id) DO UPDATE SET + tx_hash=EXCLUDED.tx_hash, + instrument_id=EXCLUDED.instrument_id, + tradable_instrument=EXCLUDED.tradable_instrument, + decimal_places=EXCLUDED.decimal_places, + fees=EXCLUDED.fees, + opening_auction=EXCLUDED.opening_auction, + price_monitoring_settings=EXCLUDED.price_monitoring_settings, + liquidity_monitoring_parameters=EXCLUDED.liquidity_monitoring_parameters, + trading_mode=EXCLUDED.trading_mode, + state=EXCLUDED.state, + market_timestamps=EXCLUDED.market_timestamps, + position_decimal_places=EXCLUDED.position_decimal_places, + lp_price_range=EXCLUDED.lp_price_range, + linear_slippage_factor=EXCLUDED.linear_slippage_factor, + quadratic_slippage_factor=EXCLUDED.quadratic_slippage_factor, + vega_time=EXCLUDED.vega_time, + parent_market_id=EXCLUDED.parent_market_id, + insurance_pool_fraction=EXCLUDED.insurance_pool_fraction, + liquidity_sla_parameters=EXCLUDED.liquidity_sla_parameters, + liquidation_strategy=EXCLUDED.liquidation_strategy, + mark_price_configuration=EXCLUDED.mark_price_configuration, + tick_size=EXCLUDED.tick_size; +RETURN NULL; +END; +$$; +-- +goose StatementEnd + + diff --git a/datanode/sqlstore/migrations/0112_fix_pnl.sql b/datanode/sqlstore/migrations/0112_fix_pnl.sql new file mode 100644 index 00000000000..e9bed15d97e --- /dev/null +++ b/datanode/sqlstore/migrations/0112_fix_pnl.sql @@ -0,0 +1,27 @@ +-- +goose Up + +WITH updated_pnl AS ( + SELECT DISTINCT ON (pc.party_id) pc.party_id AS pid, pc.market_id AS mid, pc.loss - ph.loss AS correct_loss, pc.loss_socialisation_amount - ph.loss_socialisation_amount AS correct_loss_soc, + pc.realised_pnl - ph.realised_pnl AS correct_pnl, + pc.pending_realised_pnl - ph.pending_realised_pnl AS correct_ppnl, + pc.adjustment - ph.adjustment AS correct_adj + FROM positions_current AS pc + JOIN positions AS ph + ON pc.party_id = ph.party_id + AND pc.market_id = ph.market_id + WHERE pc.party_id IN ('\x947a700141e3d175304ee176d0beecf9ee9f462e09330e33c386952caf21f679', '\x15a8f372e255c6fa596a0b3acd62bc3be63b65188c23d33fc350f38ef52902e3', '\xaa1ce33b0b31a2e0f0a947ba83f64fa4a7e5d977fffb82c278c3b33fb0498113', '\x6527ffdd223ef2b4695ad90d832adc5493e9b8e25ad3185e67d873767f1f275e') + AND ph.vega_time >= '2024-06-08 19:38:49.89053+00' + AND pc.market_id = '\xe63a37edae8b74599d976f5dedbf3316af82579447f7a08ae0495a021fd44d13' + ORDER BY pc.party_id, ph.vega_time ASC +) +UPDATE positions_current +SET loss = updated_pnl.correct_loss, + loss_socialisation_amount = updated_pnl.correct_loss_soc, + realised_pnl = updated_pnl.correct_pnl, + pending_realised_pnl = updated_pnl.correct_ppnl, + adjustment = updated_pnl.correct_adj +FROM updated_pnl +WHERE party_id = updated_pnl.pid AND market_id = updated_pnl.mid; + +-- +goose Down +-- nothing diff --git a/datanode/sqlstore/migrations/0113_add_proposed_fee.sql b/datanode/sqlstore/migrations/0113_add_proposed_fee.sql new file mode 100644 index 00000000000..f143fb89265 --- /dev/null +++ b/datanode/sqlstore/migrations/0113_add_proposed_fee.sql @@ -0,0 +1,7 @@ +-- +goose Up + +ALTER TABLE amms ADD COLUMN IF NOT EXISTS proposed_fee numeric; + +-- +goose Down + +ALTER TABLE amms DROP COLUMN IF EXISTS proposed_fee; diff --git a/datanode/sqlstore/migrations/0114_add_long_block_auction_trigger.sql b/datanode/sqlstore/migrations/0114_add_long_block_auction_trigger.sql new file mode 100644 index 00000000000..3f04e1dacfc --- /dev/null +++ b/datanode/sqlstore/migrations/0114_add_long_block_auction_trigger.sql @@ -0,0 +1,4 @@ +-- +goose Up + +ALTER TYPE auction_trigger_type ADD VALUE IF NOT EXISTS 'AUCTION_TRIGGER_LONG_BLOCK'; +ALTER TYPE market_trading_mode_type ADD VALUE IF NOT EXISTS 'TRADING_MODE_LONG_BLOCK_AUCTION'; \ No newline at end of file diff --git a/datanode/sqlstore/migrations/0115_add_amm_curve.sql b/datanode/sqlstore/migrations/0115_add_amm_curve.sql new file mode 100644 index 00000000000..0481b54449b --- /dev/null +++ b/datanode/sqlstore/migrations/0115_add_amm_curve.sql @@ -0,0 +1,13 @@ +-- +goose Up + +ALTER TABLE amms ADD COLUMN IF NOT EXISTS lower_virtual_liquidity numeric, + ADD COLUMN IF NOT EXISTS upper_virtual_liquidity numeric, + ADD COLUMN IF NOT EXISTS lower_theoretical_position numeric, + ADD COLUMN IF NOT EXISTS upper_theoretical_position numeric; + +-- +goose Down + +ALTER TABLE amms DROP COLUMN IF EXISTS lower_virtual_liquidity, + DROP COLUMN IF EXISTS upper_virtual_liquidity, + DROP COLUMN IF EXISTS lower_theoretical_position, + DROP COLUMN IF EXISTS upper_theoretical_position; diff --git a/datanode/sqlstore/network_limits.go b/datanode/sqlstore/network_limits.go index b1f9a954119..c2605b8bd47 100644 --- a/datanode/sqlstore/network_limits.go +++ b/datanode/sqlstore/network_limits.go @@ -37,7 +37,7 @@ func NewNetworkLimits(connectionSource *ConnectionSource) *NetworkLimits { // in one block, does occur). func (nl *NetworkLimits) Add(ctx context.Context, limits entities.NetworkLimits) error { defer metrics.StartSQLQuery("NetworkLimits", "Add")() - _, err := nl.Connection.Exec(ctx, ` + _, err := nl.Exec(ctx, ` INSERT INTO network_limits( tx_hash, vega_time, @@ -74,6 +74,6 @@ func (nl *NetworkLimits) Add(ctx context.Context, limits entities.NetworkLimits) func (nl *NetworkLimits) GetLatest(ctx context.Context) (entities.NetworkLimits, error) { networkLimits := entities.NetworkLimits{} defer metrics.StartSQLQuery("NetworkLimits", "GetLatest")() - return networkLimits, nl.wrapE(pgxscan.Get(ctx, nl.Connection, &networkLimits, + return networkLimits, nl.wrapE(pgxscan.Get(ctx, nl.ConnectionSource, &networkLimits, `SELECT * FROM network_limits ORDER BY vega_time DESC limit 1;`)) } diff --git a/datanode/sqlstore/network_parameters.go b/datanode/sqlstore/network_parameters.go index 8292b9b781f..67bd4f986cd 100644 --- a/datanode/sqlstore/network_parameters.go +++ b/datanode/sqlstore/network_parameters.go @@ -50,7 +50,7 @@ func (np *NetworkParameters) Add(ctx context.Context, r entities.NetworkParamete defer np.cacheLock.Unlock() defer metrics.StartSQLQuery("NetworkParameters", "Add")() - _, err := np.Connection.Exec(ctx, + _, err := np.Exec(ctx, `INSERT INTO network_parameters( key, value, @@ -80,7 +80,7 @@ func (np *NetworkParameters) GetByKey(ctx context.Context, key string) (entities query := `SELECT * FROM network_parameters_current where key = $1` defer metrics.StartSQLQuery("NetworkParameters", "GetByKey")() - err := pgxscan.Get(ctx, np.Connection, ¶meter, query, key) + err := pgxscan.Get(ctx, np.ConnectionSource, ¶meter, query, key) if err != nil { return entities.NetworkParameter{}, np.wrapE(err) } @@ -95,7 +95,7 @@ func (np *NetworkParameters) GetByTxHash(ctx context.Context, txHash entities.Tx var parameters []entities.NetworkParameter query := `SELECT * FROM network_parameters WHERE tx_hash = $1` - err := pgxscan.Select(ctx, np.Connection, ¶meters, query, txHash) + err := pgxscan.Select(ctx, np.ConnectionSource, ¶meters, query, txHash) if err != nil { return nil, np.wrapE(err) } @@ -124,7 +124,7 @@ func (np *NetworkParameters) GetAll(ctx context.Context, pagination entities.Cur return nil, pageInfo, err } - if err = pgxscan.Select(ctx, np.Connection, &nps, query, args...); err != nil { + if err = pgxscan.Select(ctx, np.ConnectionSource, &nps, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("could not get network parameters: %w", err) } diff --git a/datanode/sqlstore/node.go b/datanode/sqlstore/node.go index 015849dd6e5..b382b6660a1 100644 --- a/datanode/sqlstore/node.go +++ b/datanode/sqlstore/node.go @@ -120,7 +120,7 @@ func selectNodeQuery() string { func (store *Node) UpsertNode(ctx context.Context, node *entities.Node) error { defer metrics.StartSQLQuery("Node", "UpsertNode")() - _, err := store.Connection.Exec(ctx, ` + _, err := store.Exec(ctx, ` INSERT INTO nodes ( id, vega_pub_key, @@ -166,7 +166,7 @@ func (store *Node) UpsertNode(ctx context.Context, node *entities.Node) error { // AddNodeAnnouncedEvent store data about which epoch a particular node was added or removed from the roster of validators. func (store *Node) AddNodeAnnouncedEvent(ctx context.Context, nodeID string, vegatime time.Time, aux *entities.ValidatorUpdateAux) error { defer metrics.StartSQLQuery("Node", "AddNodeAnnouncedEvent")() - _, err := store.Connection.Exec(ctx, ` + _, err := store.Exec(ctx, ` INSERT INTO nodes_announced ( node_id, epoch_seq, @@ -190,7 +190,7 @@ func (store *Node) AddNodeAnnouncedEvent(ctx context.Context, nodeID string, veg func (store *Node) UpsertRanking(ctx context.Context, rs *entities.RankingScore, aux *entities.RankingScoreAux) error { defer metrics.StartSQLQuery("Node", "UpsertRanking")() - _, err := store.Connection.Exec(ctx, ` + _, err := store.Exec(ctx, ` INSERT INTO ranking_scores ( node_id, epoch_seq, @@ -232,7 +232,7 @@ func (store *Node) UpsertRanking(ctx context.Context, rs *entities.RankingScore, func (store *Node) UpsertScore(ctx context.Context, rs *entities.RewardScore, aux *entities.RewardScoreAux) error { defer metrics.StartSQLQuery("Node", "UpsertScore")() - _, err := store.Connection.Exec(ctx, ` + _, err := store.Exec(ctx, ` INSERT INTO reward_scores ( node_id, epoch_seq, @@ -264,7 +264,7 @@ func (store *Node) UpsertScore(ctx context.Context, rs *entities.RewardScore, au func (store *Node) UpdatePublicKey(ctx context.Context, kr *entities.KeyRotation) error { defer metrics.StartSQLQuery("Node", "UpdatePublicKey")() - _, err := store.Connection.Exec(ctx, `UPDATE nodes SET vega_pub_key = $1 WHERE id = $2`, kr.NewPubKey, kr.NodeID) + _, err := store.Exec(ctx, `UPDATE nodes SET vega_pub_key = $1 WHERE id = $2`, kr.NewPubKey, kr.NodeID) return err } @@ -272,7 +272,7 @@ func (store *Node) UpdatePublicKey(ctx context.Context, kr *entities.KeyRotation func (store *Node) UpdateEthereumAddress(ctx context.Context, kr entities.EthereumKeyRotation) error { defer metrics.StartSQLQuery("Node", "UpdateEthereumPublicKey")() - _, err := store.Connection.Exec(ctx, `UPDATE nodes SET ethereum_address = $1 WHERE id = $2`, kr.NewAddress, kr.NodeID) + _, err := store.Exec(ctx, `UPDATE nodes SET ethereum_address = $1 WHERE id = $2`, kr.NewAddress, kr.NodeID) return err } @@ -312,7 +312,7 @@ func (store *Node) GetNodeData(ctx context.Context, epochSeq uint64) (entities.N ` nodeData := entities.NodeData{} - err := pgxscan.Get(ctx, store.Connection, &nodeData, query, epochSeq) + err := pgxscan.Get(ctx, store.ConnectionSource, &nodeData, query, epochSeq) if err != nil { return nodeData, store.wrapE(err) } @@ -378,7 +378,7 @@ func (store *Node) GetNodes(ctx context.Context, epochSeq uint64, pagination ent return nil, pageInfo, err } - if err = pgxscan.Select(ctx, store.Connection, &nodes, query, args...); err != nil { + if err = pgxscan.Select(ctx, store.ConnectionSource, &nodes, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("could not get nodes: %w", err) } @@ -394,7 +394,7 @@ func (store *Node) GetNodeByID(ctx context.Context, nodeID string, epochSeq uint id := entities.NodeID(nodeID) query := fmt.Sprintf("%s AND nodes.id=$2", selectNodeQuery()) - return node, store.wrapE(pgxscan.Get(ctx, store.Connection, &node, query, epochSeq, id)) + return node, store.wrapE(pgxscan.Get(ctx, store.ConnectionSource, &node, query, epochSeq, id)) } func (store *Node) GetNodeTxHash(ctx context.Context, nodeID string, epochSeq uint64) (entities.Node, error) { @@ -404,7 +404,7 @@ func (store *Node) GetNodeTxHash(ctx context.Context, nodeID string, epochSeq ui id := entities.NodeID(nodeID) query := fmt.Sprintf("%s AND nodes.id=$2", selectNodeQuery()) - return node, store.wrapE(pgxscan.Get(ctx, store.Connection, &node, query, epochSeq, id)) + return node, store.wrapE(pgxscan.Get(ctx, store.ConnectionSource, &node, query, epochSeq, id)) } func (store *Node) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]entities.NodeBasic, error) { @@ -414,7 +414,7 @@ func (store *Node) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]e query := `SELECT id, vega_pub_key, tendermint_pub_key, ethereum_address, name, location, info_url, avatar_url, status FROM nodes WHERE tx_hash = $1` - if err := pgxscan.Select(ctx, store.Connection, &nodes, query, txHash); err != nil { + if err := pgxscan.Select(ctx, store.ConnectionSource, &nodes, query, txHash); err != nil { return nil, store.wrapE(err) } diff --git a/datanode/sqlstore/node_test.go b/datanode/sqlstore/node_test.go index b977d2d1870..5e1f736d964 100644 --- a/datanode/sqlstore/node_test.go +++ b/datanode/sqlstore/node_test.go @@ -609,7 +609,7 @@ func TestNodeValidatorStatusEnum(t *testing.T) { } addRankingScore(t, ctx, ns, node1, score) var got entities.RankingScore - require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got, ` + require.NoError(t, pgxscan.Get(ctx, connectionSource, &got, ` SELECT stake_score, performance_score, diff --git a/datanode/sqlstore/notary.go b/datanode/sqlstore/notary.go index 6f69661158d..011f790e686 100644 --- a/datanode/sqlstore/notary.go +++ b/datanode/sqlstore/notary.go @@ -47,7 +47,7 @@ func (n *Notary) Add(ctx context.Context, ns *entities.NodeSignature) error { VALUES ($1, $2, $3, $4, $5) ON CONFLICT (resource_id, sig) DO NOTHING` - if _, err := n.Connection.Exec(ctx, query, + if _, err := n.Exec(ctx, query, ns.ResourceID, ns.Sig, ns.Kind, @@ -84,7 +84,7 @@ func (n *Notary) GetByResourceID(ctx context.Context, id string, pagination enti return ns, pageInfo, err } - if err = pgxscan.Select(ctx, n.Connection, &ns, query, args...); err != nil { + if err = pgxscan.Select(ctx, n.ConnectionSource, &ns, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("could not get node signatures for resource: %w", err) } @@ -98,7 +98,7 @@ func (n *Notary) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]ent var ns []entities.NodeSignature query := "SELECT resource_id, sig, kind, tx_hash, vega_time FROM node_signatures WHERE tx_hash=$1" - if err := pgxscan.Select(ctx, n.Connection, &ns, query, txHash); err != nil { + if err := pgxscan.Select(ctx, n.ConnectionSource, &ns, query, txHash); err != nil { return nil, fmt.Errorf("could not get node signatures for tx hash: %w", err) } diff --git a/datanode/sqlstore/notary_test.go b/datanode/sqlstore/notary_test.go index 3a53db51063..62bb2bd9f69 100644 --- a/datanode/sqlstore/notary_test.go +++ b/datanode/sqlstore/notary_test.go @@ -39,7 +39,7 @@ func setupNotaryStoreTests(t *testing.T) (*sqlstore.Notary, *sqlstore.Blocks, sq t.Helper() ns := sqlstore.NewNotary(connectionSource) bs := sqlstore.NewBlocks(connectionSource) - return ns, bs, connectionSource.Connection + return ns, bs, connectionSource } func testAddSignatures(t *testing.T) { diff --git a/datanode/sqlstore/oracle_data.go b/datanode/sqlstore/oracle_data.go index f746a3ffc63..d7ccd73403a 100644 --- a/datanode/sqlstore/oracle_data.go +++ b/datanode/sqlstore/oracle_data.go @@ -59,7 +59,7 @@ func (od *OracleData) Add(ctx context.Context, oracleData *entities.OracleData) defer metrics.StartSQLQuery("OracleData", "Add")() query := fmt.Sprintf("insert into oracle_data(%s) values ($1, $2, $3, $4, $5, $6, $7, $8)", sqlOracleDataColumns) - if _, err := od.Connection.Exec( + if _, err := od.Exec( ctx, query, oracleData.ExternalData.Data.Signers, oracleData.ExternalData.Data.Data, oracleData.ExternalData.Data.MetaData, oracleData.ExternalData.Data.BroadcastAt, @@ -71,7 +71,7 @@ func (od *OracleData) Add(ctx context.Context, oracleData *entities.OracleData) } query2 := "insert into oracle_data_oracle_specs(vega_time, seq_num, spec_id) values ($1, $2, unnest($3::bytea[]))" - if _, err := od.Connection.Exec( + if _, err := od.Exec( ctx, query2, oracleData.ExternalData.Data.VegaTime, oracleData.ExternalData.Data.SeqNum, oracleData.ExternalData.Data.MatchedSpecIds, ); err != nil { @@ -85,7 +85,7 @@ func (od *OracleData) Add(ctx context.Context, oracleData *entities.OracleData) func (od *OracleData) ListOracleData(ctx context.Context, id string, pagination entities.Pagination) ([]entities.OracleData, entities.PageInfo, error) { switch p := pagination.(type) { case entities.CursorPagination: - return listOracleDataBySpecIDCursorPagination(ctx, od.Connection, id, p) + return listOracleDataBySpecIDCursorPagination(ctx, od.ConnectionSource, id, p) default: panic("unsupported pagination") } @@ -96,7 +96,7 @@ func (od *OracleData) GetByTxHash(ctx context.Context, txHash entities.TxHash) ( var data []entities.Data query := fmt.Sprintf(`%s WHERE tx_hash = $1`, oracleDataQuery) - err := pgxscan.Select(ctx, od.Connection, &data, query, txHash) + err := pgxscan.Select(ctx, od.ConnectionSource, &data, query, txHash) if err != nil { return nil, err } diff --git a/datanode/sqlstore/oracle_data_test.go b/datanode/sqlstore/oracle_data_test.go index 264c693378f..0f8d7313496 100644 --- a/datanode/sqlstore/oracle_data_test.go +++ b/datanode/sqlstore/oracle_data_test.go @@ -43,7 +43,7 @@ func setupOracleDataTest(t *testing.T) (*sqlstore.Blocks, *sqlstore.OracleData, t.Helper() bs := sqlstore.NewBlocks(connectionSource) od := sqlstore.NewOracleData(connectionSource) - return bs, od, connectionSource.Connection + return bs, od, connectionSource } func testAddAndRetrieveOracleDataWithError(t *testing.T) { diff --git a/datanode/sqlstore/oracle_spec.go b/datanode/sqlstore/oracle_spec.go index 005497a22cd..06c71266d4b 100644 --- a/datanode/sqlstore/oracle_spec.go +++ b/datanode/sqlstore/oracle_spec.go @@ -58,7 +58,7 @@ set defer metrics.StartSQLQuery("OracleSpec", "Upsert")() specData := spec.ExternalDataSourceSpec.Spec - if _, err := os.Connection.Exec(ctx, query, specData.ID, specData.CreatedAt, specData.UpdatedAt, specData.Data, + if _, err := os.Exec(ctx, query, specData.ID, specData.CreatedAt, specData.UpdatedAt, specData.Data, specData.Status, specData.TxHash, specData.VegaTime); err != nil { return err } @@ -74,7 +74,7 @@ func (os *OracleSpec) GetSpecByID(ctx context.Context, specID string) (*entities where id = $1 order by id, vega_time desc`, getOracleSpecsQuery()) - err := pgxscan.Get(ctx, os.Connection, &spec, query, entities.SpecID(specID)) + err := pgxscan.Get(ctx, os.ConnectionSource, &spec, query, entities.SpecID(specID)) if err != nil { return nil, os.wrapE(err) } @@ -90,7 +90,7 @@ func (os *OracleSpec) GetByTxHash(ctx context.Context, txHash entities.TxHash) ( var specs []*entities.DataSourceSpec query := "SELECT * FROM oracle_specs WHERE tx_hash = $1" - err := pgxscan.Select(ctx, os.Connection, &specs, query, txHash) + err := pgxscan.Select(ctx, os.ConnectionSource, &specs, query, txHash) if err != nil { return nil, os.wrapE(err) } @@ -145,7 +145,7 @@ func (os *OracleSpec) getSpecsWithPageInfo(ctx context.Context, pagination entit return nil, pageInfo, err } - if err = pgxscan.Select(ctx, os.Connection, &specs, query, args...); err != nil { + if err = pgxscan.Select(ctx, os.ConnectionSource, &specs, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("querying oracle specs: %w", err) } diff --git a/datanode/sqlstore/oracle_spec_test.go b/datanode/sqlstore/oracle_spec_test.go index e42949a23be..f41f807585a 100644 --- a/datanode/sqlstore/oracle_spec_test.go +++ b/datanode/sqlstore/oracle_spec_test.go @@ -46,7 +46,7 @@ func setupOracleSpecTest(t *testing.T) (*sqlstore.Blocks, *sqlstore.OracleSpec, bs := sqlstore.NewBlocks(connectionSource) os := sqlstore.NewOracleSpec(connectionSource) - return bs, os, connectionSource.Connection + return bs, os, connectionSource } func testInsertIntoNewBlock(t *testing.T) { diff --git a/datanode/sqlstore/orders.go b/datanode/sqlstore/orders.go index 38c696ca4ad..ecb6b45df97 100644 --- a/datanode/sqlstore/orders.go +++ b/datanode/sqlstore/orders.go @@ -68,7 +68,7 @@ func NewOrders(connectionSource *ConnectionSource) *Orders { func (os *Orders) Flush(ctx context.Context) ([]entities.Order, error) { defer metrics.StartSQLQuery("Orders", "Flush")() - return os.batcher.Flush(ctx, os.Connection) + return os.batcher.Flush(ctx, os.ConnectionSource) } // Add inserts an order update row into the database if a row for this (block time, order id, version) @@ -85,7 +85,7 @@ func (os *Orders) GetAll(ctx context.Context) ([]entities.Order, error) { defer metrics.StartSQLQuery("Orders", "GetAll")() orders := []entities.Order{} query := fmt.Sprintf("SELECT %s FROM orders", sqlOrderColumns) - err := pgxscan.Select(ctx, os.Connection, &orders, query) + err := pgxscan.Select(ctx, os.ConnectionSource, &orders, query) return orders, err } @@ -98,10 +98,10 @@ func (os *Orders) GetOrder(ctx context.Context, orderIDStr string, version *int3 defer metrics.StartSQLQuery("Orders", "GetByOrderID")() if version != nil && *version > 0 { query := fmt.Sprintf("SELECT %s FROM orders_current_versions WHERE id=$1 and version=$2", sqlOrderColumns) - err = pgxscan.Get(ctx, os.Connection, &order, query, orderID, version) + err = pgxscan.Get(ctx, os.ConnectionSource, &order, query, orderID, version) } else { query := fmt.Sprintf("SELECT %s FROM orders_current_desc WHERE id=$1", sqlOrderColumns) - err = pgxscan.Get(ctx, os.Connection, &order, query, orderID) + err = pgxscan.Get(ctx, os.ConnectionSource, &order, query, orderID) } return order, os.wrapE(err) @@ -135,7 +135,7 @@ func (os *Orders) GetByMarketAndID(ctx context.Context, marketIDstr string, orde // so this is a more optimal way of querying the data. query := fmt.Sprintf(`SELECT %s from orders_live WHERE market_id=$1 AND id IN (%s) order by id`, sqlOrderColumns, strings.Join(in, ", ")) orders := make([]entities.Order, 0, len(orderIDs)) - err := pgxscan.Select(ctx, os.Connection, &orders, query, bind...) + err := pgxscan.Select(ctx, os.ConnectionSource, &orders, query, bind...) return orders, os.wrapE(err) } @@ -146,7 +146,7 @@ func (os *Orders) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]en orders := []entities.Order{} query := fmt.Sprintf(`SELECT %s FROM orders WHERE tx_hash=$1`, sqlOrderColumns) - err := pgxscan.Select(ctx, os.Connection, &orders, query, txHash) + err := pgxscan.Select(ctx, os.ConnectionSource, &orders, query, txHash) if err != nil { return nil, fmt.Errorf("querying orders: %w", err) } @@ -172,7 +172,7 @@ func (os *Orders) GetLiveOrders(ctx context.Context) ([]entities.Order, error) { func (os *Orders) queryOrders(ctx context.Context, query string, args []interface{}) ([]entities.Order, error) { orders := []entities.Order{} - err := pgxscan.Select(ctx, os.Connection, &orders, query, args...) + err := pgxscan.Select(ctx, os.ConnectionSource, &orders, query, args...) if err != nil { return nil, fmt.Errorf("querying orders: %w", err) } @@ -207,7 +207,7 @@ func (os *Orders) queryOrdersWithCursorPagination(ctx context.Context, query str if err != nil { return orders, pageInfo, err } - err = pgxscan.Select(ctx, os.Connection, &orders, query, args...) + err = pgxscan.Select(ctx, os.ConnectionSource, &orders, query, args...) if err != nil { return nil, pageInfo, fmt.Errorf("querying orders: %w", err) } diff --git a/datanode/sqlstore/paid_liquidity_fee_stats.go b/datanode/sqlstore/paid_liquidity_fee_stats.go index 6291e4ad5da..bba1ec3b771 100644 --- a/datanode/sqlstore/paid_liquidity_fee_stats.go +++ b/datanode/sqlstore/paid_liquidity_fee_stats.go @@ -42,7 +42,7 @@ func (rfs *PaidLiquidityFeesStats) Add(ctx context.Context, stats *entities.Paid // It's possible that a market closes in the same block as an end of epoch event. // In this case, the market close event will cause a paid liquidity fee stats event to be sent // as well as the epoch end event. In this case we just want to ignore the second event. - _, err := rfs.Connection.Exec( + _, err := rfs.Exec( ctx, `INSERT INTO paid_liquidity_fees( market_id, @@ -69,6 +69,7 @@ func (lfs *PaidLiquidityFeesStats) List( epochSeq *uint64, partyIDs []string, pagination entities.CursorPagination, + epochFrom, epochTo *uint64, ) ([]entities.PaidLiquidityFeesStats, entities.PageInfo, error) { defer metrics.StartSQLQuery("PaidLiquidityFeesStats", "List")() var ( @@ -81,11 +82,22 @@ func (lfs *PaidLiquidityFeesStats) List( whereClauses := []string{} - if (marketID == nil || assetID == nil) && epochSeq == nil { + if (marketID == nil || assetID == nil) && epochSeq == nil && epochFrom == nil && epochTo == nil { whereClauses = append(whereClauses, "epoch_seq = (SELECT MAX(epoch_seq) FROM paid_liquidity_fees)") } - if epochSeq != nil { + // to from range set, but wrong way around + if epochFrom != nil && epochTo != nil && *epochFrom > *epochTo { + epochTo, epochFrom = epochFrom, epochTo + } + if epochFrom != nil { + whereClauses = append(whereClauses, fmt.Sprintf("epoch_seq >= %s", nextBindVar(&args, *epochFrom))) + } + if epochTo != nil { + whereClauses = append(whereClauses, fmt.Sprintf("epoch_seq <= %s", nextBindVar(&args, *epochTo))) + } + // @TODO remove precise epoch sequence? + if epochFrom == nil && epochTo == nil && epochSeq != nil { whereClauses = append(whereClauses, fmt.Sprintf("epoch_seq = %s", nextBindVar(&args, *epochSeq))) } @@ -126,7 +138,7 @@ func (lfs *PaidLiquidityFeesStats) List( return nil, pageInfo, err } - if err := pgxscan.Select(ctx, lfs.Connection, &stats, query, args...); err != nil { + if err := pgxscan.Select(ctx, lfs.ConnectionSource, &stats, query, args...); err != nil { return nil, pageInfo, err } diff --git a/datanode/sqlstore/paid_liquidity_fee_stats_test.go b/datanode/sqlstore/paid_liquidity_fee_stats_test.go index cdd42ed2901..f384158feb1 100644 --- a/datanode/sqlstore/paid_liquidity_fee_stats_test.go +++ b/datanode/sqlstore/paid_liquidity_fee_stats_test.go @@ -86,7 +86,7 @@ func testAddPaidLiquidityFeesStatsEpochIfNotExists(t *testing.T) { // Check that the stats were added var got entities.PaidLiquidityFeesStats - err = pgxscan.Get(ctx, connectionSource.Connection, &got, + err = pgxscan.Get(ctx, connectionSource, &got, `SELECT market_id, asset_id, epoch_seq, total_fees_paid, fees_paid_per_party as fees_per_party FROM paid_liquidity_fees WHERE market_id = $1 AND asset_id = $2 AND epoch_seq = $3`, market.ID, asset.ID, want.EpochSeq, @@ -250,7 +250,7 @@ func testListPaidLiquidityFeesStatsForMarketAndEpoch(t *testing.T) { // get the stats for the first market and epoch want := stats[0:1] - got, _, err := stores.ls.List(ctx, &want[0].MarketID, nil, &want[0].EpochSeq, nil, pagination) + got, _, err := stores.ls.List(ctx, &want[0].MarketID, nil, &want[0].EpochSeq, nil, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) @@ -258,7 +258,7 @@ func testListPaidLiquidityFeesStatsForMarketAndEpoch(t *testing.T) { // get the stats for the second market and epoch want = stats[3:4] - got, _, err = stores.ls.List(ctx, &want[0].MarketID, nil, &want[0].EpochSeq, nil, pagination) + got, _, err = stores.ls.List(ctx, &want[0].MarketID, nil, &want[0].EpochSeq, nil, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) @@ -274,7 +274,7 @@ func testListPaidLiquidityFeesStatsForAssetAndEpoch(t *testing.T) { // get the stats for the first market and epoch want := stats[1:2] - got, _, err := stores.ls.List(ctx, nil, &want[0].AssetID, &want[0].EpochSeq, nil, pagination) + got, _, err := stores.ls.List(ctx, nil, &want[0].AssetID, &want[0].EpochSeq, nil, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) @@ -282,7 +282,7 @@ func testListPaidLiquidityFeesStatsForAssetAndEpoch(t *testing.T) { // get the stats for the second market and epoch want = stats[4:5] - got, _, err = stores.ls.List(ctx, nil, &want[0].AssetID, &want[0].EpochSeq, nil, pagination) + got, _, err = stores.ls.List(ctx, nil, &want[0].AssetID, &want[0].EpochSeq, nil, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) @@ -298,7 +298,7 @@ func testListPaidLiquidityFeesStatsForMarketLatest(t *testing.T) { // get the stats for the first market and epoch want := stats[2:3] - got, _, err := stores.ls.List(ctx, &want[0].MarketID, nil, nil, nil, pagination) + got, _, err := stores.ls.List(ctx, &want[0].MarketID, nil, nil, nil, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) @@ -306,7 +306,7 @@ func testListPaidLiquidityFeesStatsForMarketLatest(t *testing.T) { // get the stats for the second market and epoch want = stats[5:6] - got, _, err = stores.ls.List(ctx, &want[0].MarketID, nil, nil, nil, pagination) + got, _, err = stores.ls.List(ctx, &want[0].MarketID, nil, nil, nil, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) @@ -322,7 +322,7 @@ func testListPaidLiquidityFeesStatsForAssetLatest(t *testing.T) { // get the stats for the first market and epoch want := stats[2:3] - got, _, err := stores.ls.List(ctx, nil, &want[0].AssetID, nil, nil, pagination) + got, _, err := stores.ls.List(ctx, nil, &want[0].AssetID, nil, nil, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) @@ -330,7 +330,7 @@ func testListPaidLiquidityFeesStatsForAssetLatest(t *testing.T) { // get the stats for the second market and epoch want = stats[5:6] - got, _, err = stores.ls.List(ctx, nil, &want[0].AssetID, nil, nil, pagination) + got, _, err = stores.ls.List(ctx, nil, &want[0].AssetID, nil, nil, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) @@ -349,7 +349,7 @@ func testListPaidLiquidityFeesStatsForPartyAndEpoch(t *testing.T) { want[0].FeesPerParty = want[0].FeesPerParty[:1] want[1].FeesPerParty = want[1].FeesPerParty[:1] - got, _, err := stores.ls.List(ctx, nil, nil, &want[0].EpochSeq, []string{want[0].FeesPerParty[0].Party}, pagination) + got, _, err := stores.ls.List(ctx, nil, nil, &want[0].EpochSeq, []string{want[0].FeesPerParty[0].Party}, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) @@ -369,7 +369,7 @@ func testListPaidLiquidityFeesStatsForPartyLatest(t *testing.T) { want[0].FeesPerParty = want[0].FeesPerParty[:1] want[1].FeesPerParty = want[1].FeesPerParty[:1] - got, _, err := stores.ls.List(ctx, nil, nil, nil, []string{want[0].FeesPerParty[0].Party}, pagination) + got, _, err := stores.ls.List(ctx, nil, nil, nil, []string{want[0].FeesPerParty[0].Party}, pagination, nil, nil) require.NoError(t, err) assert.Len(t, got, len(want)) diff --git a/datanode/sqlstore/parties.go b/datanode/sqlstore/parties.go index a37b216c6a2..9cc161897a2 100644 --- a/datanode/sqlstore/parties.go +++ b/datanode/sqlstore/parties.go @@ -52,7 +52,7 @@ func NewParties(connectionSource *ConnectionSource) *Parties { // bus, but nonetheless is necessary. func (ps *Parties) Initialise(ctx context.Context) { defer metrics.StartSQLQuery("Parties", "Initialise")() - _, err := ps.Connection.Exec(ctx, + _, err := ps.Exec(ctx, `INSERT INTO parties(id, tx_hash, alias) VALUES ($1, $2, $3) ON CONFLICT (id) DO NOTHING`, entities.PartyID("network"), entities.TxHash("01"), "network") if err != nil { @@ -62,7 +62,7 @@ func (ps *Parties) Initialise(ctx context.Context) { func (ps *Parties) Add(ctx context.Context, p entities.Party) error { defer metrics.StartSQLQuery("Parties", "Add")() - _, err := ps.Connection.Exec(ctx, + _, err := ps.Exec(ctx, `INSERT INTO parties(id, tx_hash, vega_time) VALUES ($1, $2, $3) ON CONFLICT (id) DO NOTHING`, @@ -75,7 +75,7 @@ func (ps *Parties) Add(ctx context.Context, p entities.Party) error { func (ps *Parties) UpdateProfile(ctx context.Context, p *entities.PartyProfile) error { defer metrics.StartSQLQuery("Parties", "Add")() - _, err := ps.Connection.Exec(ctx, + _, err := ps.Exec(ctx, `UPDATE parties SET alias = $1, metadata = $2 WHERE id = $3`, p.Alias, p.Metadata, @@ -113,7 +113,7 @@ func (ps *Parties) ListProfiles(ctx context.Context, ids []string, pagination en return nil, pageInfo, err } - if err := pgxscan.Select(ctx, ps.Connection, &profiles, query, args...); err != nil { + if err := pgxscan.Select(ctx, ps.ConnectionSource, &profiles, query, args...); err != nil { return nil, pageInfo, err } @@ -124,7 +124,7 @@ func (ps *Parties) ListProfiles(ctx context.Context, ids []string, pagination en func (ps *Parties) GetByID(ctx context.Context, id string) (entities.Party, error) { a := entities.Party{} defer metrics.StartSQLQuery("Parties", "GetByID")() - err := pgxscan.Get(ctx, ps.Connection, &a, + err := pgxscan.Get(ctx, ps.ConnectionSource, &a, `SELECT id, tx_hash, vega_time FROM parties WHERE id=$1`, entities.PartyID(id)) @@ -136,7 +136,7 @@ func (ps *Parties) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]e defer metrics.StartSQLQuery("Parties", "GetByTxHash")() var parties []entities.Party - err := pgxscan.Select(ctx, ps.Connection, &parties, `SELECT id, tx_hash, vega_time FROM parties WHERE tx_hash=$1`, txHash) + err := pgxscan.Select(ctx, ps.ConnectionSource, &parties, `SELECT id, tx_hash, vega_time FROM parties WHERE tx_hash=$1`, txHash) if err != nil { return nil, ps.wrapE(err) } @@ -147,7 +147,7 @@ func (ps *Parties) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]e func (ps *Parties) GetAll(ctx context.Context) ([]entities.Party, error) { parties := []entities.Party{} defer metrics.StartSQLQuery("Parties", "GetAll")() - err := pgxscan.Select(ctx, ps.Connection, &parties, ` + err := pgxscan.Select(ctx, ps.ConnectionSource, &parties, ` SELECT id, tx_hash, vega_time FROM parties`) return parties, err @@ -183,7 +183,7 @@ func (ps *Parties) GetAllPaged(ctx context.Context, partyID string, pagination e return nil, pageInfo, err } - if err := pgxscan.Select(ctx, ps.Connection, &parties, query, args...); err != nil { + if err := pgxscan.Select(ctx, ps.ConnectionSource, &parties, query, args...); err != nil { return nil, pageInfo, err } diff --git a/datanode/sqlstore/party_activity_streak.go b/datanode/sqlstore/party_activity_streak.go index 564b6d826a0..c78729f5aeb 100644 --- a/datanode/sqlstore/party_activity_streak.go +++ b/datanode/sqlstore/party_activity_streak.go @@ -41,7 +41,7 @@ func (pas *PartyActivityStreaks) Add( ) error { defer metrics.StartSQLQuery("PartyActivityStreaks", "Add")() - _, err := pas.Connection.Exec( + _, err := pas.Exec( ctx, partyActivityStreakAddQuery, activityStreak.Fields()...) return err @@ -71,7 +71,7 @@ func (pas *PartyActivityStreaks) Get( ) } - err := pgxscan.Select(ctx, pas.Connection, &activityStreak, query, args...) + err := pgxscan.Select(ctx, pas.ConnectionSource, &activityStreak, query, args...) if err != nil { return nil, err } diff --git a/datanode/sqlstore/party_locked_balance.go b/datanode/sqlstore/party_locked_balance.go index c8296213f40..45e75559f61 100644 --- a/datanode/sqlstore/party_locked_balance.go +++ b/datanode/sqlstore/party_locked_balance.go @@ -40,7 +40,7 @@ func (plb *PartyLockedBalance) Prune( currentEpoch uint64, ) error { defer metrics.StartSQLQuery("PartyLockedBalance", "Prune")() - _, err := plb.Connection.Exec( + _, err := plb.Exec( ctx, "DELETE FROM party_locked_balances_current WHERE until_epoch <= $1", currentEpoch, @@ -51,7 +51,7 @@ func (plb *PartyLockedBalance) Prune( func (plb *PartyLockedBalance) Add(ctx context.Context, balance entities.PartyLockedBalance) error { defer metrics.StartSQLQuery("PartyLockedBalance", "Add")() - _, err := plb.Connection.Exec(ctx, + _, err := plb.Exec(ctx, `INSERT INTO party_locked_balances(party_id, asset_id, at_epoch, until_epoch, balance, vega_time) VALUES ($1, $2, $3, $4, $5, $6) ON CONFLICT (vega_time, party_id, asset_id, until_epoch) DO NOTHING`, @@ -97,7 +97,7 @@ func (plb *PartyLockedBalance) Get(ctx context.Context, partyID *entities.PartyI query = fmt.Sprintf("%s %s", query, whereClause) var balances []entities.PartyLockedBalance - if err := pgxscan.Select(ctx, plb.Connection, &balances, query, args...); err != nil { + if err := pgxscan.Select(ctx, plb.ConnectionSource, &balances, query, args...); err != nil { return balances, err } diff --git a/datanode/sqlstore/party_locked_balance_test.go b/datanode/sqlstore/party_locked_balance_test.go index 97c9c494f56..ffb8e7948c4 100644 --- a/datanode/sqlstore/party_locked_balance_test.go +++ b/datanode/sqlstore/party_locked_balance_test.go @@ -168,12 +168,12 @@ func TestPartyLockedBalance_Add(t *testing.T) { var partyLockedBalances []entities.PartyLockedBalance var partyLockedBalancesCurrent []entities.PartyLockedBalance - err := pgxscan.Select(ctx, connectionSource.Connection, &partyLockedBalances, "SELECT * from party_locked_balances") + err := pgxscan.Select(ctx, connectionSource, &partyLockedBalances, "SELECT * from party_locked_balances") require.NoError(t, err) assert.Len(t, partyLockedBalances, 0) - err = pgxscan.Select(ctx, connectionSource.Connection, &partyLockedBalancesCurrent, "SELECT * from party_locked_balances_current") + err = pgxscan.Select(ctx, connectionSource, &partyLockedBalancesCurrent, "SELECT * from party_locked_balances_current") require.NoError(t, err) assert.Len(t, partyLockedBalancesCurrent, 0) @@ -193,14 +193,14 @@ func TestPartyLockedBalance_Add(t *testing.T) { err := plbs.Add(ctx, want) require.NoError(t, err) - err = pgxscan.Select(ctx, connectionSource.Connection, &partyLockedBalances, "SELECT * from party_locked_balances") + err = pgxscan.Select(ctx, connectionSource, &partyLockedBalances, "SELECT * from party_locked_balances") require.NoError(t, err) assert.Len(t, partyLockedBalances, 1) assert.Equal(t, want, partyLockedBalances[0]) t.Run("And a record into the party_locked_balances_current table if it doesn't already exist", func(t *testing.T) { - err = pgxscan.Select(ctx, connectionSource.Connection, &partyLockedBalancesCurrent, "SELECT * from party_locked_balances_current") + err = pgxscan.Select(ctx, connectionSource, &partyLockedBalancesCurrent, "SELECT * from party_locked_balances_current") require.NoError(t, err) assert.Len(t, partyLockedBalancesCurrent, 1) @@ -219,14 +219,14 @@ func TestPartyLockedBalance_Add(t *testing.T) { } err = plbs.Add(ctx, want2) - err = pgxscan.Select(ctx, connectionSource.Connection, &partyLockedBalances, "SELECT * from party_locked_balances order by vega_time") + err = pgxscan.Select(ctx, connectionSource, &partyLockedBalances, "SELECT * from party_locked_balances order by vega_time") require.NoError(t, err) assert.Len(t, partyLockedBalances, 2) assert.Equal(t, want, partyLockedBalances[0]) assert.Equal(t, want2, partyLockedBalances[1]) - err = pgxscan.Select(ctx, connectionSource.Connection, &partyLockedBalancesCurrent, "SELECT * from party_locked_balances_current") + err = pgxscan.Select(ctx, connectionSource, &partyLockedBalancesCurrent, "SELECT * from party_locked_balances_current") require.NoError(t, err) assert.Len(t, partyLockedBalancesCurrent, 1) diff --git a/datanode/sqlstore/party_vesting_balance.go b/datanode/sqlstore/party_vesting_balance.go index c4f7b389f55..a9101bca42b 100644 --- a/datanode/sqlstore/party_vesting_balance.go +++ b/datanode/sqlstore/party_vesting_balance.go @@ -37,7 +37,7 @@ func NewPartyVestingBalances(connectionSource *ConnectionSource) *PartyVestingBa func (plb *PartyVestingBalance) Add(ctx context.Context, balance entities.PartyVestingBalance) error { defer metrics.StartSQLQuery("PartyVestingBalance", "Add")() - _, err := plb.Connection.Exec(ctx, + _, err := plb.Exec(ctx, `INSERT INTO party_vesting_balances(party_id, asset_id, at_epoch, balance, vega_time) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (vega_time, party_id, asset_id) DO NOTHING`, @@ -84,7 +84,7 @@ func (plb *PartyVestingBalance) Get( query = fmt.Sprintf("%s %s", query, whereClause) var balances []entities.PartyVestingBalance - if err := pgxscan.Select(ctx, plb.Connection, &balances, query, args...); err != nil { + if err := pgxscan.Select(ctx, plb.ConnectionSource, &balances, query, args...); err != nil { return balances, err } diff --git a/datanode/sqlstore/party_vesting_balance_test.go b/datanode/sqlstore/party_vesting_balance_test.go index be50be84d3b..98f940db800 100644 --- a/datanode/sqlstore/party_vesting_balance_test.go +++ b/datanode/sqlstore/party_vesting_balance_test.go @@ -44,12 +44,12 @@ func TestPartyVestingBalance_Add(t *testing.T) { var partyVestingBalances []entities.PartyVestingBalance var partyVestingBalancesCurrent []entities.PartyVestingBalance - err := pgxscan.Select(ctx, connectionSource.Connection, &partyVestingBalances, "SELECT * from party_vesting_balances") + err := pgxscan.Select(ctx, connectionSource, &partyVestingBalances, "SELECT * from party_vesting_balances") require.NoError(t, err) assert.Len(t, partyVestingBalances, 0) - err = pgxscan.Select(ctx, connectionSource.Connection, &partyVestingBalancesCurrent, "SELECT * from party_vesting_balances_current") + err = pgxscan.Select(ctx, connectionSource, &partyVestingBalancesCurrent, "SELECT * from party_vesting_balances_current") require.NoError(t, err) assert.Len(t, partyVestingBalancesCurrent, 0) @@ -68,14 +68,14 @@ func TestPartyVestingBalance_Add(t *testing.T) { err := plbs.Add(ctx, want) require.NoError(t, err) - err = pgxscan.Select(ctx, connectionSource.Connection, &partyVestingBalances, "SELECT * from party_vesting_balances") + err = pgxscan.Select(ctx, connectionSource, &partyVestingBalances, "SELECT * from party_vesting_balances") require.NoError(t, err) assert.Len(t, partyVestingBalances, 1) assert.Equal(t, want, partyVestingBalances[0]) t.Run("And a record into the party_vesting_balances_current table if it doesn't already exist", func(t *testing.T) { - err = pgxscan.Select(ctx, connectionSource.Connection, &partyVestingBalancesCurrent, "SELECT * from party_vesting_balances_current") + err = pgxscan.Select(ctx, connectionSource, &partyVestingBalancesCurrent, "SELECT * from party_vesting_balances_current") require.NoError(t, err) assert.Len(t, partyVestingBalancesCurrent, 1) @@ -93,14 +93,14 @@ func TestPartyVestingBalance_Add(t *testing.T) { } err = plbs.Add(ctx, want2) - err = pgxscan.Select(ctx, connectionSource.Connection, &partyVestingBalances, "SELECT * from party_vesting_balances order by vega_time") + err = pgxscan.Select(ctx, connectionSource, &partyVestingBalances, "SELECT * from party_vesting_balances order by vega_time") require.NoError(t, err) assert.Len(t, partyVestingBalances, 2) assert.Equal(t, want, partyVestingBalances[0]) assert.Equal(t, want2, partyVestingBalances[1]) - err = pgxscan.Select(ctx, connectionSource.Connection, &partyVestingBalancesCurrent, "SELECT * from party_vesting_balances_current") + err = pgxscan.Select(ctx, connectionSource, &partyVestingBalancesCurrent, "SELECT * from party_vesting_balances_current") require.NoError(t, err) assert.Len(t, partyVestingBalancesCurrent, 1) diff --git a/datanode/sqlstore/positions.go b/datanode/sqlstore/positions.go index 6ee956e81e0..4c86939a89a 100644 --- a/datanode/sqlstore/positions.go +++ b/datanode/sqlstore/positions.go @@ -50,7 +50,7 @@ func NewPositions(connectionSource *ConnectionSource) *Positions { func (ps *Positions) Flush(ctx context.Context) ([]entities.Position, error) { defer metrics.StartSQLQuery("Positions", "Flush")() - return ps.batcher.Flush(ctx, ps.Connection) + return ps.batcher.Flush(ctx, ps.ConnectionSource) } func (ps *Positions) Add(ctx context.Context, p entities.Position) error { @@ -69,7 +69,7 @@ func (ps *Positions) GetByMarketAndParty(ctx context.Context, ) defer metrics.StartSQLQuery("Positions", "GetByMarketAndParty")() - return position, ps.wrapE(pgxscan.Get(ctx, ps.Connection, &position, + return position, ps.wrapE(pgxscan.Get(ctx, ps.ConnectionSource, &position, `SELECT * FROM positions_current WHERE market_id=$1 AND party_id=$2`, marketID, partyID)) } @@ -91,14 +91,14 @@ func (ps *Positions) GetByMarketAndParties(ctx context.Context, marketIDRaw stri positions := []entities.Position{} // build the query q := fmt.Sprintf(`SELECT * FROM positions_current WHERE market_id = $1 AND party_id IN (%s)`, strings.Join(in, ", ")) - err := pgxscan.Select(ctx, ps.Connection, &positions, q, bind...) + err := pgxscan.Select(ctx, ps.ConnectionSource, &positions, q, bind...) return positions, err } func (ps *Positions) GetByMarket(ctx context.Context, marketID string) ([]entities.Position, error) { defer metrics.StartSQLQuery("Positions", "GetByMarket")() positions := []entities.Position{} - err := pgxscan.Select(ctx, ps.Connection, &positions, + err := pgxscan.Select(ctx, ps.ConnectionSource, &positions, `SELECT * FROM positions_current WHERE market_id=$1`, entities.MarketID(marketID)) return positions, err @@ -107,7 +107,7 @@ func (ps *Positions) GetByMarket(ctx context.Context, marketID string) ([]entiti func (ps *Positions) GetByParty(ctx context.Context, partyID string) ([]entities.Position, error) { defer metrics.StartSQLQuery("Positions", "GetByParty")() positions := []entities.Position{} - err := pgxscan.Select(ctx, ps.Connection, &positions, + err := pgxscan.Select(ctx, ps.ConnectionSource, &positions, `SELECT * FROM positions_current WHERE party_id=$1`, entities.PartyID(partyID)) return positions, err @@ -174,7 +174,7 @@ func (ps *Positions) GetByPartyConnection(ctx context.Context, partyIDRaw []stri } var positions []entities.Position - if err = pgxscan.Select(ctx, ps.Connection, &positions, query, args...); err != nil { + if err = pgxscan.Select(ctx, ps.ConnectionSource, &positions, query, args...); err != nil { return nil, pageInfo, err } @@ -185,14 +185,14 @@ func (ps *Positions) GetByPartyConnection(ctx context.Context, partyIDRaw []stri func (ps *Positions) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]entities.Position, error) { defer metrics.StartSQLQuery("Positions", "GetByTxHash")() positions := []entities.Position{} - err := pgxscan.Select(ctx, ps.Connection, &positions, `SELECT * FROM positions WHERE tx_hash=$1`, txHash) + err := pgxscan.Select(ctx, ps.ConnectionSource, &positions, `SELECT * FROM positions WHERE tx_hash=$1`, txHash) return positions, err } func (ps *Positions) GetAll(ctx context.Context) ([]entities.Position, error) { defer metrics.StartSQLQuery("Positions", "GetAll")() positions := []entities.Position{} - err := pgxscan.Select(ctx, ps.Connection, &positions, + err := pgxscan.Select(ctx, ps.ConnectionSource, &positions, `SELECT * FROM positions_current`) return positions, err } diff --git a/datanode/sqlstore/proposals.go b/datanode/sqlstore/proposals.go index 2854061145f..40b67bff813 100644 --- a/datanode/sqlstore/proposals.go +++ b/datanode/sqlstore/proposals.go @@ -47,7 +47,7 @@ func NewProposals(connectionSource *ConnectionSource) *Proposals { func (ps *Proposals) Add(ctx context.Context, p entities.Proposal) error { defer metrics.StartSQLQuery("Proposals", "Add")() - _, err := ps.Connection.Exec(ctx, + _, err := ps.Exec(ctx, `INSERT INTO proposals( id, batch_id, @@ -89,7 +89,7 @@ func (ps *Proposals) getProposalsInBatch(ctx context.Context, batchID string) ([ var proposals []entities.Proposal query := `SELECT * FROM proposals_current WHERE batch_id=$1` - rows, err := ps.Connection.Query(ctx, query, entities.ProposalID(batchID)) + rows, err := ps.Query(ctx, query, entities.ProposalID(batchID)) if err != nil { return proposals, fmt.Errorf("querying proposals: %w", err) } @@ -132,8 +132,8 @@ func (ps *Proposals) GetByID(ctx context.Context, id string) (entities.Proposal, var p entities.Proposal query := `SELECT * FROM proposals_current WHERE id=$1` - if err := pgxscan.Get(ctx, ps.Connection, &p, query, entities.ProposalID(id)); err != nil { - return p, ps.wrapE(pgxscan.Get(ctx, ps.Connection, &p, query, entities.ProposalID(id))) + if err := pgxscan.Get(ctx, ps.ConnectionSource, &p, query, entities.ProposalID(id)); err != nil { + return p, ps.wrapE(pgxscan.Get(ctx, ps.ConnectionSource, &p, query, entities.ProposalID(id))) } p, err := ps.extendOrGetBatchProposal(ctx, p) @@ -150,8 +150,8 @@ func (ps *Proposals) GetByIDWithoutBatch(ctx context.Context, id string) (entiti var p entities.Proposal query := `SELECT * FROM proposals_current WHERE id=$1` - if err := pgxscan.Get(ctx, ps.Connection, &p, query, entities.ProposalID(id)); err != nil { - return p, ps.wrapE(pgxscan.Get(ctx, ps.Connection, &p, query, entities.ProposalID(id))) + if err := pgxscan.Get(ctx, ps.ConnectionSource, &p, query, entities.ProposalID(id)); err != nil { + return p, ps.wrapE(pgxscan.Get(ctx, ps.ConnectionSource, &p, query, entities.ProposalID(id))) } return p, nil @@ -162,7 +162,7 @@ func (ps *Proposals) GetByReference(ctx context.Context, ref string) (entities.P var p entities.Proposal query := `SELECT * FROM proposals_current WHERE reference=$1 LIMIT 1` - if err := pgxscan.Get(ctx, ps.Connection, &p, query, ref); err != nil { + if err := pgxscan.Get(ctx, ps.ConnectionSource, &p, query, ref); err != nil { return p, ps.wrapE(err) } @@ -179,7 +179,7 @@ func (ps *Proposals) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([ var proposals []entities.Proposal query := `SELECT * FROM proposals WHERE tx_hash=$1` - err := pgxscan.Select(ctx, ps.Connection, &proposals, query, txHash) + err := pgxscan.Select(ctx, ps.ConnectionSource, &proposals, query, txHash) if err != nil { return nil, ps.wrapE(err) } @@ -397,7 +397,7 @@ func (ps *Proposals) Get(ctx context.Context, defer metrics.StartSQLQuery("Proposals", "Get")() // copy the store connection because we may need to make recursive calls when processing the from the batch // causing the underlying connection to be busy and unusable - batchConn := ps.Connection + batchConn := ps.ConnectionSource results := batchConn.SendBatch(ctx, batch) defer results.Close() diff --git a/datanode/sqlstore/proposals_test.go b/datanode/sqlstore/proposals_test.go index 856765e9b9d..df66ebe7b10 100644 --- a/datanode/sqlstore/proposals_test.go +++ b/datanode/sqlstore/proposals_test.go @@ -1120,11 +1120,11 @@ func createPaginationTestProposals(t *testing.T, ctx context.Context, pps *sqlst func cleanupTestProposals(t *testing.T) { t.Helper() // Remove the proposals, then the parties and then the blocks - _, err := connectionSource.Connection.Exec(context.Background(), `TRUNCATE TABLE proposals`) + _, err := connectionSource.Exec(context.Background(), `TRUNCATE TABLE proposals`) require.NoError(t, err) - _, err = connectionSource.Connection.Exec(context.Background(), `TRUNCATE TABLE parties`) + _, err = connectionSource.Exec(context.Background(), `TRUNCATE TABLE parties`) require.NoError(t, err) - _, err = connectionSource.Connection.Exec(context.Background(), `TRUNCATE TABLE blocks`) + _, err = connectionSource.Exec(context.Background(), `TRUNCATE TABLE blocks`) require.NoError(t, err) } diff --git a/datanode/sqlstore/protocol_upgrade_proposals.go b/datanode/sqlstore/protocol_upgrade_proposals.go index c6b41763515..37de2268d81 100644 --- a/datanode/sqlstore/protocol_upgrade_proposals.go +++ b/datanode/sqlstore/protocol_upgrade_proposals.go @@ -49,7 +49,7 @@ func (ps *ProtocolUpgradeProposals) Add(ctx context.Context, p entities.Protocol p.Approvers = []string{} } - _, err := ps.Connection.Exec(ctx, + _, err := ps.Exec(ctx, `INSERT INTO protocol_upgrade_proposals( upgrade_block_height, vega_release_tag, @@ -105,7 +105,7 @@ func (ps *ProtocolUpgradeProposals) List(ctx context.Context, defer metrics.StartSQLQuery("ProtocolUpgradeProposals", "List")() pups := make([]entities.ProtocolUpgradeProposal, 0) - if err := pgxscan.Select(ctx, ps.Connection, &pups, query, args...); err != nil { + if err := pgxscan.Select(ctx, ps.ConnectionSource, &pups, query, args...); err != nil { return pups, pageInfo, err } @@ -123,7 +123,7 @@ func (ps *ProtocolUpgradeProposals) GetByTxHash( query := `SELECT upgrade_block_height, vega_release_tag, approvers, status, vega_time, tx_hash FROM protocol_upgrade_proposals WHERE tx_hash = $1` - if err := pgxscan.Select(ctx, ps.Connection, &pups, query, txHash); err != nil { + if err := pgxscan.Select(ctx, ps.ConnectionSource, &pups, query, txHash); err != nil { return nil, err } diff --git a/datanode/sqlstore/referral_programs.go b/datanode/sqlstore/referral_programs.go index e1d34f8c953..7e88776b533 100644 --- a/datanode/sqlstore/referral_programs.go +++ b/datanode/sqlstore/referral_programs.go @@ -41,7 +41,7 @@ func (rp *ReferralPrograms) AddReferralProgram(ctx context.Context, referral *en } func (rp *ReferralPrograms) insertReferralProgram(ctx context.Context, referral *entities.ReferralProgram) error { - _, err := rp.Connection.Exec(ctx, + _, err := rp.Exec(ctx, `INSERT INTO referral_programs (id, version, benefit_tiers, end_of_program_timestamp, window_length, staking_tiers, vega_time, seq_num) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`, referral.ID, @@ -63,7 +63,7 @@ func (rp *ReferralPrograms) UpdateReferralProgram(ctx context.Context, referral func (rp *ReferralPrograms) EndReferralProgram(ctx context.Context, version uint64, endedAt time.Time, vegaTime time.Time, seqNum uint64) error { defer metrics.StartSQLQuery("ReferralPrograms", "EndReferralProgram")() - _, err := rp.Connection.Exec(ctx, + _, err := rp.Exec(ctx, `INSERT INTO referral_programs (id, version, benefit_tiers, end_of_program_timestamp, window_length, staking_tiers, ended_at, vega_time, seq_num) SELECT id, $1, benefit_tiers, end_of_program_timestamp, window_length, staking_tiers, $2, $3, $4 FROM current_referral_program`, version, endedAt, vegaTime, seqNum, @@ -77,7 +77,7 @@ func (rp *ReferralPrograms) GetCurrentReferralProgram(ctx context.Context) (enti var referralProgram entities.ReferralProgram query := `SELECT id, version, benefit_tiers, end_of_program_timestamp, window_length, staking_tiers, vega_time, ended_at, seq_num FROM current_referral_program` - if err := pgxscan.Get(ctx, rp.Connection, &referralProgram, query); err != nil { + if err := pgxscan.Get(ctx, rp.ConnectionSource, &referralProgram, query); err != nil { return referralProgram, err } diff --git a/datanode/sqlstore/referral_programs_test.go b/datanode/sqlstore/referral_programs_test.go index 96377f9a5c6..6d1cdf39356 100644 --- a/datanode/sqlstore/referral_programs_test.go +++ b/datanode/sqlstore/referral_programs_test.go @@ -121,7 +121,7 @@ func TestReferralPrograms_AddReferralProgram(t *testing.T) { require.NoError(t, err) var got []entities.ReferralProgram - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM referral_programs") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM referral_programs") require.NoError(t, err) require.Len(t, got, 1) assert.Equal(t, *want, got[0]) @@ -130,7 +130,7 @@ func TestReferralPrograms_AddReferralProgram(t *testing.T) { err = rs.AddReferralProgram(ctx, want2) require.NoError(t, err) - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM referral_programs") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM referral_programs") require.NoError(t, err) require.Len(t, got, 2) wantAll := []entities.ReferralProgram{*want, *want2} @@ -238,7 +238,7 @@ func TestReferralPrograms_UpdateReferralProgram(t *testing.T) { require.NoError(t, err) var got []entities.ReferralProgram - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM referral_programs") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM referral_programs") require.NoError(t, err) require.Len(t, got, 1) @@ -249,7 +249,7 @@ func TestReferralPrograms_UpdateReferralProgram(t *testing.T) { err = rs.UpdateReferralProgram(ctx, wantUpdated) require.NoError(t, err) - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM referral_programs") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM referral_programs") require.NoError(t, err) require.Len(t, got, 2) @@ -260,7 +260,7 @@ func TestReferralPrograms_UpdateReferralProgram(t *testing.T) { t.Run("The current_referral view should list the updated referral program record", func(t *testing.T) { var got []entities.ReferralProgram - err := pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM current_referral_program") + err := pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM current_referral_program") require.NoError(t, err) require.Len(t, got, 1) assert.Equal(t, *wantUpdated, got[0]) @@ -294,13 +294,13 @@ func TestReferralPrograms_EndReferralProgram(t *testing.T) { ended.EndedAt = &endTime var got []entities.ReferralProgram - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM referral_programs order by vega_time") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM referral_programs order by vega_time") require.NoError(t, err) require.Len(t, got, 3) wantAll := []entities.ReferralProgram{*started, *updated, *ended} assert.Equal(t, wantAll, got) - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM current_referral_program") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM current_referral_program") require.NoError(t, err) require.Len(t, got, 1) assert.Equal(t, *ended, got[0]) diff --git a/datanode/sqlstore/referral_sets.go b/datanode/sqlstore/referral_sets.go index 1adf6993161..87464ecdfb2 100644 --- a/datanode/sqlstore/referral_sets.go +++ b/datanode/sqlstore/referral_sets.go @@ -63,7 +63,7 @@ func NewReferralSets(connectionSource *ConnectionSource) *ReferralSets { func (rs *ReferralSets) AddReferralSet(ctx context.Context, referralSet *entities.ReferralSet) error { defer metrics.StartSQLQuery("ReferralSets", "AddReferralSet")() - _, err := rs.Connection.Exec( + _, err := rs.Exec( ctx, "INSERT INTO referral_sets(id, referrer, created_at, updated_at, vega_time) VALUES ($1, $2, $3, $4, $5)", referralSet.ID, @@ -78,7 +78,7 @@ func (rs *ReferralSets) AddReferralSet(ctx context.Context, referralSet *entitie func (rs *ReferralSets) RefereeJoinedReferralSet(ctx context.Context, referee *entities.ReferralSetReferee) error { defer metrics.StartSQLQuery("ReferralSets", "AddReferralSetReferee")() - _, err := rs.Connection.Exec( + _, err := rs.Exec( ctx, "INSERT INTO referral_set_referees(referral_set_id, referee, joined_at, at_epoch, vega_time) VALUES ($1, $2, $3, $4, $5)", referee.ReferralSetID, @@ -127,7 +127,7 @@ FROM referral_sets return nil, pageInfo, err } - if err := pgxscan.Select(ctx, rs.Connection, &sets, query, args...); err != nil { + if err := pgxscan.Select(ctx, rs.ConnectionSource, &sets, query, args...); err != nil { return nil, pageInfo, err } @@ -144,7 +144,7 @@ func (rs *ReferralSets) AddReferralSetStats(ctx context.Context, stats *entities refereesStats = []*eventspb.RefereeStats{} } - _, err := rs.Connection.Exec( + _, err := rs.Exec( ctx, `INSERT INTO referral_set_stats( set_id, @@ -227,7 +227,7 @@ func (rs *ReferralSets) GetReferralSetStats(ctx context.Context, setID *entities return nil, pageInfo, err } - if err := pgxscan.Select(ctx, rs.Connection, &stats, query, args...); err != nil { + if err := pgxscan.Select(ctx, rs.ConnectionSource, &stats, query, args...); err != nil { return nil, pageInfo, err } @@ -273,7 +273,7 @@ func (rs *ReferralSets) ListReferralSetReferees(ctx context.Context, referralSet return nil, pageInfo, err } - if err := pgxscan.Select(ctx, rs.Connection, &referees, query, args...); err != nil { + if err := pgxscan.Select(ctx, rs.ConnectionSource, &referees, query, args...); err != nil { return nil, pageInfo, err } diff --git a/datanode/sqlstore/referral_sets_test.go b/datanode/sqlstore/referral_sets_test.go index 07d09482f73..06b474757d2 100644 --- a/datanode/sqlstore/referral_sets_test.go +++ b/datanode/sqlstore/referral_sets_test.go @@ -66,7 +66,7 @@ func TestReferralSets_AddReferralSet(t *testing.T) { require.NoError(t, err) var got entities.ReferralSet - err = pgxscan.Get(ctx, connectionSource.Connection, &got, "SELECT * FROM referral_sets WHERE id = $1", set.ID) + err = pgxscan.Get(ctx, connectionSource, &got, "SELECT * FROM referral_sets WHERE id = $1", set.ID) require.NoError(t, err) assert.Equal(t, set, got) }) @@ -111,7 +111,7 @@ func TestReferralSets_RefereeJoinedReferralSet(t *testing.T) { require.NoError(t, err) var got entities.ReferralSetReferee - err = pgxscan.Get(ctx, connectionSource.Connection, &got, "SELECT * FROM referral_set_referees WHERE referral_set_id = $1 AND referee = $2", set.ID, referee.ID) + err = pgxscan.Get(ctx, connectionSource, &got, "SELECT * FROM referral_set_referees WHERE referral_set_id = $1 AND referee = $2", set.ID, referee.ID) require.NoError(t, err) assert.Equal(t, setReferee, got) }) @@ -555,7 +555,7 @@ func TestReferralSets_AddReferralSetStats(t *testing.T) { require.NoError(t, err) var got entities.ReferralSetStats - err = pgxscan.Get(ctx, connectionSource.Connection, &got, "SELECT * FROM referral_set_stats WHERE set_id = $1 AND at_epoch = $2", set.ID, epoch) + err = pgxscan.Get(ctx, connectionSource, &got, "SELECT * FROM referral_set_stats WHERE set_id = $1 AND at_epoch = $2", set.ID, epoch) require.NoError(t, err) assert.Equal(t, stats, got) }) @@ -578,7 +578,7 @@ func TestReferralSets_AddReferralSetStats(t *testing.T) { err := rs.AddReferralSetStats(ctx, &stats) require.NoError(t, err) var got entities.ReferralSetStats - err = pgxscan.Get(ctx, connectionSource.Connection, &got, "SELECT * FROM referral_set_stats WHERE set_id = $1 AND at_epoch = $2", set.ID, epoch) + err = pgxscan.Get(ctx, connectionSource, &got, "SELECT * FROM referral_set_stats WHERE set_id = $1 AND at_epoch = $2", set.ID, epoch) require.NoError(t, err) assert.Equal(t, stats, got) diff --git a/datanode/sqlstore/rewards.go b/datanode/sqlstore/rewards.go index 04d372ebf1f..c63d5ae7fc0 100644 --- a/datanode/sqlstore/rewards.go +++ b/datanode/sqlstore/rewards.go @@ -55,7 +55,7 @@ func NewRewards(ctx context.Context, connectionSource *ConnectionSource) *Reward func (rs *Rewards) fetchRunningTotals(ctx context.Context) { query := `SELECT * FROM current_game_reward_totals` var totals []entities.RewardTotals - err := pgxscan.Select(ctx, rs.Connection, &totals, query) + err := pgxscan.Select(ctx, rs.ConnectionSource, &totals, query) if err != nil && !pgxscan.NotFound(err) { panic(fmt.Errorf("could not retrieve game reward totals: %w", err)) } @@ -73,7 +73,7 @@ func (rs *Rewards) fetchRunningTotals(ctx context.Context) { func (rs *Rewards) Add(ctx context.Context, r entities.Reward) error { defer metrics.StartSQLQuery("Rewards", "Add")() - _, err := rs.Connection.Exec(ctx, + _, err := rs.Exec(ctx, `INSERT INTO rewards( party_id, asset_id, @@ -109,7 +109,7 @@ func (rs *Rewards) Add(ctx context.Context, r entities.Reward) error { rs.runningTotalsQuantum[gID][r.PartyID] = rs.runningTotalsQuantum[gID][r.PartyID].Add(r.QuantumAmount) defer metrics.StartSQLQuery("GameRewardTotals", "Add")() - _, err = rs.Connection.Exec(ctx, `INSERT INTO game_reward_totals( + _, err = rs.Exec(ctx, `INSERT INTO game_reward_totals( game_id, party_id, asset_id, @@ -155,7 +155,7 @@ type scannedRewards struct { func (rs *Rewards) GetAll(ctx context.Context) ([]entities.Reward, error) { defer metrics.StartSQLQuery("Rewards", "GetAll")() scanned := []scannedRewards{} - err := pgxscan.Select(ctx, rs.Connection, &scanned, `SELECT * FROM rewards;`) + err := pgxscan.Select(ctx, rs.ConnectionSource, &scanned, `SELECT * FROM rewards;`) if err != nil { return nil, err } @@ -166,7 +166,7 @@ func (rs *Rewards) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]e defer metrics.StartSQLQuery("Rewards", "GetByTxHash")() scanned := []scannedRewards{} - err := pgxscan.Select(ctx, rs.Connection, &scanned, `SELECT * FROM rewards WHERE tx_hash = $1`, txHash) + err := pgxscan.Select(ctx, rs.ConnectionSource, &scanned, `SELECT * FROM rewards WHERE tx_hash = $1`, txHash) if err != nil { return nil, err } @@ -175,23 +175,23 @@ func (rs *Rewards) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]e } func (rs *Rewards) GetByCursor(ctx context.Context, - partyIDHex *string, + partyIDs []string, assetIDHex *string, fromEpoch *uint64, toEpoch *uint64, pagination entities.CursorPagination, - teamIDHex, gameIDHex *string, + teamIDHex, gameIDHex, marketID *string, ) ([]entities.Reward, entities.PageInfo, error) { var pageInfo entities.PageInfo query := ` WITH cte_rewards AS ( SELECT r.*, grt.team_id FROM rewards r - LEFT JOIN game_reward_totals grt ON r.game_id = grt.game_id AND r.party_id = grt.party_id and r.epoch_id = grt.epoch_id + LEFT JOIN game_reward_totals grt ON r.game_id = grt.game_id AND r.party_id = grt.party_id and r.epoch_id = grt.epoch_id AND r.market_id = grt.market_id ) SELECT * from cte_rewards` args := []interface{}{} - query, args = addRewardWhereClause(query, args, partyIDHex, assetIDHex, teamIDHex, gameIDHex, fromEpoch, toEpoch) + query, args = addRewardWhereClause(query, args, partyIDs, assetIDHex, teamIDHex, gameIDHex, fromEpoch, toEpoch, marketID) query, args, err := PaginateQuery[entities.RewardCursor](query, args, rewardsOrdering, pagination) if err != nil { @@ -199,7 +199,7 @@ func (rs *Rewards) GetByCursor(ctx context.Context, } scanned := []scannedRewards{} - if err := pgxscan.Select(ctx, rs.Connection, &scanned, query, args...); err != nil { + if err := pgxscan.Select(ctx, rs.ConnectionSource, &scanned, query, args...); err != nil { return nil, entities.PageInfo{}, fmt.Errorf("querying rewards: %w", err) } @@ -209,16 +209,16 @@ func (rs *Rewards) GetByCursor(ctx context.Context, } func (rs *Rewards) GetSummaries(ctx context.Context, - partyIDHex *string, assetIDHex *string, + partyIDs []string, assetIDHex *string, ) ([]entities.RewardSummary, error) { query := `SELECT party_id, asset_id, SUM(amount) AS amount FROM rewards` args := []interface{}{} - query, args = addRewardWhereClause(query, args, partyIDHex, assetIDHex, nil, nil, nil, nil) - query = fmt.Sprintf("%s GROUP BY party_id, asset_id", query) + query, args = addRewardWhereClause(query, args, partyIDs, assetIDHex, nil, nil, nil, nil, nil) + query = fmt.Sprintf("%s GROUP BY party_id, asset_id ORDER BY party_id", query) summaries := []entities.RewardSummary{} defer metrics.StartSQLQuery("Rewards", "GetSummaries")() - err := pgxscan.Select(ctx, rs.Connection, &summaries, query, args...) + err := pgxscan.Select(ctx, rs.ConnectionSource, &summaries, query, args...) if err != nil { return nil, fmt.Errorf("querying rewards: %w", err) } @@ -247,7 +247,7 @@ func (rs *Rewards) GetEpochSummaries(ctx context.Context, var summaries []entities.EpochRewardSummary defer metrics.StartSQLQuery("Rewards", "GetEpochSummaries")() - if err = pgxscan.Select(ctx, rs.Connection, &summaries, query, args...); err != nil { + if err = pgxscan.Select(ctx, rs.ConnectionSource, &summaries, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("querying epoch reward summaries: %w", err) } @@ -257,12 +257,13 @@ func (rs *Rewards) GetEpochSummaries(ctx context.Context, // -------------------------------------------- Utility Methods -func addRewardWhereClause(query string, args []interface{}, partyIDHex, assetIDHex, teamIDHex, gameIDHex *string, fromEpoch, toEpoch *uint64) (string, []interface{}) { +func addRewardWhereClause(query string, args []interface{}, partyIDs []string, assetIDHex, teamIDHex, gameIDHex *string, fromEpoch, toEpoch *uint64, marketID *string) (string, []interface{}) { predicates := []string{} - if partyIDHex != nil && *partyIDHex != "" { - partyID := entities.PartyID(*partyIDHex) - predicates = append(predicates, fmt.Sprintf("party_id = %s", nextBindVar(&args, partyID))) + if len(partyIDs) > 0 { + inArgs, inList := prepareInClauseList[entities.PartyID](partyIDs) + args = append(args, inArgs...) + predicates = append(predicates, fmt.Sprintf("party_id IN (%s)", inList)) } if assetIDHex != nil && *assetIDHex != "" { @@ -288,6 +289,10 @@ func addRewardWhereClause(query string, args []interface{}, partyIDHex, assetIDH predicates = append(predicates, fmt.Sprintf("epoch_id <= %s", nextBindVar(&args, *toEpoch))) } + if marketID != nil { + predicates = append(predicates, fmt.Sprintf("market_id = %s", nextBindVar(&args, *marketID))) + } + if len(predicates) > 0 { query = fmt.Sprintf("%s WHERE %s", query, strings.Join(predicates, " AND ")) } @@ -295,6 +300,19 @@ func addRewardWhereClause(query string, args []interface{}, partyIDHex, assetIDH return query, args } +func prepareInClauseList[A any, T entities.ID[A]](ids []string) ([]interface{}, string) { + var args []interface{} + var list strings.Builder + for i, id := range ids { + if i > 0 { + list.WriteString(",") + } + + list.WriteString(nextBindVar(&args, T(id))) + } + return args, list.String() +} + // FilterRewardsQuery returns a WHERE part of the query and args for filtering the rewards table. func FilterRewardsQuery(filter entities.RewardSummaryFilter) (string, []any, error) { var ( diff --git a/datanode/sqlstore/rewards_test.go b/datanode/sqlstore/rewards_test.go index e2a2377cb10..7cbc43e9058 100644 --- a/datanode/sqlstore/rewards_test.go +++ b/datanode/sqlstore/rewards_test.go @@ -21,6 +21,8 @@ import ( "fmt" "math/rand" "reflect" + "slices" + "strings" "testing" "time" @@ -107,6 +109,7 @@ func TestRewards(t *testing.T) { party1 := addTestParty(t, ctx, ps, block) party2 := addTestParty(t, ctx, ps, block) + party1ID := party1.ID.String() party2ID := party2.ID.String() asset2ID := asset2.ID.String() @@ -133,12 +136,35 @@ func TestRewards(t *testing.T) { }) t.Run("GetSummary", func(t *testing.T) { - expected := []entities.RewardSummary{{ - AssetID: asset2.ID, - PartyID: party2.ID, - Amount: decimal.NewFromInt(200), - }} - actual, err := rs.GetSummaries(ctx, &party2ID, &asset2ID) + expected := []entities.RewardSummary{ + { + AssetID: asset2.ID, + PartyID: party1.ID, + Amount: decimal.NewFromInt(100), + }, + { + AssetID: asset2.ID, + PartyID: party2.ID, + Amount: decimal.NewFromInt(200), + }, + } + + slices.SortFunc(expected, func(i, j entities.RewardSummary) int { + return strings.Compare(i.PartyID.String(), j.PartyID.String()) + }) + + actual, err := rs.GetSummaries(ctx, []string{party1ID, party2ID}, &asset2ID) + require.NoError(t, err) + assert.Equal(t, expected, actual) + }) + + t.Run("GetByCursor", func(t *testing.T) { + expected := []entities.Reward{reward2, reward4, reward5} + + pagination, err := entities.NewCursorPagination(nil, nil, nil, nil, false) + require.NoError(t, err) + + actual, _, err := rs.GetByCursor(ctx, []string{party1ID, party2ID}, &asset2ID, nil, nil, pagination, nil, nil, nil) require.NoError(t, err) assert.Equal(t, expected, actual) }) @@ -490,7 +516,7 @@ func testRewardsCursorPaginationNoPagination(t *testing.T) { partyID := "89c701d1ae2819263e45538d0b25022988bc2508a02c654462d22e0afb626a7d" assetID := "8aa92225c32adb54e527fcb1aee2930cbadb4df6f068ab2c2d667eb057ef00fa" - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 10, len(got)) assert.Equal(t, int64(637), got[0].EpochID) @@ -514,7 +540,7 @@ func testRewardsCursorPaginationFirstPage(t *testing.T) { partyID := "89c701d1ae2819263e45538d0b25022988bc2508a02c654462d22e0afb626a7d" assetID := "8aa92225c32adb54e527fcb1aee2930cbadb4df6f068ab2c2d667eb057ef00fa" - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 3, len(got)) assert.Equal(t, int64(637), got[0].EpochID) @@ -538,7 +564,7 @@ func testRewardsCursorPaginationLastPage(t *testing.T) { partyID := "89c701d1ae2819263e45538d0b25022988bc2508a02c654462d22e0afb626a7d" assetID := "8aa92225c32adb54e527fcb1aee2930cbadb4df6f068ab2c2d667eb057ef00fa" - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 3, len(got)) assert.Equal(t, int64(757), got[0].EpochID) @@ -564,7 +590,7 @@ func testRewardsCursorPaginationFirstPageAfter(t *testing.T) { pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, false) require.NoError(t, err) - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 3, len(got)) assert.Equal(t, int64(737), got[0].EpochID) @@ -589,7 +615,7 @@ func testRewardsCursorPaginationLastPageBefore(t *testing.T) { before := entities.NewCursor(entities.RewardCursor{PartyID: partyID, AssetID: assetID, EpochID: 757}.String()).Encode() pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, false) require.NoError(t, err) - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 3, len(got)) assert.Equal(t, int64(741), got[0].EpochID) @@ -612,7 +638,7 @@ func testRewardsCursorPaginationNoPaginationNewestFirst(t *testing.T) { partyID := "89c701d1ae2819263e45538d0b25022988bc2508a02c654462d22e0afb626a7d" assetID := "8aa92225c32adb54e527fcb1aee2930cbadb4df6f068ab2c2d667eb057ef00fa" - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 10, len(got)) assert.Equal(t, int64(1027), got[0].EpochID) @@ -636,7 +662,7 @@ func testRewardsCursorPaginationFirstPageNewestFirst(t *testing.T) { partyID := "89c701d1ae2819263e45538d0b25022988bc2508a02c654462d22e0afb626a7d" assetID := "8aa92225c32adb54e527fcb1aee2930cbadb4df6f068ab2c2d667eb057ef00fa" - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 3, len(got)) assert.Equal(t, int64(1027), got[0].EpochID) @@ -660,7 +686,7 @@ func testRewardsCursorPaginationLastPageNewestFirst(t *testing.T) { partyID := "89c701d1ae2819263e45538d0b25022988bc2508a02c654462d22e0afb626a7d" assetID := "8aa92225c32adb54e527fcb1aee2930cbadb4df6f068ab2c2d667eb057ef00fa" - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 3, len(got)) assert.Equal(t, int64(643), got[0].EpochID) @@ -686,7 +712,7 @@ func testRewardsCursorPaginationFirstPageAfterNewestFirst(t *testing.T) { pagination, err := entities.NewCursorPagination(&first, &after, nil, nil, true) require.NoError(t, err) - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 3, len(got)) assert.Equal(t, int64(747), got[0].EpochID) @@ -711,7 +737,7 @@ func testRewardsCursorPaginationLastPageBeforeNewestFirst(t *testing.T) { before := entities.NewCursor(entities.RewardCursor{PartyID: partyID, AssetID: assetID, EpochID: 643}.String()).Encode() pagination, err := entities.NewCursorPagination(nil, nil, &last, &before, true) require.NoError(t, err) - got, pageInfo, err := rs.GetByCursor(ctx, &partyID, &assetID, nil, nil, pagination, nil, nil) + got, pageInfo, err := rs.GetByCursor(ctx, []string{partyID}, &assetID, nil, nil, pagination, nil, nil, nil) assert.NoError(t, err) assert.Equal(t, 3, len(got)) assert.Equal(t, int64(744), got[0].EpochID) @@ -904,7 +930,7 @@ func TestRewardsGameTotals(t *testing.T) { }, } for _, team := range teams { - _, err := connectionSource.Connection.Exec(ctx, + _, err := connectionSource.Exec(ctx, `INSERT INTO teams (id, referrer, name, team_url, avatar_url, closed, created_at_epoch, created_at, vega_time) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, team.ID, team.Referrer, team.Name, team.TeamURL, team.AvatarURL, team.Closed, team.CreatedAtEpoch, team.CreatedAt, team.VegaTime) @@ -935,7 +961,7 @@ func TestRewardsGameTotals(t *testing.T) { }, } for _, member := range teamMembers { - _, err := connectionSource.Connection.Exec(ctx, + _, err := connectionSource.Exec(ctx, `INSERT INTO team_members (team_id, party_id, joined_at_epoch, joined_at, vega_time) VALUES ($1, $2, $3, $4, $5)`, member.TeamID, member.PartyID, member.JoinedAtEpoch, member.JoinedAt, member.VegaTime) @@ -975,7 +1001,7 @@ func TestRewardsGameTotals(t *testing.T) { }, } for _, total := range existingTotals { - _, err := connectionSource.Connection.Exec(ctx, + _, err := connectionSource.Exec(ctx, `INSERT INTO game_reward_totals (game_id, party_id, asset_id, market_id, epoch_id, team_id, total_rewards, total_rewards_quantum) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`, total.GameID, total.PartyID, total.AssetID, total.MarketID, total.EpochID, total.TeamID, total.TotalRewards, total.TotalRewardsQuantum) @@ -1123,7 +1149,7 @@ func TestRewardsGameTotals(t *testing.T) { } for _, tc := range testCases { var totals []entities.RewardTotals - require.NoError(t, pgxscan.Select(ctx, connectionSource.Connection, &totals, + require.NoError(t, pgxscan.Select(ctx, connectionSource, &totals, `SELECT * FROM game_reward_totals WHERE game_id = $1 AND party_id = $2 AND epoch_id = $3`, tc.game_id, tc.party_id, tc.epoch_id)) assert.Equal(t, 1, len(totals)) @@ -1194,7 +1220,7 @@ func TestRewardFilterByTeamIDAndGameID(t *testing.T) { partyID := parties[i] page := entities.DefaultCursorPagination(true) // get the rewards for that party - got, _, err := stores.rewards.GetByCursor(ctx, ptr.From(partyID.String()), nil, nil, nil, page, nil, nil) + got, _, err := stores.rewards.GetByCursor(ctx, []string{partyID.String()}, nil, nil, nil, page, nil, nil, nil) require.NoError(t, err) want := filterRewardsByParty(rewards, partyID) // we don't care about the ordering as other tests already validate that, we just want to make sure we have all the rewards for the party @@ -1215,7 +1241,7 @@ func TestRewardFilterByTeamIDAndGameID(t *testing.T) { i = r.Intn(len(teams[teamID])) party := teams[teamID][i] page := entities.DefaultCursorPagination(true) - got, _, err := stores.rewards.GetByCursor(ctx, ptr.From(party.ID.String()), nil, nil, nil, page, ptr.From(teamID), nil) + got, _, err := stores.rewards.GetByCursor(ctx, []string{party.ID.String()}, nil, nil, nil, page, ptr.From(teamID), nil, nil) require.NoError(t, err) want := filterRewardsByParty(filterRewardsByTeam(rewards, entities.TeamID(teamID)), party.ID) assert.ElementsMatchf(t, want, got, "got: %v, want: %v", got, want) @@ -1225,7 +1251,7 @@ func TestRewardFilterByTeamIDAndGameID(t *testing.T) { i := r.Intn(len(gameIDs)) gameID := gameIDs[i] page := entities.DefaultCursorPagination(true) - got, _, err := stores.rewards.GetByCursor(ctx, nil, nil, nil, nil, page, nil, ptr.From(gameID)) + got, _, err := stores.rewards.GetByCursor(ctx, nil, nil, nil, nil, page, nil, ptr.From(gameID), nil) require.NoError(t, err) want := filterRewardsByGame(rewards, entities.GameID(gameID)) assert.ElementsMatchf(t, want, got, "got: %v, want: %v", got, want) diff --git a/datanode/sqlstore/risk_factor.go b/datanode/sqlstore/risk_factor.go index 74a8bf5522c..f725e637b3f 100644 --- a/datanode/sqlstore/risk_factor.go +++ b/datanode/sqlstore/risk_factor.go @@ -49,7 +49,7 @@ set long=EXCLUDED.long, tx_hash=EXCLUDED.tx_hash`, sqlRiskFactorColumns) - if _, err := rf.Connection.Exec(ctx, query, factor.MarketID, factor.Short, factor.Long, factor.TxHash, factor.VegaTime); err != nil { + if _, err := rf.Exec(ctx, query, factor.MarketID, factor.Short, factor.Long, factor.TxHash, factor.VegaTime); err != nil { err = fmt.Errorf("could not insert risk factor into database: %w", err) return err } @@ -66,5 +66,5 @@ func (rf *RiskFactors) GetMarketRiskFactors(ctx context.Context, marketID string from risk_factors_current where market_id = %s`, sqlRiskFactorColumns, nextBindVar(&bindVars, entities.MarketID(marketID))) - return riskFactor, rf.wrapE(pgxscan.Get(ctx, rf.Connection, &riskFactor, query, bindVars...)) + return riskFactor, rf.wrapE(pgxscan.Get(ctx, rf.ConnectionSource, &riskFactor, query, bindVars...)) } diff --git a/datanode/sqlstore/risk_factor_test.go b/datanode/sqlstore/risk_factor_test.go index b8aa45a7e01..791b390da84 100644 --- a/datanode/sqlstore/risk_factor_test.go +++ b/datanode/sqlstore/risk_factor_test.go @@ -89,7 +89,7 @@ func testAddRiskFactor(t *testing.T) { bs, rfStore := setupRiskFactorTests(t) var rowCount int - err := connectionSource.Connection.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) + err := connectionSource.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) assert.NoError(t, err) block := addTestBlock(t, ctx, bs) @@ -100,7 +100,7 @@ func testAddRiskFactor(t *testing.T) { err = rfStore.Upsert(ctx, riskFactor) require.NoError(t, err) - err = connectionSource.Connection.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) assert.NoError(t, err) assert.Equal(t, 1, rowCount) } @@ -111,7 +111,7 @@ func testUpsertDuplicateMarketInSameBlock(t *testing.T) { bs, rfStore := setupRiskFactorTests(t) var rowCount int - err := connectionSource.Connection.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) + err := connectionSource.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) assert.NoError(t, err) block := addTestBlock(t, ctx, bs) @@ -122,14 +122,14 @@ func testUpsertDuplicateMarketInSameBlock(t *testing.T) { err = rfStore.Upsert(ctx, riskFactor) require.NoError(t, err) - err = connectionSource.Connection.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) assert.NoError(t, err) assert.Equal(t, 1, rowCount) err = rfStore.Upsert(ctx, riskFactor) require.NoError(t, err) - err = connectionSource.Connection.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) assert.NoError(t, err) assert.Equal(t, 1, rowCount) } @@ -148,7 +148,7 @@ func testGetMarketRiskFactors(t *testing.T) { bs, rfStore := setupRiskFactorTests(t) var rowCount int - err := connectionSource.Connection.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) + err := connectionSource.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) assert.NoError(t, err) block := addTestBlock(t, ctx, bs) @@ -159,7 +159,7 @@ func testGetMarketRiskFactors(t *testing.T) { err = rfStore.Upsert(ctx, riskFactor) require.NoError(t, err) - err = connectionSource.Connection.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) + err = connectionSource.QueryRow(ctx, `select count(*) from risk_factors`).Scan(&rowCount) assert.NoError(t, err) assert.Equal(t, 1, rowCount) diff --git a/datanode/sqlstore/snapshot_data.go b/datanode/sqlstore/snapshot_data.go index 20264f5b194..45b5170ed07 100644 --- a/datanode/sqlstore/snapshot_data.go +++ b/datanode/sqlstore/snapshot_data.go @@ -41,7 +41,7 @@ func NewCoreSnapshotData(connectionSource *ConnectionSource) *CoreSnapshotData { func (s *CoreSnapshotData) Add(ctx context.Context, csd entities.CoreSnapshotData) error { defer metrics.StartSQLQuery("CoreSnapshotData", "Add")() - _, err := s.Connection.Exec(ctx, + _, err := s.Exec(ctx, `INSERT INTO core_snapshots( block_height, block_hash, @@ -73,7 +73,7 @@ func (s *CoreSnapshotData) List(ctx context.Context, pagination entities.CursorP defer metrics.StartSQLQuery("CoreSnapshotData", "List")() snaps := make([]entities.CoreSnapshotData, 0) - if err := pgxscan.Select(ctx, s.Connection, &snaps, query, args...); err != nil { + if err := pgxscan.Select(ctx, s.ConnectionSource, &snaps, query, args...); err != nil { return snaps, pageInfo, err } diff --git a/datanode/sqlstore/snapshot_data_test.go b/datanode/sqlstore/snapshot_data_test.go index 4e7458c6661..6f61471cf44 100644 --- a/datanode/sqlstore/snapshot_data_test.go +++ b/datanode/sqlstore/snapshot_data_test.go @@ -44,7 +44,7 @@ func TestGetSnapshots(t *testing.T) { addSnapshot(t, ctx, ss, bs, entities.CoreSnapshotData{BlockHeight: 100, VegaCoreVersion: "v0.65.0"}) var rowCount int - err := connectionSource.Connection.QueryRow(ctx, `select count(*) from core_snapshots`).Scan(&rowCount) + err := connectionSource.QueryRow(ctx, `select count(*) from core_snapshots`).Scan(&rowCount) require.NoError(t, err) require.Equal(t, 1, rowCount) diff --git a/datanode/sqlstore/sqlstore.go b/datanode/sqlstore/sqlstore.go index 4706e33898d..10eeaeedb69 100644 --- a/datanode/sqlstore/sqlstore.go +++ b/datanode/sqlstore/sqlstore.go @@ -100,6 +100,8 @@ var defaultRetentionPolicies = map[RetentionPeriod][]RetentionPolicy{ {HypertableOrCaggName: "paid_liquidity_fees", DataRetentionPeriod: "1 year"}, {HypertableOrCaggName: "transfer_fees_discount", DataRetentionPeriod: "1 year"}, {HypertableOrCaggName: "time_weighted_notional_positions", DataRetentionPeriod: "1 month"}, + {HypertableOrCaggName: "game_team_scores", DataRetentionPeriod: "1 month"}, + {HypertableOrCaggName: "game_party_scores", DataRetentionPeriod: "1 month"}, }, RetentionPeriodArchive: { {HypertableOrCaggName: "*", DataRetentionPeriod: string(RetentionPeriodArchive)}, diff --git a/datanode/sqlstore/sqlstore_test.go b/datanode/sqlstore/sqlstore_test.go index 0abb970db56..3e107f11d44 100644 --- a/datanode/sqlstore/sqlstore_test.go +++ b/datanode/sqlstore/sqlstore_test.go @@ -41,6 +41,8 @@ var ( ) func TestMain(m *testing.M) { + ctx, cfunc := context.WithCancel(context.Background()) + defer cfunc() tempDir, err := os.MkdirTemp("", "datanode") if err != nil { panic(err) @@ -48,9 +50,11 @@ func TestMain(m *testing.M) { postgresRuntimePath := filepath.Join(tempDir, "sqlstore") defer os.RemoveAll(tempDir) - databasetest.TestMain(m, func(cfg sqlstore.Config, source *sqlstore.ConnectionSource, + databasetest.TestMain(m, ctx, func(cfg sqlstore.Config, source *sqlstore.ConnectionSource, postgresLog *bytes.Buffer, ) { + // ensures nested transactions execute the post-commit hooks while the parent transaction still rolls back the overall changes. + source.ToggleTest() testDBPort = cfg.ConnectionConfig.Port connectionSource = source testConfig = cfg diff --git a/datanode/sqlstore/stake_linking.go b/datanode/sqlstore/stake_linking.go index 44a2c80920b..1cba9972ab2 100644 --- a/datanode/sqlstore/stake_linking.go +++ b/datanode/sqlstore/stake_linking.go @@ -70,7 +70,7 @@ set tx_hash=EXCLUDED.tx_hash `, sqlStakeLinkingColumns) - if _, err := s.Connection.Exec(ctx, query, stake.ID, stake.StakeLinkingType, stake.EthereumTimestamp, stake.PartyID, stake.Amount, + if _, err := s.Exec(ctx, query, stake.ID, stake.StakeLinkingType, stake.EthereumTimestamp, stake.PartyID, stake.Amount, stake.StakeLinkingStatus, stake.FinalizedAt, stake.ForeignTxHash, stake.ForeignBlockHeight, stake.ForeignBlockTime, stake.LogIndex, stake.EthereumAddress, stake.TxHash, stake.VegaTime); err != nil { return err @@ -109,7 +109,7 @@ func (s *StakeLinking) getStakeWithCursorPagination(ctx context.Context, partyID var bal *num.Uint - err = pgxscan.Select(ctx, s.Connection, &links, query, bindVars...) + err = pgxscan.Select(ctx, s.ConnectionSource, &links, query, bindVars...) if err != nil { s.log.Errorf("could not retrieve links", logging.Error(err)) return bal, nil, pageInfo, err @@ -151,7 +151,7 @@ WHERE party_id = %s var currentBalance decimal.Decimal defer metrics.StartSQLQuery("StakeLinking", "calculateBalance")() - if err := pgxscan.Get(ctx, s.Connection, ¤tBalance, query, bindVars...); err != nil { + if err := pgxscan.Get(ctx, s.ConnectionSource, ¤tBalance, query, bindVars...); err != nil { return bal, err } diff --git a/datanode/sqlstore/stake_linking_test.go b/datanode/sqlstore/stake_linking_test.go index c348e4fea63..39313dfe714 100644 --- a/datanode/sqlstore/stake_linking_test.go +++ b/datanode/sqlstore/stake_linking_test.go @@ -51,8 +51,7 @@ func testUpsertShouldAddNewInBlock(t *testing.T) { bs, sl := setupStakeLinkingTest(t) var rowCount int - conn := connectionSource.Connection - assert.NoError(t, conn.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) + assert.NoError(t, connectionSource.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) assert.Equal(t, 0, rowCount) block := addTestBlock(t, ctx, bs) @@ -63,7 +62,7 @@ func testUpsertShouldAddNewInBlock(t *testing.T) { require.NoError(t, err) assert.NoError(t, sl.Upsert(ctx, data)) - assert.NoError(t, conn.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) + assert.NoError(t, connectionSource.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) assert.Equal(t, 1, rowCount) } @@ -71,9 +70,8 @@ func testUpsertShouldUpdateExistingInBlock(t *testing.T) { ctx := tempTransaction(t) bs, sl := setupStakeLinkingTest(t) - conn := connectionSource.Connection var rowCount int - assert.NoError(t, conn.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) + assert.NoError(t, connectionSource.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) assert.Equal(t, 0, rowCount) block := addTestBlock(t, ctx, bs) @@ -85,7 +83,7 @@ func testUpsertShouldUpdateExistingInBlock(t *testing.T) { assert.NoError(t, sl.Upsert(ctx, data)) } - assert.NoError(t, conn.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) + assert.NoError(t, connectionSource.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) assert.Equal(t, 2, rowCount) } @@ -93,10 +91,9 @@ func testGetStake(t *testing.T) { ctx := tempTransaction(t) bs, sl := setupStakeLinkingTest(t) - conn := connectionSource.Connection var rowCount int - assert.NoError(t, conn.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) + assert.NoError(t, connectionSource.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) assert.Equal(t, 0, rowCount) block := addTestBlock(t, ctx, bs) @@ -108,7 +105,7 @@ func testGetStake(t *testing.T) { assert.NoError(t, sl.Upsert(ctx, data)) } - assert.NoError(t, conn.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) + assert.NoError(t, connectionSource.QueryRow(ctx, "select count(*) from stake_linking").Scan(&rowCount)) assert.Equal(t, 2, rowCount) partyID := entities.PartyID("cafed00d") @@ -505,7 +502,7 @@ func testStakeLinkingTypeEnum(t *testing.T) { var got entities.StakeLinking - require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got, "SELECT * FROM stake_linking where tx_hash = $1", data.TxHash)) + require.NoError(t, pgxscan.Get(ctx, connectionSource, &got, "SELECT * FROM stake_linking where tx_hash = $1", data.TxHash)) assert.Equal(t, data.StakeLinkingType, got.StakeLinkingType) }) } diff --git a/datanode/sqlstore/stop_orders.go b/datanode/sqlstore/stop_orders.go index dee6b2fed44..1e727c40ef8 100644 --- a/datanode/sqlstore/stop_orders.go +++ b/datanode/sqlstore/stop_orders.go @@ -59,7 +59,7 @@ func (so *StopOrders) Add(o entities.StopOrder) error { func (so *StopOrders) Flush(ctx context.Context) ([]entities.StopOrder, error) { defer metrics.StartSQLQuery("StopOrders", "Flush")() - return so.batcher.Flush(ctx, so.Connection) + return so.batcher.Flush(ctx, so.ConnectionSource) } func (so *StopOrders) GetStopOrder(ctx context.Context, orderID string) (entities.StopOrder, error) { @@ -68,7 +68,7 @@ func (so *StopOrders) GetStopOrder(ctx context.Context, orderID string) (entitie id := entities.StopOrderID(orderID) defer metrics.StartSQLQuery("StopOrders", "GetStopOrder")() query := `select * from stop_orders_current_desc where id=$1` - err = pgxscan.Get(ctx, so.Connection, &order, query, id) + err = pgxscan.Get(ctx, so.ConnectionSource, &order, query, id) return order, so.wrapE(err) } @@ -115,7 +115,7 @@ func (so *StopOrders) queryWithPagination(ctx context.Context, query string, p e return orders, pageInfo, err } - err = pgxscan.Select(ctx, so.Connection, &orders, query, args...) + err = pgxscan.Select(ctx, so.ConnectionSource, &orders, query, args...) if err != nil { return nil, pageInfo, fmt.Errorf("querying stop orders: %w", err) } diff --git a/datanode/sqlstore/stop_orders_test.go b/datanode/sqlstore/stop_orders_test.go index d38a79f4032..72153705323 100644 --- a/datanode/sqlstore/stop_orders_test.go +++ b/datanode/sqlstore/stop_orders_test.go @@ -130,7 +130,7 @@ func TestStopOrders_Add(t *testing.T) { require.NoError(t, err) } - rows, err := connectionSource.Connection.Query(ctx, "select * from stop_orders") + rows, err := connectionSource.Query(ctx, "select * from stop_orders") require.NoError(t, err) assert.False(t, rows.Next()) @@ -140,7 +140,7 @@ func TestStopOrders_Add(t *testing.T) { assert.Len(t, orders, len(stopOrders)) var results []entities.StopOrder - err = pgxscan.Select(ctx, connectionSource.Connection, &results, "select * from stop_orders") + err = pgxscan.Select(ctx, connectionSource, &results, "select * from stop_orders") require.NoError(t, err) assert.Len(t, results, len(stopOrders)) assert.ElementsMatch(t, results, orders) diff --git a/datanode/sqlstore/teams.go b/datanode/sqlstore/teams.go index 4dd6e6c31f1..a9e21baea6b 100644 --- a/datanode/sqlstore/teams.go +++ b/datanode/sqlstore/teams.go @@ -171,7 +171,7 @@ func (t *Teams) AddTeam(ctx context.Context, team *entities.Team) error { team.AllowList = []string{} } - if _, err := t.Connection.Exec( + if _, err := t.Exec( ctx, "INSERT INTO teams(id, referrer, name, team_url, avatar_url, closed, allow_list, created_at, created_at_epoch, vega_time) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)", team.ID, @@ -188,7 +188,7 @@ func (t *Teams) AddTeam(ctx context.Context, team *entities.Team) error { return err } - if _, err := t.Connection.Exec( + if _, err := t.Exec( ctx, "INSERT INTO team_members(team_id, party_id, joined_at_epoch, joined_at, vega_time) VALUES ($1, $2, $3, $4, $5)", team.ID, @@ -210,7 +210,7 @@ func (t *Teams) UpdateTeam(ctx context.Context, team *entities.TeamUpdated) erro team.AllowList = []string{} } - ct, err := t.Connection.Exec(ctx, + ct, err := t.Exec(ctx, `UPDATE teams SET name = $1, team_url = $2, @@ -234,7 +234,7 @@ func (t *Teams) UpdateTeam(ctx context.Context, team *entities.TeamUpdated) erro func (t *Teams) RefereeJoinedTeam(ctx context.Context, referee *entities.TeamMember) error { defer metrics.StartSQLQuery("Teams", "RefereeJoinedTeam")() - _, err := t.Connection.Exec(ctx, + _, err := t.Exec(ctx, `INSERT INTO team_members(team_id, party_id, joined_at, joined_at_epoch, vega_time) VALUES ($1, $2, $3, $4, $5)`, referee.TeamID, referee.PartyID, @@ -249,7 +249,7 @@ func (t *Teams) RefereeJoinedTeam(ctx context.Context, referee *entities.TeamMem func (t *Teams) RefereeSwitchedTeam(ctx context.Context, referee *entities.RefereeTeamSwitch) error { defer metrics.StartSQLQuery("Teams", "RefereeJoinedTeam")() - _, err := t.Connection.Exec(ctx, + _, err := t.Exec(ctx, `INSERT INTO team_members(team_id, party_id, joined_at, joined_at_epoch, vega_time) VALUES ($1, $2, $3, $4, $5)`, referee.ToTeamID, referee.PartyID, @@ -288,7 +288,7 @@ func (t *Teams) TeamsStatsUpdated(ctx context.Context, evt *eventspb.TeamsStatsU } query := fmt.Sprintf(upsertTeamsStats, strings.Join(values, ",")) - _, err := t.Connection.Exec(ctx, query, args...) + _, err := t.Exec(ctx, query, args...) if err != nil { return fmt.Errorf("could not insert team stats update: %w", err) } @@ -327,7 +327,7 @@ FROM teams query = fmt.Sprintf(query, where) - if err := pgxscan.Get(ctx, t.Connection, &team, query, args...); err != nil { + if err := pgxscan.Get(ctx, t.ConnectionSource, &team, query, args...); err != nil { return nil, err } @@ -359,7 +359,7 @@ FROM teams return nil, pageInfo, err } - if err := pgxscan.Select(ctx, t.Connection, &teams, query, args...); err != nil { + if err := pgxscan.Select(ctx, t.ConnectionSource, &teams, query, args...); err != nil { return nil, pageInfo, err } @@ -390,7 +390,7 @@ func (t *Teams) ListTeamsStatistics(ctx context.Context, pagination entities.Cur return nil, pageInfo, err } - if err := pgxscan.Select(ctx, t.Connection, &teamsStats, query, args...); err != nil { + if err := pgxscan.Select(ctx, t.ConnectionSource, &teamsStats, query, args...); err != nil { return nil, pageInfo, err } @@ -431,7 +431,7 @@ func (t *Teams) ListTeamMembersStatistics(ctx context.Context, pagination entiti return nil, pageInfo, err } - if err := pgxscan.Select(ctx, t.Connection, &membersStats, query, args...); err != nil { + if err := pgxscan.Select(ctx, t.ConnectionSource, &membersStats, query, args...); err != nil { return nil, pageInfo, err } @@ -474,7 +474,7 @@ func (t *Teams) ListReferees(ctx context.Context, teamID entities.TeamID, pagina return nil, pageInfo, err } - if err := pgxscan.Select(ctx, t.Connection, &referees, query, args...); err != nil { + if err := pgxscan.Select(ctx, t.ConnectionSource, &referees, query, args...); err != nil { return nil, pageInfo, err } @@ -502,7 +502,7 @@ func (t *Teams) ListRefereeHistory(ctx context.Context, referee entities.PartyID return nil, pageInfo, err } - if err := pgxscan.Select(ctx, t.Connection, &referees, query, args...); err != nil { + if err := pgxscan.Select(ctx, t.ConnectionSource, &referees, query, args...); err != nil { return nil, pageInfo, err } diff --git a/datanode/sqlstore/teams_test.go b/datanode/sqlstore/teams_test.go index 16ff8522899..49ba2397259 100644 --- a/datanode/sqlstore/teams_test.go +++ b/datanode/sqlstore/teams_test.go @@ -65,7 +65,7 @@ func TestTeams_AddTeams(t *testing.T) { require.NoError(t, err) var teamFromDB entities.Team - err = pgxscan.Get(ctx, connectionSource.Connection, &teamFromDB, `SELECT * FROM teams WHERE id=$1`, team.ID) + err = pgxscan.Get(ctx, connectionSource, &teamFromDB, `SELECT * FROM teams WHERE id=$1`, team.ID) require.NoError(t, err) require.Equal(t, team, teamFromDB) }) @@ -129,7 +129,7 @@ func TestTeams_UpdateTeam(t *testing.T) { var got entities.Team - err = pgxscan.Get(ctx, connectionSource.Connection, &got, `SELECT * FROM teams WHERE id=$1`, team.ID) + err = pgxscan.Get(ctx, connectionSource, &got, `SELECT * FROM teams WHERE id=$1`, team.ID) require.NoError(t, err) assert.Equal(t, want, got) @@ -188,7 +188,7 @@ func testTeamsShouldAddReferee(t *testing.T) { assert.NoError(t, ts.RefereeJoinedTeam(ctx, teamReferee)) var got entities.TeamMember - require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got, `SELECT * FROM team_members WHERE team_id=$1 AND party_id=$2`, team.ID, referee.ID)) + require.NoError(t, pgxscan.Get(ctx, connectionSource, &got, `SELECT * FROM team_members WHERE team_id=$1 AND party_id=$2`, team.ID, referee.ID)) assert.Equal(t, teamReferee, &got) } @@ -235,7 +235,7 @@ func testTeamsShouldShowJoinedTeamAsCurrentTeam(t *testing.T) { assert.NoError(t, ts.RefereeJoinedTeam(ctx, entities.TeamRefereeFromProto(joinEvent1, block.VegaTime))) var got1 entities.TeamMember - require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got1, `SELECT * FROM current_team_members WHERE party_id=$1`, referee1.ID)) + require.NoError(t, pgxscan.Get(ctx, connectionSource, &got1, `SELECT * FROM current_team_members WHERE party_id=$1`, referee1.ID)) assert.Equal(t, team1.ID, (&got1).TeamID) referee2 := addTestParty(t, ctx, ps, block) @@ -249,7 +249,7 @@ func testTeamsShouldShowJoinedTeamAsCurrentTeam(t *testing.T) { assert.NoError(t, ts.RefereeJoinedTeam(ctx, entities.TeamRefereeFromProto(joinEvent2, block.VegaTime))) var got2 entities.TeamMember - require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got2, `SELECT * FROM current_team_members WHERE party_id=$1`, referee2.ID)) + require.NoError(t, pgxscan.Get(ctx, connectionSource, &got2, `SELECT * FROM current_team_members WHERE party_id=$1`, referee2.ID)) assert.Equal(t, team2.ID, (&got2).TeamID) } @@ -300,7 +300,7 @@ func testTeamsShouldShowLastJoinedTeamAsCurrentTeam(t *testing.T) { assert.NoError(t, ts.RefereeJoinedTeam(ctx, entities.TeamRefereeFromProto(joinEvent1, block.VegaTime))) var got1 entities.TeamMember - require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got1, `SELECT * FROM current_team_members WHERE party_id=$1`, referee.ID)) + require.NoError(t, pgxscan.Get(ctx, connectionSource, &got1, `SELECT * FROM current_team_members WHERE party_id=$1`, referee.ID)) assert.Equal(t, team1.ID, (&got1).TeamID) joinEvent2 := &eventspb.RefereeJoinedTeam{ @@ -312,7 +312,7 @@ func testTeamsShouldShowLastJoinedTeamAsCurrentTeam(t *testing.T) { assert.NoError(t, ts.RefereeJoinedTeam(ctx, entities.TeamRefereeFromProto(joinEvent2, block.VegaTime))) var got2 entities.TeamMember - require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got2, `SELECT * FROM current_team_members WHERE party_id=$1`, referee.ID)) + require.NoError(t, pgxscan.Get(ctx, connectionSource, &got2, `SELECT * FROM current_team_members WHERE party_id=$1`, referee.ID)) assert.Equal(t, team2.ID, (&got2).TeamID) } diff --git a/datanode/sqlstore/time_weighted_notional_position.go b/datanode/sqlstore/time_weighted_notional_position.go index eefce16d1c6..a41018ae844 100644 --- a/datanode/sqlstore/time_weighted_notional_position.go +++ b/datanode/sqlstore/time_weighted_notional_position.go @@ -36,7 +36,7 @@ func NewTimeWeightedNotionalPosition(connectionSource *ConnectionSource) *TimeWe } func (tw *TimeWeightedNotionalPosition) Upsert(ctx context.Context, twNotionalPos entities.TimeWeightedNotionalPosition) error { - _, err := tw.Connection.Exec(ctx, ` + _, err := tw.Exec(ctx, ` INSERT INTO time_weighted_notional_positions (asset_id, party_id, game_id, epoch_seq, time_weighted_notional_position, vega_time) VALUES ($1, $2, $3, $4, $5, $6) ON CONFLICT (asset_id, party_id, game_id, epoch_seq, vega_time) @@ -53,7 +53,7 @@ func (tw *TimeWeightedNotionalPosition) Get(ctx context.Context, assetID entitie ) (entities.TimeWeightedNotionalPosition, error) { var twNotionalPos entities.TimeWeightedNotionalPosition if epochSeq == nil { - err := pgxscan.Get(ctx, tw.Connection, &twNotionalPos, + err := pgxscan.Get(ctx, tw.ConnectionSource, &twNotionalPos, `SELECT * FROM time_weighted_notional_positions WHERE asset_id = $1 AND party_id = $2 AND game_id = $3 ORDER BY epoch_seq DESC, vega_time DESC LIMIT 1`, assetID, partyID, gameID) @@ -62,7 +62,7 @@ func (tw *TimeWeightedNotionalPosition) Get(ctx context.Context, assetID entitie } return twNotionalPos, nil } - err := pgxscan.Get(ctx, tw.Connection, &twNotionalPos, + err := pgxscan.Get(ctx, tw.ConnectionSource, &twNotionalPos, `SELECT * FROM time_weighted_notional_positions WHERE asset_id = $1 AND party_id = $2 AND game_id = $3 AND epoch_seq = $4 ORDER BY vega_time DESC LIMIT 1`, assetID, partyID, gameID, *epochSeq) diff --git a/datanode/sqlstore/time_weighted_notional_position_test.go b/datanode/sqlstore/time_weighted_notional_position_test.go index 85d576c45fe..31c9527d4fc 100644 --- a/datanode/sqlstore/time_weighted_notional_position_test.go +++ b/datanode/sqlstore/time_weighted_notional_position_test.go @@ -21,6 +21,7 @@ import ( "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" @@ -37,13 +38,13 @@ func TestTimeWeightedNotionalPosition_Upsert(t *testing.T) { PartyID: entities.PartyID(GenerateID()), GameID: entities.GameID(GenerateID()), EpochSeq: 1, - TimeWeightedNotionalPosition: 1000, + TimeWeightedNotionalPosition: num.DecimalFromInt64(1000), VegaTime: time.Now().Truncate(time.Microsecond), } err := tw.Upsert(ctx, want) require.NoError(t, err) var got entities.TimeWeightedNotionalPosition - err = pgxscan.Get(ctx, connectionSource.Connection, &got, + err = pgxscan.Get(ctx, connectionSource, &got, `SELECT * FROM time_weighted_notional_positions WHERE asset_id = $1 AND party_id = $2 and game_id = $3 and epoch_seq = $4`, want.AssetID, want.PartyID, want.GameID, want.EpochSeq) require.NoError(t, err) @@ -57,16 +58,16 @@ func TestTimeWeightedNotionalPosition_Upsert(t *testing.T) { PartyID: entities.PartyID(GenerateID()), GameID: entities.GameID(GenerateID()), EpochSeq: 2, - TimeWeightedNotionalPosition: 1000, + TimeWeightedNotionalPosition: num.DecimalFromInt64(1000), VegaTime: time.Now().Truncate(time.Microsecond), } err := tw.Upsert(ctx, want) require.NoError(t, err) - want.TimeWeightedNotionalPosition = 2000 + want.TimeWeightedNotionalPosition = num.DecimalFromInt64(2000) err = tw.Upsert(ctx, want) require.NoError(t, err) var got entities.TimeWeightedNotionalPosition - err = pgxscan.Get(ctx, connectionSource.Connection, &got, + err = pgxscan.Get(ctx, connectionSource, &got, `SELECT * FROM time_weighted_notional_positions WHERE asset_id = $1 AND party_id = $2 and game_id = $3 and epoch_seq = $4`, want.AssetID, want.PartyID, want.GameID, want.EpochSeq) require.NoError(t, err) @@ -83,7 +84,7 @@ func TestTimeWeightedNotionalPosition_Get(t *testing.T) { PartyID: entities.PartyID(GenerateID()), GameID: entities.GameID(GenerateID()), EpochSeq: 1, - TimeWeightedNotionalPosition: 1000, + TimeWeightedNotionalPosition: num.DecimalFromInt64(1000), VegaTime: time.Now().Truncate(time.Microsecond), } err := tw.Upsert(ctx, want) @@ -100,13 +101,13 @@ func TestTimeWeightedNotionalPosition_Get(t *testing.T) { PartyID: entities.PartyID(GenerateID()), GameID: entities.GameID(GenerateID()), EpochSeq: 1, - TimeWeightedNotionalPosition: 1000, + TimeWeightedNotionalPosition: num.DecimalFromInt64(1000), VegaTime: time.Now().Truncate(time.Microsecond), } err := tw.Upsert(ctx, want) require.NoError(t, err) want.EpochSeq = 2 - want.TimeWeightedNotionalPosition = 2000 + want.TimeWeightedNotionalPosition = num.DecimalFromInt64(2000) want.VegaTime = want.VegaTime.Add(time.Second) err = tw.Upsert(ctx, want) require.NoError(t, err) diff --git a/datanode/sqlstore/trades.go b/datanode/sqlstore/trades.go index 30e3e690b14..e723724649f 100644 --- a/datanode/sqlstore/trades.go +++ b/datanode/sqlstore/trades.go @@ -90,7 +90,7 @@ func (ts *Trades) Flush(ctx context.Context) ([]*entities.Trade, error) { defer metrics.StartSQLQuery("Trades", "Flush")() if rows != nil { - copyCount, err := ts.Connection.CopyFrom( + copyCount, err := ts.CopyFrom( ctx, pgx.Identifier{"trades"}, []string{ @@ -206,7 +206,7 @@ func (ts *Trades) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]en query := `SELECT * from trades WHERE tx_hash=$1` var trades []entities.Trade - err := pgxscan.Select(ctx, ts.Connection, &trades, query, txHash) + err := pgxscan.Select(ctx, ts.ConnectionSource, &trades, query, txHash) if err != nil { return nil, fmt.Errorf("querying trades: %w", err) } @@ -218,7 +218,7 @@ func (ts *Trades) queryTrades(ctx context.Context, query string, args []interfac query, args = queryTradesLast(query, []string{"synthetic_time"}, args...) var trades []entities.Trade - err := pgxscan.Select(ctx, ts.Connection, &trades, query, args...) + err := pgxscan.Select(ctx, ts.ConnectionSource, &trades, query, args...) if err != nil { return nil, fmt.Errorf("querying trades: %w", err) } @@ -261,7 +261,7 @@ func (ts *Trades) queryTradesWithCursorPagination(ctx context.Context, query str } var trades []entities.Trade - err = pgxscan.Select(ctx, ts.Connection, &trades, query, args...) + err = pgxscan.Select(ctx, ts.ConnectionSource, &trades, query, args...) if err != nil { return trades, pageInfo, fmt.Errorf("querying trades: %w", err) } diff --git a/datanode/sqlstore/transfers.go b/datanode/sqlstore/transfers.go index b91f25da8ea..f9e7c28b74c 100644 --- a/datanode/sqlstore/transfers.go +++ b/datanode/sqlstore/transfers.go @@ -96,7 +96,7 @@ func (t *Transfers) Upsert(ctx context.Context, transfer *entities.Transfer) err game_id=excluded.game_id ;` - if _, err := t.Connection.Exec(ctx, query, transfer.ID, transfer.TxHash, transfer.VegaTime, transfer.FromAccountID, transfer.ToAccountID, + if _, err := t.Exec(ctx, query, transfer.ID, transfer.TxHash, transfer.VegaTime, transfer.FromAccountID, transfer.ToAccountID, transfer.AssetID, transfer.Amount, transfer.Reference, transfer.Status, transfer.TransferType, transfer.DeliverOn, transfer.StartEpoch, transfer.EndEpoch, transfer.Factor, transfer.DispatchStrategy, transfer.Reason, transfer.GameID); err != nil { return fmt.Errorf("could not insert transfer into database: %w", err) @@ -114,7 +114,7 @@ func (t *Transfers) UpsertFees(ctx context.Context, tf *entities.TransferFees) e vega_time, discount_applied ) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (vega_time, transfer_id) DO NOTHING;` // conflicts may occur on checkpoint restore. - if _, err := t.Connection.Exec(ctx, query, tf.TransferID, tf.Amount, tf.EpochSeq, tf.VegaTime, tf.DiscountApplied); err != nil { + if _, err := t.Exec(ctx, query, tf.TransferID, tf.Amount, tf.EpochSeq, tf.VegaTime, tf.DiscountApplied); err != nil { return err } return nil @@ -200,7 +200,7 @@ func (t *Transfers) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([] var transfers []entities.Transfer query := "SELECT * FROM transfers WHERE tx_hash = $1 ORDER BY id" - if err := pgxscan.Select(ctx, t.Connection, &transfers, query, txHash); err != nil { + if err := pgxscan.Select(ctx, t.ConnectionSource, &transfers, query, txHash); err != nil { return nil, fmt.Errorf("could not get transfers by transaction hash: %w", err) } return transfers, nil @@ -210,7 +210,7 @@ func (t *Transfers) GetByID(ctx context.Context, id string) (entities.TransferDe var tr entities.Transfer query := `SELECT * FROM transfers_current WHERE id=$1` - if err := pgxscan.Get(ctx, t.Connection, &tr, query, entities.TransferID(id)); err != nil { + if err := pgxscan.Get(ctx, t.ConnectionSource, &tr, query, entities.TransferID(id)); err != nil { return entities.TransferDetails{}, t.wrapE(err) } @@ -271,7 +271,7 @@ func (t *Transfers) UpsertFeesDiscount(ctx context.Context, tfd *entities.Transf epoch_seq, vega_time ) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (vega_time, party_id, asset_id) DO NOTHING ;` // conflicts may occur on checkpoint restore. - if _, err := t.Connection.Exec(ctx, query, tfd.PartyID, tfd.AssetID, tfd.Amount, tfd.EpochSeq, tfd.VegaTime); err != nil { + if _, err := t.Exec(ctx, query, tfd.PartyID, tfd.AssetID, tfd.Amount, tfd.EpochSeq, tfd.VegaTime); err != nil { return err } return nil @@ -289,7 +289,7 @@ func (t *Transfers) GetCurrentTransferFeeDiscount( WHERE party_id = $1 AND asset_id = $2 ORDER BY vega_time DESC LIMIT 1` - if err := pgxscan.Get(ctx, t.Connection, &tfd, query, partyID, assetID); err != nil { + if err := pgxscan.Get(ctx, t.ConnectionSource, &tfd, query, partyID, assetID); err != nil { return &entities.TransferFeesDiscount{}, t.wrapE(err) } @@ -387,7 +387,7 @@ func (t *Transfers) selectTransfers(ctx context.Context, pagination entities.Cur } var transfers []entities.Transfer - err = pgxscan.Select(ctx, t.Connection, &transfers, query, args...) + err = pgxscan.Select(ctx, t.ConnectionSource, &transfers, query, args...) if err != nil { return nil, entities.PageInfo{}, fmt.Errorf("could not get transfers: %w", err) } @@ -404,7 +404,7 @@ func (t *Transfers) getTransferDetails(ctx context.Context, transfers []entities detail := entities.TransferDetails{ Transfer: tr, } - rows, err := t.Connection.Query(ctx, query, tr.ID) + rows, err := t.Query(ctx, query, tr.ID) if errors.Is(err, pgx.ErrNoRows) { details = append(details, detail) if rows != nil { diff --git a/datanode/sqlstore/vesting_stats.go b/datanode/sqlstore/vesting_stats.go index 94897ec4cbe..06fc884e4e6 100644 --- a/datanode/sqlstore/vesting_stats.go +++ b/datanode/sqlstore/vesting_stats.go @@ -40,14 +40,17 @@ func (vs *VestingStats) Add(ctx context.Context, stats *entities.VestingStatsUpd defer metrics.StartSQLQuery("PartyVestingStats", "Add")() for _, v := range stats.PartyVestingStats { - _, err := vs.Connection.Exec(ctx, - `INSERT INTO party_vesting_stats(party_id, at_epoch, reward_bonus_multiplier, quantum_balance, vega_time) - VALUES ($1, $2, $3, $4, $5) + _, err := vs.Exec(ctx, + `INSERT INTO party_vesting_stats(party_id, at_epoch, reward_bonus_multiplier, quantum_balance, + summed_reward_bonus_multiplier, summed_quantum_balance, vega_time) + VALUES ($1, $2, $3, $4, $5, $6, $7) ON CONFLICT (vega_time, party_id) DO NOTHING`, v.PartyID, stats.AtEpoch, v.RewardBonusMultiplier, v.QuantumBalance, + v.SummedRewardBonusMultiplier, + v.SummedQuantumBalance, stats.VegaTime, ) if err != nil { @@ -64,8 +67,9 @@ func (vs *VestingStats) GetByPartyID( defer metrics.StartSQLQuery("Parties", "GetByID")() pvs := entities.PartyVestingStats{} - err := pgxscan.Get(ctx, vs.Connection, &pvs, - `SELECT party_id, at_epoch, reward_bonus_multiplier, quantum_balance, vega_time + err := pgxscan.Get(ctx, vs.ConnectionSource, &pvs, + `SELECT party_id, at_epoch, reward_bonus_multiplier, quantum_balance, + summed_reward_bonus_multiplier, summed_quantum_balance, vega_time FROM party_vesting_stats_current WHERE party_id=$1`, entities.PartyID(id)) diff --git a/datanode/sqlstore/vesting_stats_test.go b/datanode/sqlstore/vesting_stats_test.go index b57c359e9b3..044dd37bb24 100644 --- a/datanode/sqlstore/vesting_stats_test.go +++ b/datanode/sqlstore/vesting_stats_test.go @@ -60,18 +60,22 @@ func TestVestingStats(t *testing.T) { VegaTime: now, PartyVestingStats: []*entities.PartyVestingStats{ { - PartyID: entities.PartyID(party1), - RewardBonusMultiplier: num.MustDecimalFromString("0.5"), - QuantumBalance: num.MustDecimalFromString("10001"), - VegaTime: now, - AtEpoch: 1, + PartyID: entities.PartyID(party1), + RewardBonusMultiplier: num.MustDecimalFromString("0.5"), + QuantumBalance: num.MustDecimalFromString("10001"), + SummedRewardBonusMultiplier: num.MustDecimalFromString("0.5"), + SummedQuantumBalance: num.MustDecimalFromString("10001"), + VegaTime: now, + AtEpoch: 1, }, { - PartyID: entities.PartyID(party2), - RewardBonusMultiplier: num.MustDecimalFromString("1.5"), - QuantumBalance: num.MustDecimalFromString("20001"), - VegaTime: now, - AtEpoch: 1, + PartyID: entities.PartyID(party2), + RewardBonusMultiplier: num.MustDecimalFromString("1.5"), + QuantumBalance: num.MustDecimalFromString("20001"), + SummedRewardBonusMultiplier: num.MustDecimalFromString("1.5"), + SummedQuantumBalance: num.MustDecimalFromString("20001"), + VegaTime: now, + AtEpoch: 1, }, }, } @@ -94,18 +98,22 @@ func TestVestingStats(t *testing.T) { VegaTime: now, PartyVestingStats: []*entities.PartyVestingStats{ { - PartyID: entities.PartyID(party1), - RewardBonusMultiplier: num.MustDecimalFromString("1"), - QuantumBalance: num.MustDecimalFromString("12001"), - VegaTime: now, - AtEpoch: 2, + PartyID: entities.PartyID(party1), + RewardBonusMultiplier: num.MustDecimalFromString("1"), + QuantumBalance: num.MustDecimalFromString("12001"), + SummedRewardBonusMultiplier: num.MustDecimalFromString("1"), + SummedQuantumBalance: num.MustDecimalFromString("12001"), + VegaTime: now, + AtEpoch: 2, }, { - PartyID: entities.PartyID(party2), - RewardBonusMultiplier: num.MustDecimalFromString("2"), - QuantumBalance: num.MustDecimalFromString("30001"), - VegaTime: now, - AtEpoch: 2, + PartyID: entities.PartyID(party2), + RewardBonusMultiplier: num.MustDecimalFromString("2"), + QuantumBalance: num.MustDecimalFromString("30001"), + SummedRewardBonusMultiplier: num.MustDecimalFromString("2"), + SummedQuantumBalance: num.MustDecimalFromString("30001"), + VegaTime: now, + AtEpoch: 2, }, }, } diff --git a/datanode/sqlstore/volume_discount_program.go b/datanode/sqlstore/volume_discount_program.go index b2db6637687..434a5bbbb9b 100644 --- a/datanode/sqlstore/volume_discount_program.go +++ b/datanode/sqlstore/volume_discount_program.go @@ -41,7 +41,7 @@ func (rp *VolumeDiscountPrograms) AddVolumeDiscountProgram(ctx context.Context, } func (rp *VolumeDiscountPrograms) insertVolumeDiscountProgram(ctx context.Context, program *entities.VolumeDiscountProgram) error { - _, err := rp.Connection.Exec(ctx, + _, err := rp.Exec(ctx, `INSERT INTO volume_discount_programs (id, version, benefit_tiers, end_of_program_timestamp, window_length, vega_time, seq_num) VALUES ($1, $2, $3, $4, $5, $6, $7)`, program.ID, @@ -62,7 +62,7 @@ func (rp *VolumeDiscountPrograms) UpdateVolumeDiscountProgram(ctx context.Contex func (rp *VolumeDiscountPrograms) EndVolumeDiscountProgram(ctx context.Context, version uint64, endedAt time.Time, vegaTime time.Time, seqNum uint64) error { defer metrics.StartSQLQuery("VolumeDiscountPrograms", "EndVolumeDiscountProgram")() - _, err := rp.Connection.Exec(ctx, + _, err := rp.Exec(ctx, `INSERT INTO volume_discount_programs (id, version, benefit_tiers, end_of_program_timestamp, window_length, ended_at, vega_time, seq_num) SELECT id, $1, benefit_tiers, end_of_program_timestamp, window_length, $2, $3, $4 FROM current_volume_discount_program`, version, endedAt, vegaTime, seqNum, @@ -76,7 +76,7 @@ func (rp *VolumeDiscountPrograms) GetCurrentVolumeDiscountProgram(ctx context.Co var programProgram entities.VolumeDiscountProgram query := `SELECT id, version, benefit_tiers, end_of_program_timestamp, window_length, vega_time, ended_at, seq_num FROM current_volume_discount_program` - if err := pgxscan.Get(ctx, rp.Connection, &programProgram, query); err != nil { + if err := pgxscan.Get(ctx, rp.ConnectionSource, &programProgram, query); err != nil { return programProgram, err } diff --git a/datanode/sqlstore/volume_discount_programs_test.go b/datanode/sqlstore/volume_discount_programs_test.go index 8fb3d6403ba..22e3058f2ec 100644 --- a/datanode/sqlstore/volume_discount_programs_test.go +++ b/datanode/sqlstore/volume_discount_programs_test.go @@ -93,7 +93,7 @@ func TestVolumeDiscountPrograms_AddVolumeDiscountProgram(t *testing.T) { require.NoError(t, err) var got []entities.VolumeDiscountProgram - require.NoError(t, pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM volume_discount_programs")) + require.NoError(t, pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM volume_discount_programs")) require.Len(t, got, 1) assert.Equal(t, *want, got[0]) @@ -101,7 +101,7 @@ func TestVolumeDiscountPrograms_AddVolumeDiscountProgram(t *testing.T) { err = rs.AddVolumeDiscountProgram(ctx, want2) require.NoError(t, err) - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM volume_discount_programs") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM volume_discount_programs") require.NoError(t, err) require.Len(t, got, 2) wantAll := []entities.VolumeDiscountProgram{*want, *want2} @@ -181,7 +181,7 @@ func TestVolumeDiscountPrograms_UpdateVolumeDiscountProgram(t *testing.T) { require.NoError(t, err) var got []entities.VolumeDiscountProgram - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM volume_discount_programs") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM volume_discount_programs") require.NoError(t, err) require.Len(t, got, 1) @@ -192,7 +192,7 @@ func TestVolumeDiscountPrograms_UpdateVolumeDiscountProgram(t *testing.T) { err = rs.UpdateVolumeDiscountProgram(ctx, wantUpdated) require.NoError(t, err) - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM volume_discount_programs") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM volume_discount_programs") require.NoError(t, err) require.Len(t, got, 2) @@ -203,7 +203,7 @@ func TestVolumeDiscountPrograms_UpdateVolumeDiscountProgram(t *testing.T) { t.Run("The current_referral view should list the updated referral program record", func(t *testing.T) { var got []entities.VolumeDiscountProgram - err := pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM current_volume_discount_program") + err := pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM current_volume_discount_program") require.NoError(t, err) require.Len(t, got, 1) assert.Equal(t, *wantUpdated, got[0]) @@ -237,13 +237,13 @@ func TestVolumeDiscountPrograms_EndVolumeDiscountProgram(t *testing.T) { ended.EndedAt = &endTime var got []entities.VolumeDiscountProgram - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM volume_discount_programs order by vega_time") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM volume_discount_programs order by vega_time") require.NoError(t, err) require.Len(t, got, 3) wantAll := []entities.VolumeDiscountProgram{*started, *updated, *ended} assert.Equal(t, wantAll, got) - err = pgxscan.Select(ctx, connectionSource.Connection, &got, "SELECT * FROM current_volume_discount_program") + err = pgxscan.Select(ctx, connectionSource, &got, "SELECT * FROM current_volume_discount_program") require.NoError(t, err) require.Len(t, got, 1) assert.Equal(t, *ended, got[0]) diff --git a/datanode/sqlstore/volume_discount_stats.go b/datanode/sqlstore/volume_discount_stats.go index 20a3c8df320..32bff814215 100644 --- a/datanode/sqlstore/volume_discount_stats.go +++ b/datanode/sqlstore/volume_discount_stats.go @@ -46,7 +46,7 @@ func NewVolumeDiscountStats(connectionSource *ConnectionSource) *VolumeDiscountS func (s *VolumeDiscountStats) Add(ctx context.Context, stats *entities.VolumeDiscountStats) error { defer metrics.StartSQLQuery("VolumeDiscountStats", "Add")() - _, err := s.Connection.Exec( + _, err := s.Exec( ctx, `INSERT INTO volume_discount_stats(at_epoch, parties_volume_discount_stats, vega_time) values ($1, $2, $3)`, @@ -92,7 +92,7 @@ func (s *VolumeDiscountStats) Stats(ctx context.Context, atEpoch *uint64, partyI return nil, pageInfo, err } - if err := pgxscan.Select(ctx, s.Connection, &stats, query, args...); err != nil { + if err := pgxscan.Select(ctx, s.ConnectionSource, &stats, query, args...); err != nil { return nil, pageInfo, err } diff --git a/datanode/sqlstore/volume_discount_stats_test.go b/datanode/sqlstore/volume_discount_stats_test.go index 960b589b39c..d9d0547bfd2 100644 --- a/datanode/sqlstore/volume_discount_stats_test.go +++ b/datanode/sqlstore/volume_discount_stats_test.go @@ -54,7 +54,7 @@ func TestVolumeDiscountStats_AddVolumeDiscountStats(t *testing.T) { require.NoError(t, vds.Add(ctx, &stats)) var got entities.VolumeDiscountStats - require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got, "SELECT * FROM volume_discount_stats WHERE at_epoch = $1", epoch)) + require.NoError(t, pgxscan.Get(ctx, connectionSource, &got, "SELECT * FROM volume_discount_stats WHERE at_epoch = $1", epoch)) assert.Equal(t, stats, got) }) @@ -70,7 +70,7 @@ func TestVolumeDiscountStats_AddVolumeDiscountStats(t *testing.T) { require.NoError(t, vds.Add(ctx, &stats)) var got entities.VolumeDiscountStats - require.NoError(t, pgxscan.Get(ctx, connectionSource.Connection, &got, "SELECT * FROM volume_discount_stats WHERE at_epoch = $1", epoch)) + require.NoError(t, pgxscan.Get(ctx, connectionSource, &got, "SELECT * FROM volume_discount_stats WHERE at_epoch = $1", epoch)) assert.Equal(t, stats, got) err := vds.Add(ctx, &stats) diff --git a/datanode/sqlstore/votes.go b/datanode/sqlstore/votes.go index f588afcd453..c4594355ae2 100644 --- a/datanode/sqlstore/votes.go +++ b/datanode/sqlstore/votes.go @@ -44,7 +44,7 @@ func NewVotes(connectionSource *ConnectionSource) *Votes { func (vs *Votes) Add(ctx context.Context, v entities.Vote) error { defer metrics.StartSQLQuery("Votes", "Add")() - _, err := vs.Connection.Exec(ctx, + _, err := vs.Exec(ctx, `INSERT INTO votes( proposal_id, party_id, @@ -93,7 +93,7 @@ func (vs *Votes) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]ent var votes []entities.Vote query := `SELECT * FROM votes WHERE tx_hash = $1` - err := pgxscan.Select(ctx, vs.Connection, &votes, query, txHash) + err := pgxscan.Select(ctx, vs.ConnectionSource, &votes, query, txHash) if err != nil { return nil, fmt.Errorf("querying votes: %w", err) } @@ -115,7 +115,7 @@ func (vs *Votes) GetByPartyConnection(ctx context.Context, partyIDStr string, pa return votes, pageInfo, err } - if err = pgxscan.Select(ctx, vs.Connection, &votes, query, args...); err != nil { + if err = pgxscan.Select(ctx, vs.ConnectionSource, &votes, query, args...); err != nil { return nil, entities.PageInfo{}, err } @@ -158,7 +158,7 @@ func (vs *Votes) GetConnection( return votes, pageInfo, err } - if err = pgxscan.Select(ctx, vs.Connection, &votes, query, args...); err != nil { + if err = pgxscan.Select(ctx, vs.ConnectionSource, &votes, query, args...); err != nil { return nil, entities.PageInfo{}, err } @@ -195,7 +195,7 @@ func (vs *Votes) Get(ctx context.Context, } votes := []entities.Vote{} - err := pgxscan.Select(ctx, vs.Connection, &votes, query, args...) + err := pgxscan.Select(ctx, vs.ConnectionSource, &votes, query, args...) if err != nil { return nil, fmt.Errorf("querying votes: %w", err) } diff --git a/datanode/sqlstore/withdrawals.go b/datanode/sqlstore/withdrawals.go index 7273733484b..7f3fd440fe1 100644 --- a/datanode/sqlstore/withdrawals.go +++ b/datanode/sqlstore/withdrawals.go @@ -62,7 +62,7 @@ func (w *Withdrawals) Upsert(ctx context.Context, withdrawal *entities.Withdrawa ext=EXCLUDED.ext, tx_hash=EXCLUDED.tx_hash` - if _, err := w.Connection.Exec(ctx, query, + if _, err := w.Exec(ctx, query, withdrawal.ID, withdrawal.PartyID, withdrawal.Amount, @@ -92,7 +92,7 @@ func (w *Withdrawals) GetByID(ctx context.Context, withdrawalID string) (entitie where id = $1 order by id, vega_time desc` - return withdrawal, w.wrapE(pgxscan.Get(ctx, w.Connection, &withdrawal, query, entities.WithdrawalID(withdrawalID))) + return withdrawal, w.wrapE(pgxscan.Get(ctx, w.ConnectionSource, &withdrawal, query, entities.WithdrawalID(withdrawalID))) } func (w *Withdrawals) GetByTxHash(ctx context.Context, txHash entities.TxHash) ([]entities.Withdrawal, error) { @@ -104,7 +104,7 @@ func (w *Withdrawals) GetByTxHash(ctx context.Context, txHash entities.TxHash) ( ext, tx_hash, vega_time FROM withdrawals WHERE tx_hash = $1` - err := pgxscan.Select(ctx, w.Connection, &withdrawals, query, txHash) + err := pgxscan.Select(ctx, w.ConnectionSource, &withdrawals, query, txHash) if err != nil { return nil, w.wrapE(err) } @@ -137,7 +137,7 @@ func (w *Withdrawals) getByPartyCursor(ctx context.Context, partyID string, pagi } defer metrics.StartSQLQuery("Withdrawals", "GetByParty")() - if err = pgxscan.Select(ctx, w.Connection, &withdrawals, query, args...); err != nil { + if err = pgxscan.Select(ctx, w.ConnectionSource, &withdrawals, query, args...); err != nil { return nil, pageInfo, fmt.Errorf("could not get withdrawals by party: %w", err) } diff --git a/datanode/sqlstore/withdrawals_test.go b/datanode/sqlstore/withdrawals_test.go index 4ce7643a17c..089804618d6 100644 --- a/datanode/sqlstore/withdrawals_test.go +++ b/datanode/sqlstore/withdrawals_test.go @@ -70,7 +70,7 @@ func setupWithdrawalStoreTests(t *testing.T) (*sqlstore.Blocks, *sqlstore.Withdr t.Helper() bs := sqlstore.NewBlocks(connectionSource) ws := sqlstore.NewWithdrawals(connectionSource) - return bs, ws, connectionSource.Connection + return bs, ws, connectionSource } func testAddWithdrawalForNewBlock(t *testing.T) { diff --git a/datanode/sqlsubscribers/account.go b/datanode/sqlsubscribers/account.go index 68e27efcb59..27bd7e3fd80 100644 --- a/datanode/sqlsubscribers/account.go +++ b/datanode/sqlsubscribers/account.go @@ -101,3 +101,7 @@ func (as *Account) obtainAccountWithProto(ctx context.Context, va *vega.Account, } return a, nil } + +func (as *Account) Name() string { + return "Account" +} diff --git a/datanode/sqlsubscribers/amm_pool.go b/datanode/sqlsubscribers/amm_pool.go new file mode 100644 index 00000000000..ccc52503898 --- /dev/null +++ b/datanode/sqlsubscribers/amm_pool.go @@ -0,0 +1,80 @@ +// 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.AMM +} + +type AMMPoolStore interface { + Upsert(ctx context.Context, pool entities.AMMPool) error +} + +type AMMPools struct { + subscriber + store AMMPoolStore + marketDepth MarketDepthService +} + +func NewAMMPools(store AMMPoolStore, marketDepth MarketDepthService) *AMMPools { + return &AMMPools{ + store: store, + marketDepth: marketDepth, + } +} + +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), evt.Sequence()) +} + +func (p *AMMPools) consume(ctx context.Context, pe AMMPoolEvent, seqNum uint64) 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) + } + + if ammPool.Status == entities.AMMStatusRejected || ammPool.Status == entities.AMMStatusUnspecified { + return nil + } + + // send it to the market-depth service + p.marketDepth.OnAMMUpdate(ammPool, p.vegaTime, seqNum) + + return nil +} + +func (p *AMMPools) Name() string { + return "AMMPools" +} diff --git a/datanode/sqlsubscribers/asset.go b/datanode/sqlsubscribers/asset.go index d4aabdb7aab..fa0821fde2b 100644 --- a/datanode/sqlsubscribers/asset.go +++ b/datanode/sqlsubscribers/asset.go @@ -123,3 +123,7 @@ func (a *Asset) addAsset(ctx context.Context, va vega.Asset, txHash string, vega return errors.WithStack(a.store.Add(ctx, asset)) } + +func (a *Asset) Name() string { + return "Asset" +} diff --git a/datanode/sqlsubscribers/checkpoint.go b/datanode/sqlsubscribers/checkpoint.go index 3d36ca5c703..b3961a91157 100644 --- a/datanode/sqlsubscribers/checkpoint.go +++ b/datanode/sqlsubscribers/checkpoint.go @@ -69,3 +69,7 @@ func (n *Checkpoint) consume(ctx context.Context, event CheckpointEvent) error { return nil } + +func (n *Checkpoint) Name() string { + return "Checkpoint" +} diff --git a/datanode/sqlsubscribers/delegations.go b/datanode/sqlsubscribers/delegations.go index aa452cdcb78..ffe694f6604 100644 --- a/datanode/sqlsubscribers/delegations.go +++ b/datanode/sqlsubscribers/delegations.go @@ -70,3 +70,7 @@ func (ds *Delegation) consume(ctx context.Context, event DelegationBalanceEvent) return nil } + +func (ds *Delegation) Name() string { + return "Delegation" +} diff --git a/datanode/sqlsubscribers/deposits.go b/datanode/sqlsubscribers/deposits.go index ae226f85679..85893076377 100644 --- a/datanode/sqlsubscribers/deposits.go +++ b/datanode/sqlsubscribers/deposits.go @@ -62,3 +62,7 @@ func (d *Deposit) consume(ctx context.Context, event DepositEvent) error { return errors.Wrap(d.store.Upsert(ctx, record), "inserting deposit to SQL store failed") } + +func (d *Deposit) Name() string { + return "Deposit" +} diff --git a/datanode/sqlsubscribers/epoch.go b/datanode/sqlsubscribers/epoch.go index 3ea6c6f3aa4..0a82b13a8d1 100644 --- a/datanode/sqlsubscribers/epoch.go +++ b/datanode/sqlsubscribers/epoch.go @@ -61,3 +61,7 @@ func (es *Epoch) consume(ctx context.Context, event EpochUpdateEvent) error { return errors.Wrap(es.store.Add(ctx, epoch), "error adding epoch update") } + +func (es *Epoch) Name() string { + return "Epoch" +} diff --git a/datanode/sqlsubscribers/erc20_multisig_event.go b/datanode/sqlsubscribers/erc20_multisig_event.go index 6bd9043662b..46c3c2b51c4 100644 --- a/datanode/sqlsubscribers/erc20_multisig_event.go +++ b/datanode/sqlsubscribers/erc20_multisig_event.go @@ -88,3 +88,7 @@ func (m *ERC20MultiSigSignerEvent) consumeRemovedEvent(ctx context.Context, even } return nil } + +func (m *ERC20MultiSigSignerEvent) Name() string { + return "ERC20MultiSigSignerEvent" +} diff --git a/datanode/sqlsubscribers/ethereum_key_rotation.go b/datanode/sqlsubscribers/ethereum_key_rotation.go index a138df0549c..360618e8205 100644 --- a/datanode/sqlsubscribers/ethereum_key_rotation.go +++ b/datanode/sqlsubscribers/ethereum_key_rotation.go @@ -63,3 +63,7 @@ func (kr *EthereumKeyRotation) consume(ctx context.Context, event EthereumKeyRot return errors.Wrap(kr.service.Add(ctx, record), "Inserting ethereum key rotation to SQL store failed") } + +func (kr *EthereumKeyRotation) Name() string { + return "EthereumKeyRotation" +} diff --git a/datanode/sqlsubscribers/fees_stats.go b/datanode/sqlsubscribers/fees_stats.go index 234a2cdcc34..ddba1d6846d 100644 --- a/datanode/sqlsubscribers/fees_stats.go +++ b/datanode/sqlsubscribers/fees_stats.go @@ -63,3 +63,7 @@ func (r *FeesStats) Push(ctx context.Context, evt events.Event) error { func (r *FeesStats) consumeFeesStatsEvent(ctx context.Context, e FeesStatsEvent) error { return r.store.AddFeesStats(ctx, entities.FeesStatsFromProto(e.FeesStats(), r.vegaTime)) } + +func (r *FeesStats) Name() string { + return "FeesStats" +} diff --git a/datanode/sqlsubscribers/funding_payments.go b/datanode/sqlsubscribers/funding_payments.go index e662b4e5c47..038f9f1ffc8 100644 --- a/datanode/sqlsubscribers/funding_payments.go +++ b/datanode/sqlsubscribers/funding_payments.go @@ -78,3 +78,7 @@ func (ts *FundingPaymentSubscriber) addFundingPayments( return errors.Wrap(ts.store.Add(ctx, payments), "adding funding payment to store") } + +func (ts *FundingPaymentSubscriber) Name() string { + return "FundingPaymentSubscriber" +} diff --git a/datanode/sqlsubscribers/funding_period.go b/datanode/sqlsubscribers/funding_period.go index adb250e7d0e..e4622186e78 100644 --- a/datanode/sqlsubscribers/funding_period.go +++ b/datanode/sqlsubscribers/funding_period.go @@ -83,3 +83,7 @@ func (fp *FundingPeriod) consumeFundingPeriodDataPointEvent(ctx context.Context, } return errors.Wrap(fp.store.AddDataPoint(ctx, dataPoint), "adding funding period data point") } + +func (fp *FundingPeriod) Name() string { + return "FundingPeriod" +} diff --git a/datanode/sqlsubscribers/game_scores.go b/datanode/sqlsubscribers/game_scores.go new file mode 100644 index 00000000000..9e914cfaa0b --- /dev/null +++ b/datanode/sqlsubscribers/game_scores.go @@ -0,0 +1,80 @@ +// 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" + + "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/datanode/entities" + eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1" + + "github.com/pkg/errors" +) + +type GameScoreEvent interface { + events.Event + GameScoreEvent() eventspb.GameScores +} + +type GameScoreStore interface { + AddTeamScore(context.Context, entities.GameTeamScore) error + AddPartyScore(context.Context, entities.GamePartyScore) error +} + +type GameScore struct { + subscriber + store GameScoreStore +} + +func NewGameScore(store GameScoreStore) *GameScore { + t := &GameScore{ + store: store, + } + return t +} + +func (gs *GameScore) Types() []events.Type { + return []events.Type{events.GameScoresEvent} +} + +func (gs *GameScore) Push(ctx context.Context, evt events.Event) error { + return gs.consume(ctx, evt.(GameScoreEvent)) +} + +func (gs *GameScore) consume(ctx context.Context, event GameScoreEvent) error { + gameScoresEvents := event.GameScoreEvent() + teamScores, partyScores, err := entities.GameScoresFromProto(&gameScoresEvents, entities.TxHash(event.TxHash()), gs.vegaTime, event.Sequence()) + if err != nil { + return errors.Wrap(err, "unable to parse game scores") + } + + for _, ts := range teamScores { + if err := gs.store.AddTeamScore(ctx, ts); err != nil { + return errors.Wrap(err, "error adding team score") + } + } + for _, ps := range partyScores { + if err := gs.store.AddPartyScore(ctx, ps); err != nil { + return errors.Wrap(err, "error adding party score") + } + } + return nil +} + +func (gs *GameScore) Name() string { + return "GameScore" +} diff --git a/datanode/sqlsubscribers/game_scores_test.go b/datanode/sqlsubscribers/game_scores_test.go new file mode 100644 index 00000000000..8176e8969d7 --- /dev/null +++ b/datanode/sqlsubscribers/game_scores_test.go @@ -0,0 +1,51 @@ +// 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_test + +import ( + "context" + "testing" + "time" + + "code.vegaprotocol.io/vega/core/events" + "code.vegaprotocol.io/vega/core/types" + "code.vegaprotocol.io/vega/datanode/sqlsubscribers" + "code.vegaprotocol.io/vega/datanode/sqlsubscribers/mocks" + "code.vegaprotocol.io/vega/libs/num" + + "github.com/golang/mock/gomock" +) + +func TestGameScore_Push(t *testing.T) { + ctrl := gomock.NewController(t) + + store := mocks.NewMockGameScoreStore(ctrl) + + store.EXPECT().AddPartyScore(gomock.Any(), gomock.Any()).Times(2) + store.EXPECT().AddTeamScore(gomock.Any(), gomock.Any()).Times(2) + subscriber := sqlsubscribers.NewGameScore(store) + subscriber.Flush(context.Background()) + subscriber.Push(context.Background(), events.NewTeamGameScoresEvent( + context.Background(), + 1, + "game1", + time.Now(), + []*types.PartyContributionScore{{Party: "team1", Score: num.DecimalOne()}, {Party: "team2", Score: num.DecimalOne()}}, + map[string][]*types.PartyContributionScore{ + "team1": {{Party: "party1", Score: num.DecimalOne(), StakingBalance: num.UintZero(), OpenVolume: num.UintZero(), TotalFeesPaid: num.UintZero()}}, + "team2": {{Party: "party2", Score: num.DecimalOne(), StakingBalance: num.UintZero(), OpenVolume: num.UintZero(), TotalFeesPaid: num.UintZero()}}, + })) +} diff --git a/datanode/sqlsubscribers/key_rotation.go b/datanode/sqlsubscribers/key_rotation.go index 58e783eba94..cf8b50f368a 100644 --- a/datanode/sqlsubscribers/key_rotation.go +++ b/datanode/sqlsubscribers/key_rotation.go @@ -62,3 +62,7 @@ func (kr *KeyRotation) consume(ctx context.Context, event KeyRotationEvent) erro return errors.Wrap(kr.store.Upsert(ctx, record), "Inserting key rotation to SQL store failed") } + +func (kr *KeyRotation) Name() string { + return "KeyRotation" +} diff --git a/datanode/sqlsubscribers/ledger_movement.go b/datanode/sqlsubscribers/ledger_movement.go index 60af7b19035..cc46974bb82 100644 --- a/datanode/sqlsubscribers/ledger_movement.go +++ b/datanode/sqlsubscribers/ledger_movement.go @@ -148,3 +148,7 @@ func (t *TransferResponse) obtainAccountWithAccountDetails(ctx context.Context, } return a, nil } + +func (t *TransferResponse) Name() string { + return "TransferResponse" +} diff --git a/datanode/sqlsubscribers/liquidity_provision.go b/datanode/sqlsubscribers/liquidity_provision.go index 16bea82cb3b..f4e55e518f8 100644 --- a/datanode/sqlsubscribers/liquidity_provision.go +++ b/datanode/sqlsubscribers/liquidity_provision.go @@ -76,3 +76,7 @@ func (lp *LiquidityProvision) consume(ctx context.Context, event LiquidityProvis err = lp.store.Upsert(ctx, entity) return errors.Wrap(err, "adding liquidity provision to store") } + +func (lp *LiquidityProvision) Name() string { + return "LiquidityProvision" +} diff --git a/datanode/sqlsubscribers/margin_levels.go b/datanode/sqlsubscribers/margin_levels.go index 27083518e07..026492c3e34 100644 --- a/datanode/sqlsubscribers/margin_levels.go +++ b/datanode/sqlsubscribers/margin_levels.go @@ -83,3 +83,7 @@ func (ml *MarginLevels) consume(ctx context.Context, event MarginLevelsEvent) er err = ml.store.Add(entity) return errors.Wrap(err, "add margin level to store") } + +func (ml *MarginLevels) Name() string { + return "MarginLevels" +} diff --git a/datanode/sqlsubscribers/margin_modes.go b/datanode/sqlsubscribers/margin_modes.go index 8561142639c..c057e83d960 100644 --- a/datanode/sqlsubscribers/margin_modes.go +++ b/datanode/sqlsubscribers/margin_modes.go @@ -58,3 +58,7 @@ func NewMarginModes(store MarginModeStore) *MarginModes { store: store, } } + +func (t *MarginModes) Name() string { + return "MarginModes" +} diff --git a/datanode/sqlsubscribers/market_created.go b/datanode/sqlsubscribers/market_created.go index 6f8613c52f2..720a9c9cee7 100644 --- a/datanode/sqlsubscribers/market_created.go +++ b/datanode/sqlsubscribers/market_created.go @@ -62,3 +62,7 @@ func (m *MarketCreated) consume(ctx context.Context, event MarketCreatedEvent) e return errors.Wrap(m.store.Upsert(ctx, record), "inserting market to SQL store failed:%w") } + +func (m *MarketCreated) Name() string { + return "MarketCreated" +} diff --git a/datanode/sqlsubscribers/market_data.go b/datanode/sqlsubscribers/market_data.go index 25dc7047525..149db783211 100644 --- a/datanode/sqlsubscribers/market_data.go +++ b/datanode/sqlsubscribers/market_data.go @@ -83,3 +83,7 @@ func (md *MarketData) convertMarketDataProto(data *types.MarketData, seqNum uint return record, nil } + +func (md *MarketData) Name() string { + return "MarketData" +} diff --git a/datanode/sqlsubscribers/market_updated.go b/datanode/sqlsubscribers/market_updated.go index 87568c9056c..d019a6f9d62 100644 --- a/datanode/sqlsubscribers/market_updated.go +++ b/datanode/sqlsubscribers/market_updated.go @@ -58,3 +58,7 @@ func (m *MarketUpdated) consume(ctx context.Context, event MarketUpdatedEvent) e return errors.Wrap(m.store.Upsert(ctx, record), "updating market to SQL store failed") } + +func (m *MarketUpdated) Name() string { + return "MarketUpdated" +} diff --git a/datanode/sqlsubscribers/mocks/mocks.go b/datanode/sqlsubscribers/mocks/mocks.go index c4d1da44dfe..0e39e7ccef9 100644 --- a/datanode/sqlsubscribers/mocks/mocks.go +++ b/datanode/sqlsubscribers/mocks/mocks.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: code.vegaprotocol.io/vega/datanode/sqlsubscribers (interfaces: RiskFactorStore,TransferStore,WithdrawalStore,LiquidityProvisionStore,KeyRotationStore,OracleSpecStore,DepositStore,StakeLinkingStore,MarketDataStore,PositionStore,OracleDataStore,MarginLevelsStore,NotaryStore,NodeStore,MarketsStore,MarketSvc) +// Source: code.vegaprotocol.io/vega/datanode/sqlsubscribers (interfaces: RiskFactorStore,TransferStore,WithdrawalStore,LiquidityProvisionStore,KeyRotationStore,OracleSpecStore,DepositStore,StakeLinkingStore,MarketDataStore,PositionStore,OracleDataStore,MarginLevelsStore,NotaryStore,NodeStore,MarketsStore,MarketSvc,GameScoreStore) // Package mocks is a generated GoMock package. package mocks @@ -819,3 +819,54 @@ func (mr *MockMarketSvcMockRecorder) IsSpotMarket(arg0, arg1 interface{}) *gomoc mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "IsSpotMarket", reflect.TypeOf((*MockMarketSvc)(nil).IsSpotMarket), arg0, arg1) } + +// MockGameScoreStore is a mock of GameScoreStore interface. +type MockGameScoreStore struct { + ctrl *gomock.Controller + recorder *MockGameScoreStoreMockRecorder +} + +// MockGameScoreStoreMockRecorder is the mock recorder for MockGameScoreStore. +type MockGameScoreStoreMockRecorder struct { + mock *MockGameScoreStore +} + +// NewMockGameScoreStore creates a new mock instance. +func NewMockGameScoreStore(ctrl *gomock.Controller) *MockGameScoreStore { + mock := &MockGameScoreStore{ctrl: ctrl} + mock.recorder = &MockGameScoreStoreMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockGameScoreStore) EXPECT() *MockGameScoreStoreMockRecorder { + return m.recorder +} + +// AddPartyScore mocks base method. +func (m *MockGameScoreStore) AddPartyScore(arg0 context.Context, arg1 entities.GamePartyScore) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddPartyScore", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddPartyScore indicates an expected call of AddPartyScore. +func (mr *MockGameScoreStoreMockRecorder) AddPartyScore(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddPartyScore", reflect.TypeOf((*MockGameScoreStore)(nil).AddPartyScore), arg0, arg1) +} + +// AddTeamScore mocks base method. +func (m *MockGameScoreStore) AddTeamScore(arg0 context.Context, arg1 entities.GameTeamScore) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddTeamScore", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddTeamScore indicates an expected call of AddTeamScore. +func (mr *MockGameScoreStoreMockRecorder) AddTeamScore(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddTeamScore", reflect.TypeOf((*MockGameScoreStore)(nil).AddTeamScore), arg0, arg1) +} diff --git a/datanode/sqlsubscribers/network_limits.go b/datanode/sqlsubscribers/network_limits.go index d43ff8e3220..680f01dddbc 100644 --- a/datanode/sqlsubscribers/network_limits.go +++ b/datanode/sqlsubscribers/network_limits.go @@ -61,3 +61,7 @@ func (nl *NetworkLimits) consume(ctx context.Context, event NetworkLimitsEvent) return errors.Wrap(nl.store.Add(ctx, limits), "error adding network limits") } + +func (nl *NetworkLimits) Name() string { + return "NetworkLimits" +} diff --git a/datanode/sqlsubscribers/network_parameters.go b/datanode/sqlsubscribers/network_parameters.go index e7ed8c012df..9d983ad53ad 100644 --- a/datanode/sqlsubscribers/network_parameters.go +++ b/datanode/sqlsubscribers/network_parameters.go @@ -64,3 +64,7 @@ func (n *NetworkParameter) consume(ctx context.Context, event NetworkParameterEv return errors.Wrap(n.store.Add(ctx, np), "error adding networkParameter") } + +func (n *NetworkParameter) Name() string { + return "NetworkParameter" +} diff --git a/datanode/sqlsubscribers/node.go b/datanode/sqlsubscribers/node.go index dac8e750c6b..120d09d6534 100644 --- a/datanode/sqlsubscribers/node.go +++ b/datanode/sqlsubscribers/node.go @@ -138,3 +138,7 @@ func (n *Node) consumeEthereumKeyRotation(ctx context.Context, event EthereumKey return errors.Wrap(n.store.UpdateEthereumAddress(ctx, record), "Updating public key to SQL store failed") } + +func (n *Node) Name() string { + return "Node" +} diff --git a/datanode/sqlsubscribers/notary.go b/datanode/sqlsubscribers/notary.go index 03692c130ea..150dce3adf2 100644 --- a/datanode/sqlsubscribers/notary.go +++ b/datanode/sqlsubscribers/notary.go @@ -66,3 +66,7 @@ func (n *Notary) Types() []events.Type { events.NodeSignatureEvent, } } + +func (n *Notary) Name() string { + return "Notary" +} diff --git a/datanode/sqlsubscribers/oracle_data.go b/datanode/sqlsubscribers/oracle_data.go index 5c817787651..6020b9a6b14 100644 --- a/datanode/sqlsubscribers/oracle_data.go +++ b/datanode/sqlsubscribers/oracle_data.go @@ -62,3 +62,7 @@ func (od *OracleData) consume(ctx context.Context, event OracleDataEvent) error return errors.Wrap(od.store.Add(ctx, entity), "inserting oracle data proto to SQL store failed") } + +func (od *OracleData) Name() string { + return "OracleData" +} diff --git a/datanode/sqlsubscribers/oracle_spec.go b/datanode/sqlsubscribers/oracle_spec.go index 438e238135e..b095e2a0a5b 100644 --- a/datanode/sqlsubscribers/oracle_spec.go +++ b/datanode/sqlsubscribers/oracle_spec.go @@ -59,3 +59,7 @@ func (od *OracleSpec) consume(ctx context.Context, event OracleSpecEvent) error return errors.Wrap(od.store.Upsert(ctx, entity), "inserting oracle spec to SQL store failed") } + +func (od *OracleSpec) Name() string { + return "OracleSpec" +} diff --git a/datanode/sqlsubscribers/order.go b/datanode/sqlsubscribers/order.go index 10a4b4281bf..234f690ecdf 100644 --- a/datanode/sqlsubscribers/order.go +++ b/datanode/sqlsubscribers/order.go @@ -28,6 +28,7 @@ import ( ) type MarketDepthService interface { + OnAMMUpdate(pool entities.AMMPool, vt time.Time, seqNum uint64) AddOrder(order *types.Order, vegaTime time.Time, sequenceNumber uint64) PublishAtEndOfBlock() } @@ -58,12 +59,17 @@ type Order struct { subscriber store OrderStore depthService MarketDepthService + // the store uses the batcher type which could be used as a cache, provided we know the + // version and vegatime type for the orders we need to persist. This isn't the case + // but orders are ingested here, so we can cache them here, of course. + cache map[entities.OrderID]entities.Order } func NewOrder(store OrderStore, depthService MarketDepthService) *Order { return &Order{ store: store, depthService: depthService, + cache: map[entities.OrderID]entities.Order{}, } } @@ -91,6 +97,8 @@ func (os *Order) Push(ctx context.Context, evt events.Event) error { } func (os *Order) Flush(ctx context.Context) error { + // clear cache + os.cache = map[entities.OrderID]entities.Order{} return os.store.Flush(ctx) } @@ -114,7 +122,7 @@ func (os *Order) expired(ctx context.Context, eo ExpiredOrdersEvent, seqNum uint } os.depthService.AddOrder(torder, os.vegaTime, seqNum) - if err := os.store.Add(o); err != nil { + if err := os.persist(o); err != nil { return errors.Wrap(os.store.Add(o), "adding order to database") } // the next order will be insterted as though it was the next event on the bus, with a new sequence number: @@ -124,10 +132,26 @@ func (os *Order) expired(ctx context.Context, eo ExpiredOrdersEvent, seqNum uint } func (os *Order) cancelled(ctx context.Context, co CancelledOrdersEvent, seqNum uint64) error { - orders, err := os.store.GetByMarketAndID(ctx, co.MarketID(), co.OrderIDs()) - if err != nil { - return err + allIds := co.OrderIDs() + ids := make([]string, 0, len(allIds)) + orders := make([]entities.Order, 0, len(allIds)) + for _, id := range allIds { + k := entities.OrderID(id) + if o, ok := os.cache[k]; ok { + orders = append(orders, o) + } else { + ids = append(ids, id) + } + } + + if len(ids) > 0 { + ncOrders, err := os.store.GetByMarketAndID(ctx, co.MarketID(), ids) + if err != nil { + return err + } + orders = append(orders, ncOrders...) } + txHash := entities.TxHash(co.TxHash()) for _, o := range orders { o.Status = entities.OrderStatusCancelled @@ -142,7 +166,7 @@ func (os *Order) cancelled(ctx context.Context, co CancelledOrdersEvent, seqNum } os.depthService.AddOrder(torder, os.vegaTime, seqNum) - if err := os.store.Add(o); err != nil { + if err := os.persist(o); err != nil { return errors.Wrap(err, "adding order to database") } seqNum++ @@ -166,9 +190,18 @@ func (os *Order) consume(oe OrderEvent, seqNum uint64) error { } os.depthService.AddOrder(torder, os.vegaTime, seqNum) - return errors.Wrap(os.store.Add(order), "adding order to database") + return errors.Wrap(os.persist(order), "adding order to database") } func (os *Order) consumeEndBlock() { os.depthService.PublishAtEndOfBlock() } + +func (os *Order) persist(o entities.Order) error { + os.cache[o.ID] = o + return os.store.Add(o) +} + +func (os *Order) Name() string { + return "Order" +} diff --git a/datanode/sqlsubscribers/paid_liquidity_fee_stats.go b/datanode/sqlsubscribers/paid_liquidity_fee_stats.go index 1f6fb079cb5..d7a843337ab 100644 --- a/datanode/sqlsubscribers/paid_liquidity_fee_stats.go +++ b/datanode/sqlsubscribers/paid_liquidity_fee_stats.go @@ -63,3 +63,7 @@ func (r *PaidLiquidityFeesStats) Push(ctx context.Context, evt events.Event) err func (r *PaidLiquidityFeesStats) consumeFeeStatsEvent(ctx context.Context, e PaidLiquidityFeesStatsEvent) error { return r.store.Add(ctx, entities.PaidLiquidityFeesStatsFromProto(e.PaidLiquidityFeesStats(), r.vegaTime)) } + +func (r *PaidLiquidityFeesStats) Name() string { + return "PaidLiquidityFeesStats" +} diff --git a/datanode/sqlsubscribers/party.go b/datanode/sqlsubscribers/party.go index 8566a78a23d..6fbadba05e5 100644 --- a/datanode/sqlsubscribers/party.go +++ b/datanode/sqlsubscribers/party.go @@ -83,3 +83,7 @@ func (ps *Party) consumePartyProfileUpdated(ctx context.Context, e PartyProfileU return errors.Wrap(ps.store.UpdateProfile(ctx, updated), "updating party profile") } + +func (ps *Party) Name() string { + return "Party" +} diff --git a/datanode/sqlsubscribers/party_activity_streak.go b/datanode/sqlsubscribers/party_activity_streak.go index 0803200940d..833e279d8d6 100644 --- a/datanode/sqlsubscribers/party_activity_streak.go +++ b/datanode/sqlsubscribers/party_activity_streak.go @@ -65,3 +65,7 @@ func (pas *PartyActivityStreak) consumePartyActivityStreakEvent(ctx context.Cont return errors.Wrap(pas.store.Add(ctx, activityStreak), "adding party activity streak") } + +func (pas *PartyActivityStreak) Name() string { + return "PartyActivityStreak" +} diff --git a/datanode/sqlsubscribers/position.go b/datanode/sqlsubscribers/position.go index 46b441f1649..4d3527fd1d2 100644 --- a/datanode/sqlsubscribers/position.go +++ b/datanode/sqlsubscribers/position.go @@ -357,3 +357,7 @@ func (p *Position) updatePosition(ctx context.Context, pos entities.Position) er err := p.store.Add(ctx, pos) return errors.Wrap(err, "error updating position") } + +func (p *Position) Name() string { + return "Position" +} diff --git a/datanode/sqlsubscribers/proposal.go b/datanode/sqlsubscribers/proposal.go index 9d858c765b0..54bf735f2f3 100644 --- a/datanode/sqlsubscribers/proposal.go +++ b/datanode/sqlsubscribers/proposal.go @@ -68,3 +68,7 @@ func (ps *Proposal) consume(ctx context.Context, event ProposalEvent) error { return errors.Wrap(ps.store.AddProposal(ctx, proposal), "error adding proposal") } + +func (ps *Proposal) Name() string { + return "Proposal" +} diff --git a/datanode/sqlsubscribers/protocol_upgrade_proposal.go b/datanode/sqlsubscribers/protocol_upgrade_proposal.go index 87e8e49b9f0..0868dcebf81 100644 --- a/datanode/sqlsubscribers/protocol_upgrade_proposal.go +++ b/datanode/sqlsubscribers/protocol_upgrade_proposal.go @@ -63,3 +63,7 @@ func (ps *ProtocolUpgrade) consume(ctx context.Context, event ProtocolUpgradePro return nil } + +func (ps *ProtocolUpgrade) Name() string { + return "ProtocolUpgrade" +} diff --git a/datanode/sqlsubscribers/referral_programs.go b/datanode/sqlsubscribers/referral_programs.go index c924560ba4a..10c20d4963c 100644 --- a/datanode/sqlsubscribers/referral_programs.go +++ b/datanode/sqlsubscribers/referral_programs.go @@ -93,3 +93,7 @@ func (rp *ReferralProgram) consumeReferralProgramEndedEvent(ctx context.Context, ev := e.GetReferralProgramEnded() return rp.store.EndReferralProgram(ctx, ev.GetVersion(), time.Unix(0, ev.EndedAt), rp.vegaTime, e.Sequence()) } + +func (rp *ReferralProgram) Name() string { + return "ReferralProgram" +} diff --git a/datanode/sqlsubscribers/referral_sets.go b/datanode/sqlsubscribers/referral_sets.go index b9e5a47ed9b..2e3a56ef06b 100644 --- a/datanode/sqlsubscribers/referral_sets.go +++ b/datanode/sqlsubscribers/referral_sets.go @@ -95,3 +95,7 @@ func (rs *ReferralSets) consumeReferralSetStatsUpdated(ctx context.Context, e Re } return rs.store.AddReferralSetStats(ctx, stats) } + +func (rs *ReferralSets) Name() string { + return "ReferralSets" +} diff --git a/datanode/sqlsubscribers/rewards.go b/datanode/sqlsubscribers/rewards.go index 694a8001748..10d4b38e7db 100644 --- a/datanode/sqlsubscribers/rewards.go +++ b/datanode/sqlsubscribers/rewards.go @@ -68,3 +68,7 @@ func (rs *Reward) consume(ctx context.Context, event RewardPayoutEvent) error { return errors.Wrap(rs.store.Add(ctx, reward), "error adding reward payout") } + +func (rs *Reward) Name() string { + return "Reward" +} diff --git a/datanode/sqlsubscribers/risk_factors.go b/datanode/sqlsubscribers/risk_factors.go index 4fef5d7fdc3..ad1177e83e2 100644 --- a/datanode/sqlsubscribers/risk_factors.go +++ b/datanode/sqlsubscribers/risk_factors.go @@ -62,3 +62,7 @@ func (rf *RiskFactor) consume(ctx context.Context, event RiskFactorEvent) error return errors.Wrap(rf.store.Upsert(ctx, record), "inserting risk factor to SQL store failed") } + +func (rf *RiskFactor) Name() string { + return "RiskFactor" +} diff --git a/datanode/sqlsubscribers/snapshot_data.go b/datanode/sqlsubscribers/snapshot_data.go index 6d1ca126d5a..009c57877a3 100644 --- a/datanode/sqlsubscribers/snapshot_data.go +++ b/datanode/sqlsubscribers/snapshot_data.go @@ -62,3 +62,7 @@ func (s *SnapshotData) consume(ctx context.Context, event CoreSnapshotEvent) err return nil } + +func (s *SnapshotData) Name() string { + return "SnapshotData" +} diff --git a/datanode/sqlsubscribers/stake_linking.go b/datanode/sqlsubscribers/stake_linking.go index 315583f4844..447030dc867 100644 --- a/datanode/sqlsubscribers/stake_linking.go +++ b/datanode/sqlsubscribers/stake_linking.go @@ -62,3 +62,7 @@ func (sl StakeLinking) consume(ctx context.Context, event StakeLinkingEvent) err return errors.Wrap(sl.store.Upsert(ctx, entity), "inserting stake linking event to SQL store failed") } + +func (sl *StakeLinking) Name() string { + return "StakeLinking" +} diff --git a/datanode/sqlsubscribers/stop_orders.go b/datanode/sqlsubscribers/stop_orders.go index cddb71f698d..d73319b634d 100644 --- a/datanode/sqlsubscribers/stop_orders.go +++ b/datanode/sqlsubscribers/stop_orders.go @@ -70,3 +70,7 @@ func (so *StopOrder) consume(evt StopOrderEvent, seqNum uint64) error { } return errors.Wrap(so.store.Add(stop), "adding stop order") } + +func (so *StopOrder) Name() string { + return "StopOrder" +} diff --git a/datanode/sqlsubscribers/subscriber.go b/datanode/sqlsubscribers/subscriber.go index a3c2dba1874..20f92cf6e35 100644 --- a/datanode/sqlsubscribers/subscriber.go +++ b/datanode/sqlsubscribers/subscriber.go @@ -20,7 +20,7 @@ import ( "time" ) -//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/datanode/sqlsubscribers RiskFactorStore,TransferStore,WithdrawalStore,LiquidityProvisionStore,KeyRotationStore,OracleSpecStore,DepositStore,StakeLinkingStore,MarketDataStore,PositionStore,OracleDataStore,MarginLevelsStore,NotaryStore,NodeStore,MarketsStore,MarketSvc +//go:generate go run github.com/golang/mock/mockgen -destination mocks/mocks.go -package mocks code.vegaprotocol.io/vega/datanode/sqlsubscribers RiskFactorStore,TransferStore,WithdrawalStore,LiquidityProvisionStore,KeyRotationStore,OracleSpecStore,DepositStore,StakeLinkingStore,MarketDataStore,PositionStore,OracleDataStore,MarginLevelsStore,NotaryStore,NodeStore,MarketsStore,MarketSvc,GameScoreStore type subscriber struct { vegaTime time.Time diff --git a/datanode/sqlsubscribers/teams.go b/datanode/sqlsubscribers/teams.go index c3a197fb755..74d2777d48d 100644 --- a/datanode/sqlsubscribers/teams.go +++ b/datanode/sqlsubscribers/teams.go @@ -125,3 +125,7 @@ func (t *Teams) consumeRefereeSwitchedTeamEvent(ctx context.Context, e RefereeSw func (t *Teams) consumeTeamsStatsUpdatedEvent(ctx context.Context, e TeamsStatsUpdated) error { return errors.Wrap(t.store.TeamsStatsUpdated(ctx, e.TeamsStatsUpdated()), "teams stats updated") } + +func (t *Teams) Name() string { + return "Teams" +} diff --git a/datanode/sqlsubscribers/time_weighted_notional_position.go b/datanode/sqlsubscribers/time_weighted_notional_position.go index fd15f5da410..6df779c8cbb 100644 --- a/datanode/sqlsubscribers/time_weighted_notional_position.go +++ b/datanode/sqlsubscribers/time_weighted_notional_position.go @@ -64,3 +64,7 @@ func (tw *TimeWeightedNotionalPosition) Push(ctx context.Context, e events.Event return fmt.Errorf("unexpected event type: %T", e) } } + +func (tw *TimeWeightedNotionalPosition) Name() string { + return "TimeWeightedNotionalPosition" +} diff --git a/datanode/sqlsubscribers/trades.go b/datanode/sqlsubscribers/trades.go index dc5ceaf497d..a75d8ebc4ed 100644 --- a/datanode/sqlsubscribers/trades.go +++ b/datanode/sqlsubscribers/trades.go @@ -72,3 +72,7 @@ func (ts *TradeSubscriber) addTrade(t *types.Trade, txHash entities.TxHash, vega return errors.Wrap(ts.store.Add(trade), "adding trade to store") } + +func (ts *TradeSubscriber) Name() string { + return "TradeSubscriber" +} diff --git a/datanode/sqlsubscribers/transaction_results.go b/datanode/sqlsubscribers/transaction_results.go index fb822c814fc..69bc10b420e 100644 --- a/datanode/sqlsubscribers/transaction_results.go +++ b/datanode/sqlsubscribers/transaction_results.go @@ -68,3 +68,7 @@ func (tr *TransactionResults) Observe(ctx context.Context, retries int, }) return ch, ref } + +func (tr *TransactionResults) Name() string { + return "TransactionResults" +} diff --git a/datanode/sqlsubscribers/transfers.go b/datanode/sqlsubscribers/transfers.go index eb63259b7cf..8132c9e03f0 100644 --- a/datanode/sqlsubscribers/transfers.go +++ b/datanode/sqlsubscribers/transfers.go @@ -105,3 +105,7 @@ func (rf *Transfer) handleDiscount(ctx context.Context, e TransferFeesDiscountUp discount := entities.TransferFeesDiscountFromProto(&tf, rf.vegaTime) return errors.Wrap(rf.store.UpsertFeesDiscount(ctx, discount), "inserting transfer fee discount update into SQL store failed") } + +func (rf *Transfer) Name() string { + return "Transfer" +} diff --git a/datanode/sqlsubscribers/vesting_stats_updated.go b/datanode/sqlsubscribers/vesting_stats_updated.go index 889bdb7c6a3..1819a0045cf 100644 --- a/datanode/sqlsubscribers/vesting_stats_updated.go +++ b/datanode/sqlsubscribers/vesting_stats_updated.go @@ -68,3 +68,7 @@ func (pas *VestingStatsUpdated) consumeVestingStatsUpdatedEvent(ctx context.Cont return errors.Wrap(pas.store.Add(ctx, stats), "could not add vesting stats to the store") } + +func (pas *VestingStatsUpdated) Name() string { + return "VestingStatsUpdated" +} diff --git a/datanode/sqlsubscribers/vesting_summary.go b/datanode/sqlsubscribers/vesting_summary.go index 3f6d349e46c..429358530e5 100644 --- a/datanode/sqlsubscribers/vesting_summary.go +++ b/datanode/sqlsubscribers/vesting_summary.go @@ -102,3 +102,7 @@ func (v *VestingBalancesSummary) consumeVestingBalancesSummaryEvent(ctx context. return v.lockedStore.Prune(ctx, evt.EpochSeq) } + +func (v *VestingBalancesSummary) Name() string { + return "VestingBalancesSummary" +} diff --git a/datanode/sqlsubscribers/volume_discount_programs.go b/datanode/sqlsubscribers/volume_discount_programs.go index ee4f5046bc1..f298a2e5489 100644 --- a/datanode/sqlsubscribers/volume_discount_programs.go +++ b/datanode/sqlsubscribers/volume_discount_programs.go @@ -93,3 +93,7 @@ func (rp *VolumeDiscountProgram) consumeVolumeDiscountProgramEndedEvent(ctx cont ev := e.GetVolumeDiscountProgramEnded() return rp.store.EndVolumeDiscountProgram(ctx, ev.GetVersion(), time.Unix(0, ev.EndedAt), rp.vegaTime, e.Sequence()) } + +func (rp *VolumeDiscountProgram) Name() string { + return "VolumeDiscountProgram" +} diff --git a/datanode/sqlsubscribers/volume_discount_stats_updated.go b/datanode/sqlsubscribers/volume_discount_stats_updated.go index 15750f40d18..8a5d2a8ebd5 100644 --- a/datanode/sqlsubscribers/volume_discount_stats_updated.go +++ b/datanode/sqlsubscribers/volume_discount_stats_updated.go @@ -68,3 +68,7 @@ func (pas *VolumeDiscountStatsUpdated) consumeVolumeDiscountStatsUpdatedEvent(ct return errors.Wrap(pas.store.Add(ctx, stats), "could not add volume discount stats to the store") } + +func (pas *VolumeDiscountStatsUpdated) Name() string { + return "VolumeDiscountStatsUpdated" +} diff --git a/datanode/sqlsubscribers/vote.go b/datanode/sqlsubscribers/vote.go index 98d338db04a..eb5e604a30b 100644 --- a/datanode/sqlsubscribers/vote.go +++ b/datanode/sqlsubscribers/vote.go @@ -72,3 +72,7 @@ func (vs *Vote) consume(ctx context.Context, event VoteEvent) error { return errors.Wrap(vs.store.AddVote(ctx, vote), "error adding vote:%w") } + +func (vs *Vote) Name() string { + return "Vote" +} diff --git a/datanode/sqlsubscribers/withdrawals.go b/datanode/sqlsubscribers/withdrawals.go index 19f8d7e14d8..229c8a04854 100644 --- a/datanode/sqlsubscribers/withdrawals.go +++ b/datanode/sqlsubscribers/withdrawals.go @@ -62,3 +62,7 @@ func (w *Withdrawal) consume(ctx context.Context, event WithdrawalEvent) error { return errors.Wrap(w.store.Upsert(ctx, record), "inserting withdrawal to SQL store failed") } + +func (w *Withdrawal) Name() string { + return "Withdrawal" +} diff --git a/datanode/utils/databasetest/setup.go b/datanode/utils/databasetest/setup.go index d9f8fe7d5b2..f8ad14f23da 100644 --- a/datanode/utils/databasetest/setup.go +++ b/datanode/utils/databasetest/setup.go @@ -42,7 +42,7 @@ var ( postgresServerTimeout = time.Second * 10 ) -func TestMain(m *testing.M, onSetupComplete func(sqlstore.Config, *sqlstore.ConnectionSource, *bytes.Buffer), +func TestMain(m *testing.M, mainCtx context.Context, onSetupComplete func(sqlstore.Config, *sqlstore.ConnectionSource, *bytes.Buffer), postgresRuntimePath string, sqlFs fs.FS, ) int { testDBSocketDir := filepath.Join(postgresRuntimePath) @@ -70,7 +70,7 @@ func TestMain(m *testing.M, onSetupComplete func(sqlstore.Config, *sqlstore.Conn log.Infof("Test DB Port: %d", testDBPort) // Make sure the database has started before we run the tests. - ctx, cancel := context.WithTimeout(context.Background(), postgresServerTimeout) + ctx, cancel := context.WithTimeout(mainCtx, postgresServerTimeout) op := func() error { connStr := sqlConfig.ConnectionConfig.GetConnectionString() @@ -88,7 +88,7 @@ func TestMain(m *testing.M, onSetupComplete func(sqlstore.Config, *sqlstore.Conn } cancel() - connectionSource, err := sqlstore.NewTransactionalConnectionSource(log, sqlConfig.ConnectionConfig) + connectionSource, err := sqlstore.NewTransactionalConnectionSource(mainCtx, log, sqlConfig.ConnectionConfig) if err != nil { panic(err) } diff --git a/datanode/utils/observer.go b/datanode/utils/observer.go index 673d37c4623..9041478274c 100644 --- a/datanode/utils/observer.go +++ b/datanode/utils/observer.go @@ -140,6 +140,7 @@ func (o *Observer[T]) Observe(ctx context.Context, retries int, filter func(T) b close(out) return } + filtered := make([]T, 0, len(values)) for _, value := range values { if filter(value) { diff --git a/go.mod b/go.mod index 12c32e95970..982c5fd4358 100644 --- a/go.mod +++ b/go.mod @@ -49,7 +49,7 @@ require ( github.com/adrg/xdg v0.4.0 github.com/blang/semver/v4 v4.0.0 github.com/cenkalti/backoff/v4 v4.2.1 - github.com/cometbft/cometbft v0.38.6 + github.com/cometbft/cometbft v0.38.8 github.com/cometbft/cometbft-db v0.7.0 github.com/cucumber/messages-go/v16 v16.0.1 github.com/dgraph-io/badger/v2 v2.2007.4 @@ -373,7 +373,7 @@ require ( golang.org/x/exp v0.0.0-20231206192017-f3f8817b8deb golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/tools v0.19.0 // indirect gonum.org/v1/gonum v0.13.0 // indirect diff --git a/go.sum b/go.sum index 60c91eda393..4663a648b03 100644 --- a/go.sum +++ b/go.sum @@ -205,8 +205,8 @@ github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811/go.mod h1:Nb5lg github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/cometbft/cometbft v0.38.6 h1:QSgpCzrGWJ2KUq1qpw+FCfASRpE27T6LQbfEHscdyOk= -github.com/cometbft/cometbft v0.38.6/go.mod h1:8rSPxzUJYquCN8uuBgbUHOMg2KAwvr7CyUw+6ukO4nw= +github.com/cometbft/cometbft v0.38.8 h1:XyJ9Cu3xqap6xtNxiemrO8roXZ+KS2Zlu7qQ0w1trvU= +github.com/cometbft/cometbft v0.38.8/go.mod h1:xOoGZrtUT+A5izWfHSJgl0gYZUE7lu7Z2XIS1vWG/QQ= github.com/cometbft/cometbft-db v0.7.0 h1:uBjbrBx4QzU0zOEnU8KxoDl18dMNgDh+zZRUE0ucsbo= github.com/cometbft/cometbft-db v0.7.0/go.mod h1:yiKJIm2WKrt6x8Cyxtq9YTEcIMPcEe4XPxhgX59Fzf0= github.com/confio/ics23/go v0.9.0 h1:cWs+wdbS2KRPZezoaaj+qBleXgUk5WOQFMP3CQFGTr4= @@ -1736,8 +1736,8 @@ golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= diff --git a/libs/num/compare.go b/libs/num/compare.go index af9ec849bda..930a33d7dcd 100644 --- a/libs/num/compare.go +++ b/libs/num/compare.go @@ -52,6 +52,14 @@ func AbsV[T Signed](a T) T { return a } +// DeltaV generic delta function signed primitives. +func DeltaV[T Signed](a, b T) T { + if a < b { + return b - a + } + return a - b +} + // MaxAbs - get max value based on absolute values of abolute vals. func MaxAbs[T Signed](vals ...T) T { var r, m T diff --git a/libs/num/uint.go b/libs/num/uint.go index 4e0863f6f0d..5c837ae8067 100644 --- a/libs/num/uint.go +++ b/libs/num/uint.go @@ -371,6 +371,30 @@ func (u *Uint) Exp(x, y *Uint) *Uint { return u } +// Sqrt calculates the integer-square root of the given Uint. +func (u *Uint) SqrtInt(x *Uint) *Uint { + u.u.Sqrt(&x.u) + return u +} + +// Sqrt calculates the square root in decimals of the given Uint. +func (u *Uint) Sqrt(x *Uint) Decimal { + if x.IsZero() { + return DecimalZero() + } + // integer sqrt is a good approximation + r := UintOne().SqrtInt(x).ToDecimal() + + // so now lets do a few iterations using Heron's Method to get closer + // r_i = (r + u/r) / 2 + ud := x.ToDecimal() + for i := 0; i < 6; i++ { + r = r.Add(ud.Div(r)).Div(DecimalFromInt64(2)) + } + + return r +} + // 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..928fc28e9d8 100644 --- a/libs/num/uint_test.go +++ b/libs/num/uint_test.go @@ -244,3 +244,19 @@ 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) + + rt := n.Sqrt(n) + assert.Equal(t, "11111.1110605555554406", rt.String()) + + rt = n.Sqrt(num.UintZero()) + assert.Equal(t, "0", rt.String()) + + rt = n.Sqrt(num.UintOne()) + assert.Equal(t, "1", rt.String()) + + n.SqrtInt(n) + assert.Equal(t, "11111", n.String()) +} diff --git a/mocks/mocks.go b/mocks/mocks.go new file mode 100644 index 00000000000..dd7f7335032 --- /dev/null +++ b/mocks/mocks.go @@ -0,0 +1,2721 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: code.vegaprotocol.io/vega/datanode/gateway/graphql (interfaces: CoreProxyServiceClient,TradingDataServiceClientV2) + +// Package mocks is a generated GoMock package. +package mocks + +import ( + context "context" + reflect "reflect" + + v2 "code.vegaprotocol.io/vega/protos/data-node/api/v2" + v1 "code.vegaprotocol.io/vega/protos/vega/api/v1" + gomock "github.com/golang/mock/gomock" + grpc "google.golang.org/grpc" +) + +// MockCoreProxyServiceClient is a mock of CoreProxyServiceClient interface. +type MockCoreProxyServiceClient struct { + ctrl *gomock.Controller + recorder *MockCoreProxyServiceClientMockRecorder +} + +// MockCoreProxyServiceClientMockRecorder is the mock recorder for MockCoreProxyServiceClient. +type MockCoreProxyServiceClientMockRecorder struct { + mock *MockCoreProxyServiceClient +} + +// NewMockCoreProxyServiceClient creates a new mock instance. +func NewMockCoreProxyServiceClient(ctrl *gomock.Controller) *MockCoreProxyServiceClient { + mock := &MockCoreProxyServiceClient{ctrl: ctrl} + mock.recorder = &MockCoreProxyServiceClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockCoreProxyServiceClient) EXPECT() *MockCoreProxyServiceClientMockRecorder { + return m.recorder +} + +// CheckRawTransaction mocks base method. +func (m *MockCoreProxyServiceClient) CheckRawTransaction(arg0 context.Context, arg1 *v1.CheckRawTransactionRequest, arg2 ...grpc.CallOption) (*v1.CheckRawTransactionResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CheckRawTransaction", varargs...) + ret0, _ := ret[0].(*v1.CheckRawTransactionResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckRawTransaction indicates an expected call of CheckRawTransaction. +func (mr *MockCoreProxyServiceClientMockRecorder) CheckRawTransaction(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, "CheckRawTransaction", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).CheckRawTransaction), varargs...) +} + +// CheckTransaction mocks base method. +func (m *MockCoreProxyServiceClient) CheckTransaction(arg0 context.Context, arg1 *v1.CheckTransactionRequest, arg2 ...grpc.CallOption) (*v1.CheckTransactionResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CheckTransaction", varargs...) + ret0, _ := ret[0].(*v1.CheckTransactionResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CheckTransaction indicates an expected call of CheckTransaction. +func (mr *MockCoreProxyServiceClientMockRecorder) CheckTransaction(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, "CheckTransaction", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).CheckTransaction), varargs...) +} + +// GetSpamStatistics mocks base method. +func (m *MockCoreProxyServiceClient) GetSpamStatistics(arg0 context.Context, arg1 *v1.GetSpamStatisticsRequest, arg2 ...grpc.CallOption) (*v1.GetSpamStatisticsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetSpamStatistics", varargs...) + ret0, _ := ret[0].(*v1.GetSpamStatisticsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetSpamStatistics indicates an expected call of GetSpamStatistics. +func (mr *MockCoreProxyServiceClientMockRecorder) GetSpamStatistics(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, "GetSpamStatistics", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).GetSpamStatistics), varargs...) +} + +// GetVegaTime mocks base method. +func (m *MockCoreProxyServiceClient) GetVegaTime(arg0 context.Context, arg1 *v1.GetVegaTimeRequest, arg2 ...grpc.CallOption) (*v1.GetVegaTimeResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetVegaTime", varargs...) + ret0, _ := ret[0].(*v1.GetVegaTimeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetVegaTime indicates an expected call of GetVegaTime. +func (mr *MockCoreProxyServiceClientMockRecorder) GetVegaTime(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, "GetVegaTime", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).GetVegaTime), varargs...) +} + +// LastBlockHeight mocks base method. +func (m *MockCoreProxyServiceClient) LastBlockHeight(arg0 context.Context, arg1 *v1.LastBlockHeightRequest, arg2 ...grpc.CallOption) (*v1.LastBlockHeightResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "LastBlockHeight", varargs...) + ret0, _ := ret[0].(*v1.LastBlockHeightResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// LastBlockHeight indicates an expected call of LastBlockHeight. +func (mr *MockCoreProxyServiceClientMockRecorder) LastBlockHeight(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, "LastBlockHeight", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).LastBlockHeight), varargs...) +} + +// ObserveEventBus mocks base method. +func (m *MockCoreProxyServiceClient) ObserveEventBus(arg0 context.Context, arg1 ...grpc.CallOption) (v1.CoreService_ObserveEventBusClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveEventBus", varargs...) + ret0, _ := ret[0].(v1.CoreService_ObserveEventBusClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveEventBus indicates an expected call of ObserveEventBus. +func (mr *MockCoreProxyServiceClientMockRecorder) ObserveEventBus(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ObserveEventBus", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).ObserveEventBus), varargs...) +} + +// PropagateChainEvent mocks base method. +func (m *MockCoreProxyServiceClient) PropagateChainEvent(arg0 context.Context, arg1 *v1.PropagateChainEventRequest, arg2 ...grpc.CallOption) (*v1.PropagateChainEventResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "PropagateChainEvent", varargs...) + ret0, _ := ret[0].(*v1.PropagateChainEventResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PropagateChainEvent indicates an expected call of PropagateChainEvent. +func (mr *MockCoreProxyServiceClientMockRecorder) PropagateChainEvent(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, "PropagateChainEvent", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).PropagateChainEvent), varargs...) +} + +// Statistics mocks base method. +func (m *MockCoreProxyServiceClient) Statistics(arg0 context.Context, arg1 *v1.StatisticsRequest, arg2 ...grpc.CallOption) (*v1.StatisticsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Statistics", varargs...) + ret0, _ := ret[0].(*v1.StatisticsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Statistics indicates an expected call of Statistics. +func (mr *MockCoreProxyServiceClientMockRecorder) Statistics(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, "Statistics", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).Statistics), varargs...) +} + +// SubmitRawTransaction mocks base method. +func (m *MockCoreProxyServiceClient) SubmitRawTransaction(arg0 context.Context, arg1 *v1.SubmitRawTransactionRequest, arg2 ...grpc.CallOption) (*v1.SubmitRawTransactionResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "SubmitRawTransaction", varargs...) + ret0, _ := ret[0].(*v1.SubmitRawTransactionResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SubmitRawTransaction indicates an expected call of SubmitRawTransaction. +func (mr *MockCoreProxyServiceClientMockRecorder) SubmitRawTransaction(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, "SubmitRawTransaction", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).SubmitRawTransaction), varargs...) +} + +// SubmitTransaction mocks base method. +func (m *MockCoreProxyServiceClient) SubmitTransaction(arg0 context.Context, arg1 *v1.SubmitTransactionRequest, arg2 ...grpc.CallOption) (*v1.SubmitTransactionResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "SubmitTransaction", varargs...) + ret0, _ := ret[0].(*v1.SubmitTransactionResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SubmitTransaction indicates an expected call of SubmitTransaction. +func (mr *MockCoreProxyServiceClientMockRecorder) SubmitTransaction(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, "SubmitTransaction", reflect.TypeOf((*MockCoreProxyServiceClient)(nil).SubmitTransaction), varargs...) +} + +// MockTradingDataServiceClientV2 is a mock of TradingDataServiceClientV2 interface. +type MockTradingDataServiceClientV2 struct { + ctrl *gomock.Controller + recorder *MockTradingDataServiceClientV2MockRecorder +} + +// MockTradingDataServiceClientV2MockRecorder is the mock recorder for MockTradingDataServiceClientV2. +type MockTradingDataServiceClientV2MockRecorder struct { + mock *MockTradingDataServiceClientV2 +} + +// NewMockTradingDataServiceClientV2 creates a new mock instance. +func NewMockTradingDataServiceClientV2(ctrl *gomock.Controller) *MockTradingDataServiceClientV2 { + mock := &MockTradingDataServiceClientV2{ctrl: ctrl} + mock.recorder = &MockTradingDataServiceClientV2MockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockTradingDataServiceClientV2) EXPECT() *MockTradingDataServiceClientV2MockRecorder { + return m.recorder +} + +// EstimateFee mocks base method. +func (m *MockTradingDataServiceClientV2) EstimateFee(arg0 context.Context, arg1 *v2.EstimateFeeRequest, arg2 ...grpc.CallOption) (*v2.EstimateFeeResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "EstimateFee", varargs...) + ret0, _ := ret[0].(*v2.EstimateFeeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// EstimateFee indicates an expected call of EstimateFee. +func (mr *MockTradingDataServiceClientV2MockRecorder) EstimateFee(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, "EstimateFee", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).EstimateFee), varargs...) +} + +// EstimateMargin mocks base method. +func (m *MockTradingDataServiceClientV2) EstimateMargin(arg0 context.Context, arg1 *v2.EstimateMarginRequest, arg2 ...grpc.CallOption) (*v2.EstimateMarginResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "EstimateMargin", varargs...) + ret0, _ := ret[0].(*v2.EstimateMarginResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// EstimateMargin indicates an expected call of EstimateMargin. +func (mr *MockTradingDataServiceClientV2MockRecorder) EstimateMargin(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, "EstimateMargin", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).EstimateMargin), varargs...) +} + +// EstimatePosition mocks base method. +func (m *MockTradingDataServiceClientV2) EstimatePosition(arg0 context.Context, arg1 *v2.EstimatePositionRequest, arg2 ...grpc.CallOption) (*v2.EstimatePositionResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "EstimatePosition", varargs...) + ret0, _ := ret[0].(*v2.EstimatePositionResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// EstimatePosition indicates an expected call of EstimatePosition. +func (mr *MockTradingDataServiceClientV2MockRecorder) EstimatePosition(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, "EstimatePosition", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).EstimatePosition), varargs...) +} + +// EstimateTransferFee mocks base method. +func (m *MockTradingDataServiceClientV2) EstimateTransferFee(arg0 context.Context, arg1 *v2.EstimateTransferFeeRequest, arg2 ...grpc.CallOption) (*v2.EstimateTransferFeeResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "EstimateTransferFee", varargs...) + ret0, _ := ret[0].(*v2.EstimateTransferFeeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// EstimateTransferFee indicates an expected call of EstimateTransferFee. +func (mr *MockTradingDataServiceClientV2MockRecorder) EstimateTransferFee(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, "EstimateTransferFee", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).EstimateTransferFee), varargs...) +} + +// ExportLedgerEntries mocks base method. +func (m *MockTradingDataServiceClientV2) ExportLedgerEntries(arg0 context.Context, arg1 *v2.ExportLedgerEntriesRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ExportLedgerEntriesClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ExportLedgerEntries", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ExportLedgerEntriesClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ExportLedgerEntries indicates an expected call of ExportLedgerEntries. +func (mr *MockTradingDataServiceClientV2MockRecorder) ExportLedgerEntries(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, "ExportLedgerEntries", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ExportLedgerEntries), varargs...) +} + +// ExportNetworkHistory mocks base method. +func (m *MockTradingDataServiceClientV2) ExportNetworkHistory(arg0 context.Context, arg1 *v2.ExportNetworkHistoryRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ExportNetworkHistoryClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ExportNetworkHistory", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ExportNetworkHistoryClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ExportNetworkHistory indicates an expected call of ExportNetworkHistory. +func (mr *MockTradingDataServiceClientV2MockRecorder) ExportNetworkHistory(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, "ExportNetworkHistory", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ExportNetworkHistory), varargs...) +} + +// GetActiveNetworkHistoryPeerAddresses mocks base method. +func (m *MockTradingDataServiceClientV2) GetActiveNetworkHistoryPeerAddresses(arg0 context.Context, arg1 *v2.GetActiveNetworkHistoryPeerAddressesRequest, arg2 ...grpc.CallOption) (*v2.GetActiveNetworkHistoryPeerAddressesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetActiveNetworkHistoryPeerAddresses", varargs...) + ret0, _ := ret[0].(*v2.GetActiveNetworkHistoryPeerAddressesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetActiveNetworkHistoryPeerAddresses indicates an expected call of GetActiveNetworkHistoryPeerAddresses. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetActiveNetworkHistoryPeerAddresses(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, "GetActiveNetworkHistoryPeerAddresses", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetActiveNetworkHistoryPeerAddresses), varargs...) +} + +// GetAsset mocks base method. +func (m *MockTradingDataServiceClientV2) GetAsset(arg0 context.Context, arg1 *v2.GetAssetRequest, arg2 ...grpc.CallOption) (*v2.GetAssetResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetAsset", varargs...) + ret0, _ := ret[0].(*v2.GetAssetResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetAsset indicates an expected call of GetAsset. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetAsset(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, "GetAsset", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetAsset), varargs...) +} + +// GetCurrentReferralProgram mocks base method. +func (m *MockTradingDataServiceClientV2) GetCurrentReferralProgram(arg0 context.Context, arg1 *v2.GetCurrentReferralProgramRequest, arg2 ...grpc.CallOption) (*v2.GetCurrentReferralProgramResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetCurrentReferralProgram", varargs...) + ret0, _ := ret[0].(*v2.GetCurrentReferralProgramResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetCurrentReferralProgram indicates an expected call of GetCurrentReferralProgram. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetCurrentReferralProgram(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, "GetCurrentReferralProgram", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetCurrentReferralProgram), varargs...) +} + +// GetCurrentVolumeDiscountProgram mocks base method. +func (m *MockTradingDataServiceClientV2) GetCurrentVolumeDiscountProgram(arg0 context.Context, arg1 *v2.GetCurrentVolumeDiscountProgramRequest, arg2 ...grpc.CallOption) (*v2.GetCurrentVolumeDiscountProgramResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetCurrentVolumeDiscountProgram", varargs...) + ret0, _ := ret[0].(*v2.GetCurrentVolumeDiscountProgramResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetCurrentVolumeDiscountProgram indicates an expected call of GetCurrentVolumeDiscountProgram. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetCurrentVolumeDiscountProgram(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, "GetCurrentVolumeDiscountProgram", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetCurrentVolumeDiscountProgram), varargs...) +} + +// GetDeposit mocks base method. +func (m *MockTradingDataServiceClientV2) GetDeposit(arg0 context.Context, arg1 *v2.GetDepositRequest, arg2 ...grpc.CallOption) (*v2.GetDepositResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetDeposit", varargs...) + ret0, _ := ret[0].(*v2.GetDepositResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetDeposit indicates an expected call of GetDeposit. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetDeposit(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, "GetDeposit", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetDeposit), varargs...) +} + +// GetERC20ListAssetBundle mocks base method. +func (m *MockTradingDataServiceClientV2) GetERC20ListAssetBundle(arg0 context.Context, arg1 *v2.GetERC20ListAssetBundleRequest, arg2 ...grpc.CallOption) (*v2.GetERC20ListAssetBundleResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetERC20ListAssetBundle", varargs...) + ret0, _ := ret[0].(*v2.GetERC20ListAssetBundleResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetERC20ListAssetBundle indicates an expected call of GetERC20ListAssetBundle. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetERC20ListAssetBundle(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, "GetERC20ListAssetBundle", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetERC20ListAssetBundle), varargs...) +} + +// GetERC20SetAssetLimitsBundle mocks base method. +func (m *MockTradingDataServiceClientV2) GetERC20SetAssetLimitsBundle(arg0 context.Context, arg1 *v2.GetERC20SetAssetLimitsBundleRequest, arg2 ...grpc.CallOption) (*v2.GetERC20SetAssetLimitsBundleResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetERC20SetAssetLimitsBundle", varargs...) + ret0, _ := ret[0].(*v2.GetERC20SetAssetLimitsBundleResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetERC20SetAssetLimitsBundle indicates an expected call of GetERC20SetAssetLimitsBundle. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetERC20SetAssetLimitsBundle(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, "GetERC20SetAssetLimitsBundle", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetERC20SetAssetLimitsBundle), varargs...) +} + +// GetERC20WithdrawalApproval mocks base method. +func (m *MockTradingDataServiceClientV2) GetERC20WithdrawalApproval(arg0 context.Context, arg1 *v2.GetERC20WithdrawalApprovalRequest, arg2 ...grpc.CallOption) (*v2.GetERC20WithdrawalApprovalResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetERC20WithdrawalApproval", varargs...) + ret0, _ := ret[0].(*v2.GetERC20WithdrawalApprovalResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetERC20WithdrawalApproval indicates an expected call of GetERC20WithdrawalApproval. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetERC20WithdrawalApproval(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, "GetERC20WithdrawalApproval", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetERC20WithdrawalApproval), varargs...) +} + +// GetEpoch mocks base method. +func (m *MockTradingDataServiceClientV2) GetEpoch(arg0 context.Context, arg1 *v2.GetEpochRequest, arg2 ...grpc.CallOption) (*v2.GetEpochResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetEpoch", varargs...) + ret0, _ := ret[0].(*v2.GetEpochResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetEpoch indicates an expected call of GetEpoch. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetEpoch(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, "GetEpoch", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetEpoch), varargs...) +} + +// GetFeesStats mocks base method. +func (m *MockTradingDataServiceClientV2) GetFeesStats(arg0 context.Context, arg1 *v2.GetFeesStatsRequest, arg2 ...grpc.CallOption) (*v2.GetFeesStatsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetFeesStats", varargs...) + ret0, _ := ret[0].(*v2.GetFeesStatsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetFeesStats indicates an expected call of GetFeesStats. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetFeesStats(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, "GetFeesStats", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetFeesStats), varargs...) +} + +// GetFeesStatsForParty mocks base method. +func (m *MockTradingDataServiceClientV2) GetFeesStatsForParty(arg0 context.Context, arg1 *v2.GetFeesStatsForPartyRequest, arg2 ...grpc.CallOption) (*v2.GetFeesStatsForPartyResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetFeesStatsForParty", varargs...) + ret0, _ := ret[0].(*v2.GetFeesStatsForPartyResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetFeesStatsForParty indicates an expected call of GetFeesStatsForParty. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetFeesStatsForParty(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, "GetFeesStatsForParty", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetFeesStatsForParty), varargs...) +} + +// GetGovernanceData mocks base method. +func (m *MockTradingDataServiceClientV2) GetGovernanceData(arg0 context.Context, arg1 *v2.GetGovernanceDataRequest, arg2 ...grpc.CallOption) (*v2.GetGovernanceDataResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetGovernanceData", varargs...) + ret0, _ := ret[0].(*v2.GetGovernanceDataResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetGovernanceData indicates an expected call of GetGovernanceData. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetGovernanceData(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, "GetGovernanceData", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetGovernanceData), varargs...) +} + +// GetLastTrade mocks base method. +func (m *MockTradingDataServiceClientV2) GetLastTrade(arg0 context.Context, arg1 *v2.GetLastTradeRequest, arg2 ...grpc.CallOption) (*v2.GetLastTradeResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetLastTrade", varargs...) + ret0, _ := ret[0].(*v2.GetLastTradeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetLastTrade indicates an expected call of GetLastTrade. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetLastTrade(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, "GetLastTrade", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetLastTrade), varargs...) +} + +// GetLatestMarketData mocks base method. +func (m *MockTradingDataServiceClientV2) GetLatestMarketData(arg0 context.Context, arg1 *v2.GetLatestMarketDataRequest, arg2 ...grpc.CallOption) (*v2.GetLatestMarketDataResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetLatestMarketData", varargs...) + ret0, _ := ret[0].(*v2.GetLatestMarketDataResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetLatestMarketData indicates an expected call of GetLatestMarketData. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetLatestMarketData(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, "GetLatestMarketData", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetLatestMarketData), varargs...) +} + +// GetLatestMarketDepth mocks base method. +func (m *MockTradingDataServiceClientV2) GetLatestMarketDepth(arg0 context.Context, arg1 *v2.GetLatestMarketDepthRequest, arg2 ...grpc.CallOption) (*v2.GetLatestMarketDepthResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetLatestMarketDepth", varargs...) + ret0, _ := ret[0].(*v2.GetLatestMarketDepthResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetLatestMarketDepth indicates an expected call of GetLatestMarketDepth. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetLatestMarketDepth(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, "GetLatestMarketDepth", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetLatestMarketDepth), varargs...) +} + +// GetMarket mocks base method. +func (m *MockTradingDataServiceClientV2) GetMarket(arg0 context.Context, arg1 *v2.GetMarketRequest, arg2 ...grpc.CallOption) (*v2.GetMarketResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetMarket", varargs...) + ret0, _ := ret[0].(*v2.GetMarketResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetMarket indicates an expected call of GetMarket. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetMarket(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, "GetMarket", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetMarket), varargs...) +} + +// GetMarketDataHistoryByID mocks base method. +func (m *MockTradingDataServiceClientV2) GetMarketDataHistoryByID(arg0 context.Context, arg1 *v2.GetMarketDataHistoryByIDRequest, arg2 ...grpc.CallOption) (*v2.GetMarketDataHistoryByIDResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetMarketDataHistoryByID", varargs...) + ret0, _ := ret[0].(*v2.GetMarketDataHistoryByIDResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetMarketDataHistoryByID indicates an expected call of GetMarketDataHistoryByID. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetMarketDataHistoryByID(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, "GetMarketDataHistoryByID", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetMarketDataHistoryByID), varargs...) +} + +// GetMostRecentNetworkHistorySegment mocks base method. +func (m *MockTradingDataServiceClientV2) GetMostRecentNetworkHistorySegment(arg0 context.Context, arg1 *v2.GetMostRecentNetworkHistorySegmentRequest, arg2 ...grpc.CallOption) (*v2.GetMostRecentNetworkHistorySegmentResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetMostRecentNetworkHistorySegment", varargs...) + ret0, _ := ret[0].(*v2.GetMostRecentNetworkHistorySegmentResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetMostRecentNetworkHistorySegment indicates an expected call of GetMostRecentNetworkHistorySegment. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetMostRecentNetworkHistorySegment(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, "GetMostRecentNetworkHistorySegment", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetMostRecentNetworkHistorySegment), varargs...) +} + +// GetNetworkData mocks base method. +func (m *MockTradingDataServiceClientV2) GetNetworkData(arg0 context.Context, arg1 *v2.GetNetworkDataRequest, arg2 ...grpc.CallOption) (*v2.GetNetworkDataResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetNetworkData", varargs...) + ret0, _ := ret[0].(*v2.GetNetworkDataResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNetworkData indicates an expected call of GetNetworkData. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetNetworkData(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, "GetNetworkData", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetNetworkData), varargs...) +} + +// GetNetworkHistoryBootstrapPeers mocks base method. +func (m *MockTradingDataServiceClientV2) GetNetworkHistoryBootstrapPeers(arg0 context.Context, arg1 *v2.GetNetworkHistoryBootstrapPeersRequest, arg2 ...grpc.CallOption) (*v2.GetNetworkHistoryBootstrapPeersResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetNetworkHistoryBootstrapPeers", varargs...) + ret0, _ := ret[0].(*v2.GetNetworkHistoryBootstrapPeersResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNetworkHistoryBootstrapPeers indicates an expected call of GetNetworkHistoryBootstrapPeers. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetNetworkHistoryBootstrapPeers(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, "GetNetworkHistoryBootstrapPeers", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetNetworkHistoryBootstrapPeers), varargs...) +} + +// GetNetworkHistoryStatus mocks base method. +func (m *MockTradingDataServiceClientV2) GetNetworkHistoryStatus(arg0 context.Context, arg1 *v2.GetNetworkHistoryStatusRequest, arg2 ...grpc.CallOption) (*v2.GetNetworkHistoryStatusResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetNetworkHistoryStatus", varargs...) + ret0, _ := ret[0].(*v2.GetNetworkHistoryStatusResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNetworkHistoryStatus indicates an expected call of GetNetworkHistoryStatus. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetNetworkHistoryStatus(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, "GetNetworkHistoryStatus", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetNetworkHistoryStatus), varargs...) +} + +// GetNetworkLimits mocks base method. +func (m *MockTradingDataServiceClientV2) GetNetworkLimits(arg0 context.Context, arg1 *v2.GetNetworkLimitsRequest, arg2 ...grpc.CallOption) (*v2.GetNetworkLimitsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetNetworkLimits", varargs...) + ret0, _ := ret[0].(*v2.GetNetworkLimitsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNetworkLimits indicates an expected call of GetNetworkLimits. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetNetworkLimits(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, "GetNetworkLimits", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetNetworkLimits), varargs...) +} + +// GetNetworkParameter mocks base method. +func (m *MockTradingDataServiceClientV2) GetNetworkParameter(arg0 context.Context, arg1 *v2.GetNetworkParameterRequest, arg2 ...grpc.CallOption) (*v2.GetNetworkParameterResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetNetworkParameter", varargs...) + ret0, _ := ret[0].(*v2.GetNetworkParameterResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNetworkParameter indicates an expected call of GetNetworkParameter. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetNetworkParameter(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, "GetNetworkParameter", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetNetworkParameter), varargs...) +} + +// GetNode mocks base method. +func (m *MockTradingDataServiceClientV2) GetNode(arg0 context.Context, arg1 *v2.GetNodeRequest, arg2 ...grpc.CallOption) (*v2.GetNodeResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetNode", varargs...) + ret0, _ := ret[0].(*v2.GetNodeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetNode indicates an expected call of GetNode. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetNode(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, "GetNode", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetNode), varargs...) +} + +// GetOracleSpec mocks base method. +func (m *MockTradingDataServiceClientV2) GetOracleSpec(arg0 context.Context, arg1 *v2.GetOracleSpecRequest, arg2 ...grpc.CallOption) (*v2.GetOracleSpecResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetOracleSpec", varargs...) + ret0, _ := ret[0].(*v2.GetOracleSpecResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOracleSpec indicates an expected call of GetOracleSpec. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetOracleSpec(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, "GetOracleSpec", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetOracleSpec), varargs...) +} + +// GetOrder mocks base method. +func (m *MockTradingDataServiceClientV2) GetOrder(arg0 context.Context, arg1 *v2.GetOrderRequest, arg2 ...grpc.CallOption) (*v2.GetOrderResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetOrder", varargs...) + ret0, _ := ret[0].(*v2.GetOrderResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetOrder indicates an expected call of GetOrder. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetOrder(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, "GetOrder", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetOrder), varargs...) +} + +// GetParty mocks base method. +func (m *MockTradingDataServiceClientV2) GetParty(arg0 context.Context, arg1 *v2.GetPartyRequest, arg2 ...grpc.CallOption) (*v2.GetPartyResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetParty", varargs...) + ret0, _ := ret[0].(*v2.GetPartyResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetParty indicates an expected call of GetParty. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetParty(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, "GetParty", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetParty), varargs...) +} + +// GetPartyActivityStreak mocks base method. +func (m *MockTradingDataServiceClientV2) GetPartyActivityStreak(arg0 context.Context, arg1 *v2.GetPartyActivityStreakRequest, arg2 ...grpc.CallOption) (*v2.GetPartyActivityStreakResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetPartyActivityStreak", varargs...) + ret0, _ := ret[0].(*v2.GetPartyActivityStreakResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPartyActivityStreak indicates an expected call of GetPartyActivityStreak. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetPartyActivityStreak(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, "GetPartyActivityStreak", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetPartyActivityStreak), varargs...) +} + +// GetPartyVestingStats mocks base method. +func (m *MockTradingDataServiceClientV2) GetPartyVestingStats(arg0 context.Context, arg1 *v2.GetPartyVestingStatsRequest, arg2 ...grpc.CallOption) (*v2.GetPartyVestingStatsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetPartyVestingStats", varargs...) + ret0, _ := ret[0].(*v2.GetPartyVestingStatsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetPartyVestingStats indicates an expected call of GetPartyVestingStats. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetPartyVestingStats(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, "GetPartyVestingStats", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetPartyVestingStats), varargs...) +} + +// GetProtocolUpgradeStatus mocks base method. +func (m *MockTradingDataServiceClientV2) GetProtocolUpgradeStatus(arg0 context.Context, arg1 *v2.GetProtocolUpgradeStatusRequest, arg2 ...grpc.CallOption) (*v2.GetProtocolUpgradeStatusResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetProtocolUpgradeStatus", varargs...) + ret0, _ := ret[0].(*v2.GetProtocolUpgradeStatusResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetProtocolUpgradeStatus indicates an expected call of GetProtocolUpgradeStatus. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetProtocolUpgradeStatus(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, "GetProtocolUpgradeStatus", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetProtocolUpgradeStatus), varargs...) +} + +// GetReferralSetStats mocks base method. +func (m *MockTradingDataServiceClientV2) GetReferralSetStats(arg0 context.Context, arg1 *v2.GetReferralSetStatsRequest, arg2 ...grpc.CallOption) (*v2.GetReferralSetStatsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetReferralSetStats", varargs...) + ret0, _ := ret[0].(*v2.GetReferralSetStatsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetReferralSetStats indicates an expected call of GetReferralSetStats. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetReferralSetStats(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, "GetReferralSetStats", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetReferralSetStats), varargs...) +} + +// GetRiskFactors mocks base method. +func (m *MockTradingDataServiceClientV2) GetRiskFactors(arg0 context.Context, arg1 *v2.GetRiskFactorsRequest, arg2 ...grpc.CallOption) (*v2.GetRiskFactorsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetRiskFactors", varargs...) + ret0, _ := ret[0].(*v2.GetRiskFactorsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetRiskFactors indicates an expected call of GetRiskFactors. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetRiskFactors(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, "GetRiskFactors", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetRiskFactors), varargs...) +} + +// GetStake mocks base method. +func (m *MockTradingDataServiceClientV2) GetStake(arg0 context.Context, arg1 *v2.GetStakeRequest, arg2 ...grpc.CallOption) (*v2.GetStakeResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetStake", varargs...) + ret0, _ := ret[0].(*v2.GetStakeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetStake indicates an expected call of GetStake. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetStake(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, "GetStake", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetStake), varargs...) +} + +// GetStopOrder mocks base method. +func (m *MockTradingDataServiceClientV2) GetStopOrder(arg0 context.Context, arg1 *v2.GetStopOrderRequest, arg2 ...grpc.CallOption) (*v2.GetStopOrderResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetStopOrder", varargs...) + ret0, _ := ret[0].(*v2.GetStopOrderResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetStopOrder indicates an expected call of GetStopOrder. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetStopOrder(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, "GetStopOrder", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetStopOrder), varargs...) +} + +// GetTimeWeightedNotionalPosition mocks base method. +func (m *MockTradingDataServiceClientV2) GetTimeWeightedNotionalPosition(arg0 context.Context, arg1 *v2.GetTimeWeightedNotionalPositionRequest, arg2 ...grpc.CallOption) (*v2.GetTimeWeightedNotionalPositionResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTimeWeightedNotionalPosition", varargs...) + ret0, _ := ret[0].(*v2.GetTimeWeightedNotionalPositionResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTimeWeightedNotionalPosition indicates an expected call of GetTimeWeightedNotionalPosition. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetTimeWeightedNotionalPosition(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, "GetTimeWeightedNotionalPosition", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetTimeWeightedNotionalPosition), varargs...) +} + +// GetTotalTransferFeeDiscount mocks base method. +func (m *MockTradingDataServiceClientV2) GetTotalTransferFeeDiscount(arg0 context.Context, arg1 *v2.GetTotalTransferFeeDiscountRequest, arg2 ...grpc.CallOption) (*v2.GetTotalTransferFeeDiscountResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTotalTransferFeeDiscount", varargs...) + ret0, _ := ret[0].(*v2.GetTotalTransferFeeDiscountResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTotalTransferFeeDiscount indicates an expected call of GetTotalTransferFeeDiscount. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetTotalTransferFeeDiscount(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, "GetTotalTransferFeeDiscount", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetTotalTransferFeeDiscount), varargs...) +} + +// GetTransfer mocks base method. +func (m *MockTradingDataServiceClientV2) GetTransfer(arg0 context.Context, arg1 *v2.GetTransferRequest, arg2 ...grpc.CallOption) (*v2.GetTransferResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetTransfer", varargs...) + ret0, _ := ret[0].(*v2.GetTransferResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetTransfer indicates an expected call of GetTransfer. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetTransfer(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, "GetTransfer", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetTransfer), varargs...) +} + +// GetVegaTime mocks base method. +func (m *MockTradingDataServiceClientV2) GetVegaTime(arg0 context.Context, arg1 *v2.GetVegaTimeRequest, arg2 ...grpc.CallOption) (*v2.GetVegaTimeResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetVegaTime", varargs...) + ret0, _ := ret[0].(*v2.GetVegaTimeResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetVegaTime indicates an expected call of GetVegaTime. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetVegaTime(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, "GetVegaTime", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetVegaTime), varargs...) +} + +// GetVestingBalancesSummary mocks base method. +func (m *MockTradingDataServiceClientV2) GetVestingBalancesSummary(arg0 context.Context, arg1 *v2.GetVestingBalancesSummaryRequest, arg2 ...grpc.CallOption) (*v2.GetVestingBalancesSummaryResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetVestingBalancesSummary", varargs...) + ret0, _ := ret[0].(*v2.GetVestingBalancesSummaryResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetVestingBalancesSummary indicates an expected call of GetVestingBalancesSummary. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetVestingBalancesSummary(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, "GetVestingBalancesSummary", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetVestingBalancesSummary), varargs...) +} + +// GetVolumeDiscountStats mocks base method. +func (m *MockTradingDataServiceClientV2) GetVolumeDiscountStats(arg0 context.Context, arg1 *v2.GetVolumeDiscountStatsRequest, arg2 ...grpc.CallOption) (*v2.GetVolumeDiscountStatsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetVolumeDiscountStats", varargs...) + ret0, _ := ret[0].(*v2.GetVolumeDiscountStatsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetVolumeDiscountStats indicates an expected call of GetVolumeDiscountStats. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetVolumeDiscountStats(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, "GetVolumeDiscountStats", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetVolumeDiscountStats), varargs...) +} + +// GetWithdrawal mocks base method. +func (m *MockTradingDataServiceClientV2) GetWithdrawal(arg0 context.Context, arg1 *v2.GetWithdrawalRequest, arg2 ...grpc.CallOption) (*v2.GetWithdrawalResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetWithdrawal", varargs...) + ret0, _ := ret[0].(*v2.GetWithdrawalResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetWithdrawal indicates an expected call of GetWithdrawal. +func (mr *MockTradingDataServiceClientV2MockRecorder) GetWithdrawal(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, "GetWithdrawal", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).GetWithdrawal), varargs...) +} + +// Info mocks base method. +func (m *MockTradingDataServiceClientV2) Info(arg0 context.Context, arg1 *v2.InfoRequest, arg2 ...grpc.CallOption) (*v2.InfoResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Info", varargs...) + ret0, _ := ret[0].(*v2.InfoResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Info indicates an expected call of Info. +func (mr *MockTradingDataServiceClientV2MockRecorder) Info(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, "Info", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).Info), 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() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListAccounts", varargs...) + ret0, _ := ret[0].(*v2.ListAccountsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAccounts indicates an expected call of ListAccounts. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListAccounts(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, "ListAccounts", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListAccounts), varargs...) +} + +// ListAllLiquidityProvisions mocks base method. +func (m *MockTradingDataServiceClientV2) ListAllLiquidityProvisions(arg0 context.Context, arg1 *v2.ListAllLiquidityProvisionsRequest, arg2 ...grpc.CallOption) (*v2.ListAllLiquidityProvisionsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListAllLiquidityProvisions", varargs...) + ret0, _ := ret[0].(*v2.ListAllLiquidityProvisionsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAllLiquidityProvisions indicates an expected call of ListAllLiquidityProvisions. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListAllLiquidityProvisions(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, "ListAllLiquidityProvisions", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListAllLiquidityProvisions), varargs...) +} + +// ListAllNetworkHistorySegments mocks base method. +func (m *MockTradingDataServiceClientV2) ListAllNetworkHistorySegments(arg0 context.Context, arg1 *v2.ListAllNetworkHistorySegmentsRequest, arg2 ...grpc.CallOption) (*v2.ListAllNetworkHistorySegmentsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListAllNetworkHistorySegments", varargs...) + ret0, _ := ret[0].(*v2.ListAllNetworkHistorySegmentsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAllNetworkHistorySegments indicates an expected call of ListAllNetworkHistorySegments. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListAllNetworkHistorySegments(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, "ListAllNetworkHistorySegments", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListAllNetworkHistorySegments), varargs...) +} + +// ListAllPositions mocks base method. +func (m *MockTradingDataServiceClientV2) ListAllPositions(arg0 context.Context, arg1 *v2.ListAllPositionsRequest, arg2 ...grpc.CallOption) (*v2.ListAllPositionsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListAllPositions", varargs...) + ret0, _ := ret[0].(*v2.ListAllPositionsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAllPositions indicates an expected call of ListAllPositions. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListAllPositions(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, "ListAllPositions", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListAllPositions), varargs...) +} + +// ListAssets mocks base method. +func (m *MockTradingDataServiceClientV2) ListAssets(arg0 context.Context, arg1 *v2.ListAssetsRequest, arg2 ...grpc.CallOption) (*v2.ListAssetsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListAssets", varargs...) + ret0, _ := ret[0].(*v2.ListAssetsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListAssets indicates an expected call of ListAssets. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListAssets(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, "ListAssets", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListAssets), varargs...) +} + +// ListBalanceChanges mocks base method. +func (m *MockTradingDataServiceClientV2) ListBalanceChanges(arg0 context.Context, arg1 *v2.ListBalanceChangesRequest, arg2 ...grpc.CallOption) (*v2.ListBalanceChangesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListBalanceChanges", varargs...) + ret0, _ := ret[0].(*v2.ListBalanceChangesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListBalanceChanges indicates an expected call of ListBalanceChanges. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListBalanceChanges(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, "ListBalanceChanges", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListBalanceChanges), varargs...) +} + +// ListCandleData mocks base method. +func (m *MockTradingDataServiceClientV2) ListCandleData(arg0 context.Context, arg1 *v2.ListCandleDataRequest, arg2 ...grpc.CallOption) (*v2.ListCandleDataResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListCandleData", varargs...) + ret0, _ := ret[0].(*v2.ListCandleDataResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListCandleData indicates an expected call of ListCandleData. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListCandleData(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, "ListCandleData", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListCandleData), varargs...) +} + +// ListCandleIntervals mocks base method. +func (m *MockTradingDataServiceClientV2) ListCandleIntervals(arg0 context.Context, arg1 *v2.ListCandleIntervalsRequest, arg2 ...grpc.CallOption) (*v2.ListCandleIntervalsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListCandleIntervals", varargs...) + ret0, _ := ret[0].(*v2.ListCandleIntervalsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListCandleIntervals indicates an expected call of ListCandleIntervals. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListCandleIntervals(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, "ListCandleIntervals", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListCandleIntervals), varargs...) +} + +// ListCheckpoints mocks base method. +func (m *MockTradingDataServiceClientV2) ListCheckpoints(arg0 context.Context, arg1 *v2.ListCheckpointsRequest, arg2 ...grpc.CallOption) (*v2.ListCheckpointsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListCheckpoints", varargs...) + ret0, _ := ret[0].(*v2.ListCheckpointsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListCheckpoints indicates an expected call of ListCheckpoints. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListCheckpoints(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, "ListCheckpoints", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListCheckpoints), varargs...) +} + +// ListCoreSnapshots mocks base method. +func (m *MockTradingDataServiceClientV2) ListCoreSnapshots(arg0 context.Context, arg1 *v2.ListCoreSnapshotsRequest, arg2 ...grpc.CallOption) (*v2.ListCoreSnapshotsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListCoreSnapshots", varargs...) + ret0, _ := ret[0].(*v2.ListCoreSnapshotsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListCoreSnapshots indicates an expected call of ListCoreSnapshots. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListCoreSnapshots(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, "ListCoreSnapshots", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListCoreSnapshots), varargs...) +} + +// ListDelegations mocks base method. +func (m *MockTradingDataServiceClientV2) ListDelegations(arg0 context.Context, arg1 *v2.ListDelegationsRequest, arg2 ...grpc.CallOption) (*v2.ListDelegationsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListDelegations", varargs...) + ret0, _ := ret[0].(*v2.ListDelegationsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListDelegations indicates an expected call of ListDelegations. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListDelegations(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, "ListDelegations", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListDelegations), varargs...) +} + +// ListDeposits mocks base method. +func (m *MockTradingDataServiceClientV2) ListDeposits(arg0 context.Context, arg1 *v2.ListDepositsRequest, arg2 ...grpc.CallOption) (*v2.ListDepositsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListDeposits", varargs...) + ret0, _ := ret[0].(*v2.ListDepositsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListDeposits indicates an expected call of ListDeposits. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListDeposits(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, "ListDeposits", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListDeposits), varargs...) +} + +// ListERC20MultiSigSignerAddedBundles mocks base method. +func (m *MockTradingDataServiceClientV2) ListERC20MultiSigSignerAddedBundles(arg0 context.Context, arg1 *v2.ListERC20MultiSigSignerAddedBundlesRequest, arg2 ...grpc.CallOption) (*v2.ListERC20MultiSigSignerAddedBundlesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListERC20MultiSigSignerAddedBundles", varargs...) + ret0, _ := ret[0].(*v2.ListERC20MultiSigSignerAddedBundlesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListERC20MultiSigSignerAddedBundles indicates an expected call of ListERC20MultiSigSignerAddedBundles. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListERC20MultiSigSignerAddedBundles(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, "ListERC20MultiSigSignerAddedBundles", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListERC20MultiSigSignerAddedBundles), varargs...) +} + +// ListERC20MultiSigSignerRemovedBundles mocks base method. +func (m *MockTradingDataServiceClientV2) ListERC20MultiSigSignerRemovedBundles(arg0 context.Context, arg1 *v2.ListERC20MultiSigSignerRemovedBundlesRequest, arg2 ...grpc.CallOption) (*v2.ListERC20MultiSigSignerRemovedBundlesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListERC20MultiSigSignerRemovedBundles", varargs...) + ret0, _ := ret[0].(*v2.ListERC20MultiSigSignerRemovedBundlesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListERC20MultiSigSignerRemovedBundles indicates an expected call of ListERC20MultiSigSignerRemovedBundles. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListERC20MultiSigSignerRemovedBundles(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, "ListERC20MultiSigSignerRemovedBundles", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListERC20MultiSigSignerRemovedBundles), varargs...) +} + +// ListEntities mocks base method. +func (m *MockTradingDataServiceClientV2) ListEntities(arg0 context.Context, arg1 *v2.ListEntitiesRequest, arg2 ...grpc.CallOption) (*v2.ListEntitiesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListEntities", varargs...) + ret0, _ := ret[0].(*v2.ListEntitiesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListEntities indicates an expected call of ListEntities. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListEntities(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, "ListEntities", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListEntities), varargs...) +} + +// ListEpochRewardSummaries mocks base method. +func (m *MockTradingDataServiceClientV2) ListEpochRewardSummaries(arg0 context.Context, arg1 *v2.ListEpochRewardSummariesRequest, arg2 ...grpc.CallOption) (*v2.ListEpochRewardSummariesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListEpochRewardSummaries", varargs...) + ret0, _ := ret[0].(*v2.ListEpochRewardSummariesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListEpochRewardSummaries indicates an expected call of ListEpochRewardSummaries. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListEpochRewardSummaries(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, "ListEpochRewardSummaries", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListEpochRewardSummaries), varargs...) +} + +// ListEthereumKeyRotations mocks base method. +func (m *MockTradingDataServiceClientV2) ListEthereumKeyRotations(arg0 context.Context, arg1 *v2.ListEthereumKeyRotationsRequest, arg2 ...grpc.CallOption) (*v2.ListEthereumKeyRotationsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListEthereumKeyRotations", varargs...) + ret0, _ := ret[0].(*v2.ListEthereumKeyRotationsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListEthereumKeyRotations indicates an expected call of ListEthereumKeyRotations. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListEthereumKeyRotations(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, "ListEthereumKeyRotations", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListEthereumKeyRotations), varargs...) +} + +// ListFundingPayments mocks base method. +func (m *MockTradingDataServiceClientV2) ListFundingPayments(arg0 context.Context, arg1 *v2.ListFundingPaymentsRequest, arg2 ...grpc.CallOption) (*v2.ListFundingPaymentsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListFundingPayments", varargs...) + ret0, _ := ret[0].(*v2.ListFundingPaymentsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListFundingPayments indicates an expected call of ListFundingPayments. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListFundingPayments(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, "ListFundingPayments", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListFundingPayments), varargs...) +} + +// ListFundingPeriodDataPoints mocks base method. +func (m *MockTradingDataServiceClientV2) ListFundingPeriodDataPoints(arg0 context.Context, arg1 *v2.ListFundingPeriodDataPointsRequest, arg2 ...grpc.CallOption) (*v2.ListFundingPeriodDataPointsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListFundingPeriodDataPoints", varargs...) + ret0, _ := ret[0].(*v2.ListFundingPeriodDataPointsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListFundingPeriodDataPoints indicates an expected call of ListFundingPeriodDataPoints. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListFundingPeriodDataPoints(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, "ListFundingPeriodDataPoints", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListFundingPeriodDataPoints), varargs...) +} + +// ListFundingPeriods mocks base method. +func (m *MockTradingDataServiceClientV2) ListFundingPeriods(arg0 context.Context, arg1 *v2.ListFundingPeriodsRequest, arg2 ...grpc.CallOption) (*v2.ListFundingPeriodsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListFundingPeriods", varargs...) + ret0, _ := ret[0].(*v2.ListFundingPeriodsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListFundingPeriods indicates an expected call of ListFundingPeriods. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListFundingPeriods(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, "ListFundingPeriods", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListFundingPeriods), varargs...) +} + +// ListGamePartyScores mocks base method. +func (m *MockTradingDataServiceClientV2) ListGamePartyScores(arg0 context.Context, arg1 *v2.ListGamePartyScoresRequest, arg2 ...grpc.CallOption) (*v2.ListGamePartyScoresResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListGamePartyScores", varargs...) + ret0, _ := ret[0].(*v2.ListGamePartyScoresResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListGamePartyScores indicates an expected call of ListGamePartyScores. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListGamePartyScores(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, "ListGamePartyScores", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListGamePartyScores), varargs...) +} + +// ListGameTeamScores mocks base method. +func (m *MockTradingDataServiceClientV2) ListGameTeamScores(arg0 context.Context, arg1 *v2.ListGameTeamScoresRequest, arg2 ...grpc.CallOption) (*v2.ListGameTeamScoresResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListGameTeamScores", varargs...) + ret0, _ := ret[0].(*v2.ListGameTeamScoresResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListGameTeamScores indicates an expected call of ListGameTeamScores. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListGameTeamScores(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, "ListGameTeamScores", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListGameTeamScores), varargs...) +} + +// ListGames mocks base method. +func (m *MockTradingDataServiceClientV2) ListGames(arg0 context.Context, arg1 *v2.ListGamesRequest, arg2 ...grpc.CallOption) (*v2.ListGamesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListGames", varargs...) + ret0, _ := ret[0].(*v2.ListGamesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListGames indicates an expected call of ListGames. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListGames(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, "ListGames", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListGames), varargs...) +} + +// ListGovernanceData mocks base method. +func (m *MockTradingDataServiceClientV2) ListGovernanceData(arg0 context.Context, arg1 *v2.ListGovernanceDataRequest, arg2 ...grpc.CallOption) (*v2.ListGovernanceDataResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListGovernanceData", varargs...) + ret0, _ := ret[0].(*v2.ListGovernanceDataResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListGovernanceData indicates an expected call of ListGovernanceData. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListGovernanceData(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, "ListGovernanceData", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListGovernanceData), varargs...) +} + +// ListKeyRotations mocks base method. +func (m *MockTradingDataServiceClientV2) ListKeyRotations(arg0 context.Context, arg1 *v2.ListKeyRotationsRequest, arg2 ...grpc.CallOption) (*v2.ListKeyRotationsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListKeyRotations", varargs...) + ret0, _ := ret[0].(*v2.ListKeyRotationsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListKeyRotations indicates an expected call of ListKeyRotations. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListKeyRotations(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, "ListKeyRotations", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListKeyRotations), varargs...) +} + +// ListLatestMarketData mocks base method. +func (m *MockTradingDataServiceClientV2) ListLatestMarketData(arg0 context.Context, arg1 *v2.ListLatestMarketDataRequest, arg2 ...grpc.CallOption) (*v2.ListLatestMarketDataResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListLatestMarketData", varargs...) + ret0, _ := ret[0].(*v2.ListLatestMarketDataResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListLatestMarketData indicates an expected call of ListLatestMarketData. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListLatestMarketData(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, "ListLatestMarketData", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListLatestMarketData), varargs...) +} + +// ListLedgerEntries mocks base method. +func (m *MockTradingDataServiceClientV2) ListLedgerEntries(arg0 context.Context, arg1 *v2.ListLedgerEntriesRequest, arg2 ...grpc.CallOption) (*v2.ListLedgerEntriesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListLedgerEntries", varargs...) + ret0, _ := ret[0].(*v2.ListLedgerEntriesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListLedgerEntries indicates an expected call of ListLedgerEntries. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListLedgerEntries(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, "ListLedgerEntries", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListLedgerEntries), varargs...) +} + +// ListLiquidityProviders mocks base method. +func (m *MockTradingDataServiceClientV2) ListLiquidityProviders(arg0 context.Context, arg1 *v2.ListLiquidityProvidersRequest, arg2 ...grpc.CallOption) (*v2.ListLiquidityProvidersResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListLiquidityProviders", varargs...) + ret0, _ := ret[0].(*v2.ListLiquidityProvidersResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListLiquidityProviders indicates an expected call of ListLiquidityProviders. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListLiquidityProviders(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, "ListLiquidityProviders", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListLiquidityProviders), varargs...) +} + +// ListLiquidityProvisions mocks base method. +func (m *MockTradingDataServiceClientV2) ListLiquidityProvisions(arg0 context.Context, arg1 *v2.ListLiquidityProvisionsRequest, arg2 ...grpc.CallOption) (*v2.ListLiquidityProvisionsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListLiquidityProvisions", varargs...) + ret0, _ := ret[0].(*v2.ListLiquidityProvisionsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListLiquidityProvisions indicates an expected call of ListLiquidityProvisions. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListLiquidityProvisions(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, "ListLiquidityProvisions", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListLiquidityProvisions), varargs...) +} + +// ListMarginLevels mocks base method. +func (m *MockTradingDataServiceClientV2) ListMarginLevels(arg0 context.Context, arg1 *v2.ListMarginLevelsRequest, arg2 ...grpc.CallOption) (*v2.ListMarginLevelsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListMarginLevels", varargs...) + ret0, _ := ret[0].(*v2.ListMarginLevelsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListMarginLevels indicates an expected call of ListMarginLevels. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListMarginLevels(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, "ListMarginLevels", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListMarginLevels), varargs...) +} + +// ListMarkets mocks base method. +func (m *MockTradingDataServiceClientV2) ListMarkets(arg0 context.Context, arg1 *v2.ListMarketsRequest, arg2 ...grpc.CallOption) (*v2.ListMarketsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListMarkets", varargs...) + ret0, _ := ret[0].(*v2.ListMarketsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListMarkets indicates an expected call of ListMarkets. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListMarkets(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, "ListMarkets", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListMarkets), varargs...) +} + +// ListNetworkParameters mocks base method. +func (m *MockTradingDataServiceClientV2) ListNetworkParameters(arg0 context.Context, arg1 *v2.ListNetworkParametersRequest, arg2 ...grpc.CallOption) (*v2.ListNetworkParametersResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListNetworkParameters", varargs...) + ret0, _ := ret[0].(*v2.ListNetworkParametersResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListNetworkParameters indicates an expected call of ListNetworkParameters. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListNetworkParameters(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, "ListNetworkParameters", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListNetworkParameters), varargs...) +} + +// ListNodeSignatures mocks base method. +func (m *MockTradingDataServiceClientV2) ListNodeSignatures(arg0 context.Context, arg1 *v2.ListNodeSignaturesRequest, arg2 ...grpc.CallOption) (*v2.ListNodeSignaturesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListNodeSignatures", varargs...) + ret0, _ := ret[0].(*v2.ListNodeSignaturesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListNodeSignatures indicates an expected call of ListNodeSignatures. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListNodeSignatures(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, "ListNodeSignatures", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListNodeSignatures), varargs...) +} + +// ListNodes mocks base method. +func (m *MockTradingDataServiceClientV2) ListNodes(arg0 context.Context, arg1 *v2.ListNodesRequest, arg2 ...grpc.CallOption) (*v2.ListNodesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListNodes", varargs...) + ret0, _ := ret[0].(*v2.ListNodesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListNodes indicates an expected call of ListNodes. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListNodes(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, "ListNodes", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListNodes), varargs...) +} + +// ListOracleData mocks base method. +func (m *MockTradingDataServiceClientV2) ListOracleData(arg0 context.Context, arg1 *v2.ListOracleDataRequest, arg2 ...grpc.CallOption) (*v2.ListOracleDataResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListOracleData", varargs...) + ret0, _ := ret[0].(*v2.ListOracleDataResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListOracleData indicates an expected call of ListOracleData. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListOracleData(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, "ListOracleData", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListOracleData), varargs...) +} + +// ListOracleSpecs mocks base method. +func (m *MockTradingDataServiceClientV2) ListOracleSpecs(arg0 context.Context, arg1 *v2.ListOracleSpecsRequest, arg2 ...grpc.CallOption) (*v2.ListOracleSpecsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListOracleSpecs", varargs...) + ret0, _ := ret[0].(*v2.ListOracleSpecsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListOracleSpecs indicates an expected call of ListOracleSpecs. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListOracleSpecs(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, "ListOracleSpecs", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListOracleSpecs), varargs...) +} + +// ListOrderVersions mocks base method. +func (m *MockTradingDataServiceClientV2) ListOrderVersions(arg0 context.Context, arg1 *v2.ListOrderVersionsRequest, arg2 ...grpc.CallOption) (*v2.ListOrderVersionsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListOrderVersions", varargs...) + ret0, _ := ret[0].(*v2.ListOrderVersionsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListOrderVersions indicates an expected call of ListOrderVersions. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListOrderVersions(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, "ListOrderVersions", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListOrderVersions), varargs...) +} + +// ListOrders mocks base method. +func (m *MockTradingDataServiceClientV2) ListOrders(arg0 context.Context, arg1 *v2.ListOrdersRequest, arg2 ...grpc.CallOption) (*v2.ListOrdersResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListOrders", varargs...) + ret0, _ := ret[0].(*v2.ListOrdersResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListOrders indicates an expected call of ListOrders. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListOrders(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, "ListOrders", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListOrders), varargs...) +} + +// ListPaidLiquidityFees mocks base method. +func (m *MockTradingDataServiceClientV2) ListPaidLiquidityFees(arg0 context.Context, arg1 *v2.ListPaidLiquidityFeesRequest, arg2 ...grpc.CallOption) (*v2.ListPaidLiquidityFeesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListPaidLiquidityFees", varargs...) + ret0, _ := ret[0].(*v2.ListPaidLiquidityFeesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListPaidLiquidityFees indicates an expected call of ListPaidLiquidityFees. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListPaidLiquidityFees(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, "ListPaidLiquidityFees", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListPaidLiquidityFees), varargs...) +} + +// ListParties mocks base method. +func (m *MockTradingDataServiceClientV2) ListParties(arg0 context.Context, arg1 *v2.ListPartiesRequest, arg2 ...grpc.CallOption) (*v2.ListPartiesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListParties", varargs...) + ret0, _ := ret[0].(*v2.ListPartiesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListParties indicates an expected call of ListParties. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListParties(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, "ListParties", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListParties), varargs...) +} + +// ListPartiesProfiles mocks base method. +func (m *MockTradingDataServiceClientV2) ListPartiesProfiles(arg0 context.Context, arg1 *v2.ListPartiesProfilesRequest, arg2 ...grpc.CallOption) (*v2.ListPartiesProfilesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListPartiesProfiles", varargs...) + ret0, _ := ret[0].(*v2.ListPartiesProfilesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListPartiesProfiles indicates an expected call of ListPartiesProfiles. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListPartiesProfiles(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, "ListPartiesProfiles", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListPartiesProfiles), varargs...) +} + +// ListPartyMarginModes mocks base method. +func (m *MockTradingDataServiceClientV2) ListPartyMarginModes(arg0 context.Context, arg1 *v2.ListPartyMarginModesRequest, arg2 ...grpc.CallOption) (*v2.ListPartyMarginModesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListPartyMarginModes", varargs...) + ret0, _ := ret[0].(*v2.ListPartyMarginModesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListPartyMarginModes indicates an expected call of ListPartyMarginModes. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListPartyMarginModes(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, "ListPartyMarginModes", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListPartyMarginModes), varargs...) +} + +// ListPositions mocks base method. +func (m *MockTradingDataServiceClientV2) ListPositions(arg0 context.Context, arg1 *v2.ListPositionsRequest, arg2 ...grpc.CallOption) (*v2.ListPositionsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListPositions", varargs...) + ret0, _ := ret[0].(*v2.ListPositionsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListPositions indicates an expected call of ListPositions. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListPositions(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, "ListPositions", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListPositions), varargs...) +} + +// ListProtocolUpgradeProposals mocks base method. +func (m *MockTradingDataServiceClientV2) ListProtocolUpgradeProposals(arg0 context.Context, arg1 *v2.ListProtocolUpgradeProposalsRequest, arg2 ...grpc.CallOption) (*v2.ListProtocolUpgradeProposalsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListProtocolUpgradeProposals", varargs...) + ret0, _ := ret[0].(*v2.ListProtocolUpgradeProposalsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListProtocolUpgradeProposals indicates an expected call of ListProtocolUpgradeProposals. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListProtocolUpgradeProposals(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, "ListProtocolUpgradeProposals", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListProtocolUpgradeProposals), varargs...) +} + +// ListReferralSetReferees mocks base method. +func (m *MockTradingDataServiceClientV2) ListReferralSetReferees(arg0 context.Context, arg1 *v2.ListReferralSetRefereesRequest, arg2 ...grpc.CallOption) (*v2.ListReferralSetRefereesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListReferralSetReferees", varargs...) + ret0, _ := ret[0].(*v2.ListReferralSetRefereesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListReferralSetReferees indicates an expected call of ListReferralSetReferees. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListReferralSetReferees(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, "ListReferralSetReferees", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListReferralSetReferees), varargs...) +} + +// ListReferralSets mocks base method. +func (m *MockTradingDataServiceClientV2) ListReferralSets(arg0 context.Context, arg1 *v2.ListReferralSetsRequest, arg2 ...grpc.CallOption) (*v2.ListReferralSetsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListReferralSets", varargs...) + ret0, _ := ret[0].(*v2.ListReferralSetsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListReferralSets indicates an expected call of ListReferralSets. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListReferralSets(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, "ListReferralSets", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListReferralSets), varargs...) +} + +// ListRewardSummaries mocks base method. +func (m *MockTradingDataServiceClientV2) ListRewardSummaries(arg0 context.Context, arg1 *v2.ListRewardSummariesRequest, arg2 ...grpc.CallOption) (*v2.ListRewardSummariesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListRewardSummaries", varargs...) + ret0, _ := ret[0].(*v2.ListRewardSummariesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListRewardSummaries indicates an expected call of ListRewardSummaries. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListRewardSummaries(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, "ListRewardSummaries", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListRewardSummaries), varargs...) +} + +// ListRewards mocks base method. +func (m *MockTradingDataServiceClientV2) ListRewards(arg0 context.Context, arg1 *v2.ListRewardsRequest, arg2 ...grpc.CallOption) (*v2.ListRewardsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListRewards", varargs...) + ret0, _ := ret[0].(*v2.ListRewardsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListRewards indicates an expected call of ListRewards. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListRewards(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, "ListRewards", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListRewards), varargs...) +} + +// ListStopOrders mocks base method. +func (m *MockTradingDataServiceClientV2) ListStopOrders(arg0 context.Context, arg1 *v2.ListStopOrdersRequest, arg2 ...grpc.CallOption) (*v2.ListStopOrdersResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListStopOrders", varargs...) + ret0, _ := ret[0].(*v2.ListStopOrdersResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListStopOrders indicates an expected call of ListStopOrders. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListStopOrders(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, "ListStopOrders", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListStopOrders), varargs...) +} + +// ListSuccessorMarkets mocks base method. +func (m *MockTradingDataServiceClientV2) ListSuccessorMarkets(arg0 context.Context, arg1 *v2.ListSuccessorMarketsRequest, arg2 ...grpc.CallOption) (*v2.ListSuccessorMarketsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListSuccessorMarkets", varargs...) + ret0, _ := ret[0].(*v2.ListSuccessorMarketsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListSuccessorMarkets indicates an expected call of ListSuccessorMarkets. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListSuccessorMarkets(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, "ListSuccessorMarkets", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListSuccessorMarkets), varargs...) +} + +// ListTeamMembersStatistics mocks base method. +func (m *MockTradingDataServiceClientV2) ListTeamMembersStatistics(arg0 context.Context, arg1 *v2.ListTeamMembersStatisticsRequest, arg2 ...grpc.CallOption) (*v2.ListTeamMembersStatisticsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListTeamMembersStatistics", varargs...) + ret0, _ := ret[0].(*v2.ListTeamMembersStatisticsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTeamMembersStatistics indicates an expected call of ListTeamMembersStatistics. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListTeamMembersStatistics(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, "ListTeamMembersStatistics", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListTeamMembersStatistics), varargs...) +} + +// ListTeamRefereeHistory mocks base method. +func (m *MockTradingDataServiceClientV2) ListTeamRefereeHistory(arg0 context.Context, arg1 *v2.ListTeamRefereeHistoryRequest, arg2 ...grpc.CallOption) (*v2.ListTeamRefereeHistoryResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListTeamRefereeHistory", varargs...) + ret0, _ := ret[0].(*v2.ListTeamRefereeHistoryResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTeamRefereeHistory indicates an expected call of ListTeamRefereeHistory. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListTeamRefereeHistory(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, "ListTeamRefereeHistory", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListTeamRefereeHistory), varargs...) +} + +// ListTeamReferees mocks base method. +func (m *MockTradingDataServiceClientV2) ListTeamReferees(arg0 context.Context, arg1 *v2.ListTeamRefereesRequest, arg2 ...grpc.CallOption) (*v2.ListTeamRefereesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListTeamReferees", varargs...) + ret0, _ := ret[0].(*v2.ListTeamRefereesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTeamReferees indicates an expected call of ListTeamReferees. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListTeamReferees(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, "ListTeamReferees", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListTeamReferees), varargs...) +} + +// ListTeams mocks base method. +func (m *MockTradingDataServiceClientV2) ListTeams(arg0 context.Context, arg1 *v2.ListTeamsRequest, arg2 ...grpc.CallOption) (*v2.ListTeamsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListTeams", varargs...) + ret0, _ := ret[0].(*v2.ListTeamsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTeams indicates an expected call of ListTeams. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListTeams(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, "ListTeams", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListTeams), varargs...) +} + +// ListTeamsStatistics mocks base method. +func (m *MockTradingDataServiceClientV2) ListTeamsStatistics(arg0 context.Context, arg1 *v2.ListTeamsStatisticsRequest, arg2 ...grpc.CallOption) (*v2.ListTeamsStatisticsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListTeamsStatistics", varargs...) + ret0, _ := ret[0].(*v2.ListTeamsStatisticsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTeamsStatistics indicates an expected call of ListTeamsStatistics. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListTeamsStatistics(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, "ListTeamsStatistics", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListTeamsStatistics), varargs...) +} + +// ListTrades mocks base method. +func (m *MockTradingDataServiceClientV2) ListTrades(arg0 context.Context, arg1 *v2.ListTradesRequest, arg2 ...grpc.CallOption) (*v2.ListTradesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListTrades", varargs...) + ret0, _ := ret[0].(*v2.ListTradesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTrades indicates an expected call of ListTrades. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListTrades(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, "ListTrades", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListTrades), varargs...) +} + +// ListTransfers mocks base method. +func (m *MockTradingDataServiceClientV2) ListTransfers(arg0 context.Context, arg1 *v2.ListTransfersRequest, arg2 ...grpc.CallOption) (*v2.ListTransfersResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListTransfers", varargs...) + ret0, _ := ret[0].(*v2.ListTransfersResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListTransfers indicates an expected call of ListTransfers. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListTransfers(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, "ListTransfers", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListTransfers), varargs...) +} + +// ListVotes mocks base method. +func (m *MockTradingDataServiceClientV2) ListVotes(arg0 context.Context, arg1 *v2.ListVotesRequest, arg2 ...grpc.CallOption) (*v2.ListVotesResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListVotes", varargs...) + ret0, _ := ret[0].(*v2.ListVotesResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListVotes indicates an expected call of ListVotes. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListVotes(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, "ListVotes", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListVotes), varargs...) +} + +// ListWithdrawals mocks base method. +func (m *MockTradingDataServiceClientV2) ListWithdrawals(arg0 context.Context, arg1 *v2.ListWithdrawalsRequest, arg2 ...grpc.CallOption) (*v2.ListWithdrawalsResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ListWithdrawals", varargs...) + ret0, _ := ret[0].(*v2.ListWithdrawalsResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ListWithdrawals indicates an expected call of ListWithdrawals. +func (mr *MockTradingDataServiceClientV2MockRecorder) ListWithdrawals(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, "ListWithdrawals", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ListWithdrawals), varargs...) +} + +// ObserveAccounts mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveAccounts(arg0 context.Context, arg1 *v2.ObserveAccountsRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveAccountsClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveAccounts", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveAccountsClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveAccounts indicates an expected call of ObserveAccounts. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveAccounts(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, "ObserveAccounts", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveAccounts), varargs...) +} + +// ObserveCandleData mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveCandleData(arg0 context.Context, arg1 *v2.ObserveCandleDataRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveCandleDataClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveCandleData", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveCandleDataClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveCandleData indicates an expected call of ObserveCandleData. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveCandleData(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, "ObserveCandleData", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveCandleData), varargs...) +} + +// ObserveEventBus mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveEventBus(arg0 context.Context, arg1 ...grpc.CallOption) (v2.TradingDataService_ObserveEventBusClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0} + for _, a := range arg1 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveEventBus", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveEventBusClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveEventBus indicates an expected call of ObserveEventBus. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveEventBus(arg0 interface{}, arg1 ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{arg0}, arg1...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ObserveEventBus", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveEventBus), varargs...) +} + +// ObserveGovernance mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveGovernance(arg0 context.Context, arg1 *v2.ObserveGovernanceRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveGovernanceClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveGovernance", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveGovernanceClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveGovernance indicates an expected call of ObserveGovernance. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveGovernance(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, "ObserveGovernance", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveGovernance), varargs...) +} + +// ObserveLedgerMovements mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveLedgerMovements(arg0 context.Context, arg1 *v2.ObserveLedgerMovementsRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveLedgerMovementsClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveLedgerMovements", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveLedgerMovementsClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveLedgerMovements indicates an expected call of ObserveLedgerMovements. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveLedgerMovements(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, "ObserveLedgerMovements", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveLedgerMovements), varargs...) +} + +// ObserveLiquidityProvisions mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveLiquidityProvisions(arg0 context.Context, arg1 *v2.ObserveLiquidityProvisionsRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveLiquidityProvisionsClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveLiquidityProvisions", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveLiquidityProvisionsClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveLiquidityProvisions indicates an expected call of ObserveLiquidityProvisions. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveLiquidityProvisions(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, "ObserveLiquidityProvisions", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveLiquidityProvisions), varargs...) +} + +// ObserveMarginLevels mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveMarginLevels(arg0 context.Context, arg1 *v2.ObserveMarginLevelsRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveMarginLevelsClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveMarginLevels", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveMarginLevelsClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveMarginLevels indicates an expected call of ObserveMarginLevels. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveMarginLevels(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, "ObserveMarginLevels", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveMarginLevels), varargs...) +} + +// ObserveMarketsData mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveMarketsData(arg0 context.Context, arg1 *v2.ObserveMarketsDataRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveMarketsDataClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveMarketsData", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveMarketsDataClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveMarketsData indicates an expected call of ObserveMarketsData. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveMarketsData(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, "ObserveMarketsData", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveMarketsData), varargs...) +} + +// ObserveMarketsDepth mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveMarketsDepth(arg0 context.Context, arg1 *v2.ObserveMarketsDepthRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveMarketsDepthClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveMarketsDepth", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveMarketsDepthClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveMarketsDepth indicates an expected call of ObserveMarketsDepth. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveMarketsDepth(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, "ObserveMarketsDepth", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveMarketsDepth), varargs...) +} + +// ObserveMarketsDepthUpdates mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveMarketsDepthUpdates(arg0 context.Context, arg1 *v2.ObserveMarketsDepthUpdatesRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveMarketsDepthUpdatesClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveMarketsDepthUpdates", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveMarketsDepthUpdatesClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveMarketsDepthUpdates indicates an expected call of ObserveMarketsDepthUpdates. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveMarketsDepthUpdates(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, "ObserveMarketsDepthUpdates", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveMarketsDepthUpdates), varargs...) +} + +// ObserveOrders mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveOrders(arg0 context.Context, arg1 *v2.ObserveOrdersRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveOrdersClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveOrders", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveOrdersClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveOrders indicates an expected call of ObserveOrders. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveOrders(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, "ObserveOrders", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveOrders), varargs...) +} + +// ObservePositions mocks base method. +func (m *MockTradingDataServiceClientV2) ObservePositions(arg0 context.Context, arg1 *v2.ObservePositionsRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObservePositionsClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObservePositions", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObservePositionsClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObservePositions indicates an expected call of ObservePositions. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObservePositions(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, "ObservePositions", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObservePositions), varargs...) +} + +// ObserveTrades mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveTrades(arg0 context.Context, arg1 *v2.ObserveTradesRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveTradesClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveTrades", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveTradesClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveTrades indicates an expected call of ObserveTrades. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveTrades(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, "ObserveTrades", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveTrades), varargs...) +} + +// ObserveTransactionResults mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveTransactionResults(arg0 context.Context, arg1 *v2.ObserveTransactionResultsRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveTransactionResultsClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveTransactionResults", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveTransactionResultsClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveTransactionResults indicates an expected call of ObserveTransactionResults. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveTransactionResults(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, "ObserveTransactionResults", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveTransactionResults), varargs...) +} + +// ObserveVotes mocks base method. +func (m *MockTradingDataServiceClientV2) ObserveVotes(arg0 context.Context, arg1 *v2.ObserveVotesRequest, arg2 ...grpc.CallOption) (v2.TradingDataService_ObserveVotesClient, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "ObserveVotes", varargs...) + ret0, _ := ret[0].(v2.TradingDataService_ObserveVotesClient) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ObserveVotes indicates an expected call of ObserveVotes. +func (mr *MockTradingDataServiceClientV2MockRecorder) ObserveVotes(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, "ObserveVotes", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).ObserveVotes), varargs...) +} + +// Ping mocks base method. +func (m *MockTradingDataServiceClientV2) Ping(arg0 context.Context, arg1 *v2.PingRequest, arg2 ...grpc.CallOption) (*v2.PingResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{arg0, arg1} + for _, a := range arg2 { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "Ping", varargs...) + ret0, _ := ret[0].(*v2.PingResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Ping indicates an expected call of Ping. +func (mr *MockTradingDataServiceClientV2MockRecorder) Ping(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, "Ping", reflect.TypeOf((*MockTradingDataServiceClientV2)(nil).Ping), varargs...) +} diff --git a/protos/blockexplorer/api/v1/blockexplorer.pb.go b/protos/blockexplorer/api/v1/blockexplorer.pb.go index 577615eb290..b03bf3c5ed1 100644 --- a/protos/blockexplorer/api/v1/blockexplorer.pb.go +++ b/protos/blockexplorer/api/v1/blockexplorer.pb.go @@ -656,7 +656,7 @@ var file_blockexplorer_api_v1_blockexplorer_proto_rawDesc = []byte{ 0x2f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x92, 0x41, 0x3e, 0x12, 0x23, 0x0a, 0x18, 0x56, 0x65, 0x67, 0x61, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x72, 0x65, 0x72, 0x20, - 0x41, 0x50, 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x36, 0x2e, 0x31, 0x1a, 0x13, 0x6c, + 0x41, 0x50, 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x37, 0x2e, 0x30, 0x1a, 0x13, 0x6c, 0x62, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x78, 0x79, 0x7a, 0x2a, 0x02, 0x01, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } diff --git a/protos/data-node/api/v2/trading_data.pb.go b/protos/data-node/api/v2/trading_data.pb.go index ca403173906..8e9570d1dd4 100644 --- a/protos/data-node/api/v2/trading_data.pb.go +++ b/protos/data-node/api/v2/trading_data.pb.go @@ -328,7 +328,7 @@ func (x ListTransfersRequest_Scope) Number() protoreflect.EnumNumber { // Deprecated: Use ListTransfersRequest_Scope.Descriptor instead. func (ListTransfersRequest_Scope) EnumDescriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{77, 0} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{87, 0} } // Filter for the types of governance proposals to view @@ -428,7 +428,7 @@ func (x ListGovernanceDataRequest_Type) Number() protoreflect.EnumNumber { // Deprecated: Use ListGovernanceDataRequest_Type.Descriptor instead. func (ListGovernanceDataRequest_Type) EnumDescriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{220, 0} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{230, 0} } // All data returned from the API is ordered in a well-defined manner. @@ -679,6 +679,10 @@ type GetPartyVestingStatsResponse struct { EpochSeq uint64 `protobuf:"varint,3,opt,name=epoch_seq,json=epochSeq,proto3" json:"epoch_seq,omitempty"` // The balance of the party, in quantum. QuantumBalance string `protobuf:"bytes,4,opt,name=quantum_balance,json=quantumBalance,proto3" json:"quantum_balance,omitempty"` + // Bonus multiplier applied on the reward, summed across all derived accounts. + SummedRewardBonusMultiplier string `protobuf:"bytes,5,opt,name=summed_reward_bonus_multiplier,json=summedRewardBonusMultiplier,proto3" json:"summed_reward_bonus_multiplier,omitempty"` + // The balance of the party and derived keys, in quantum. + SummedQuantumBalance string `protobuf:"bytes,6,opt,name=summed_quantum_balance,json=summedQuantumBalance,proto3" json:"summed_quantum_balance,omitempty"` } func (x *GetPartyVestingStatsResponse) Reset() { @@ -741,6 +745,20 @@ func (x *GetPartyVestingStatsResponse) GetQuantumBalance() string { return "" } +func (x *GetPartyVestingStatsResponse) GetSummedRewardBonusMultiplier() string { + if x != nil { + return x.SummedRewardBonusMultiplier + } + return "" +} + +func (x *GetPartyVestingStatsResponse) GetSummedQuantumBalance() string { + if x != nil { + return x.SummedQuantumBalance + } + return "" +} + // Request sent to list the vesting and locked balances for a party type GetVestingBalancesSummaryRequest struct { state protoimpl.MessageState @@ -895,6 +913,9 @@ type AccountBalance struct { MarketId string `protobuf:"bytes,5,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` // Account type of this account. Type vega.AccountType `protobuf:"varint,6,opt,name=type,proto3,enum=vega.AccountType" json:"type,omitempty"` + // Parent party ID of the account. + // This field is optional and is used in cases where the account is derived from another party's account. + ParentPartyId *string `protobuf:"bytes,7,opt,name=parent_party_id,json=parentPartyId,proto3,oneof" json:"parent_party_id,omitempty"` } func (x *AccountBalance) Reset() { @@ -964,6 +985,13 @@ func (x *AccountBalance) GetType() vega.AccountType { return vega.AccountType(0) } +func (x *AccountBalance) GetParentPartyId() string { + if x != nil && x.ParentPartyId != nil { + return *x.ParentPartyId + } + return "" +} + // Request that is sent when listing accounts. type ListAccountsRequest struct { state protoimpl.MessageState @@ -974,6 +1002,9 @@ type ListAccountsRequest struct { Filter *AccountFilter `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"` // Optional pagination control. Pagination *Pagination `protobuf:"bytes,2,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` + // Whether to return all derived parties from AMMs for the given party. + // If used, party ID is required. + IncludeDerivedParties *bool `protobuf:"varint,3,opt,name=include_derived_parties,json=includeDerivedParties,proto3,oneof" json:"include_derived_parties,omitempty"` } func (x *ListAccountsRequest) Reset() { @@ -1022,6 +1053,13 @@ func (x *ListAccountsRequest) GetPagination() *Pagination { return nil } +func (x *ListAccountsRequest) GetIncludeDerivedParties() bool { + if x != nil && x.IncludeDerivedParties != nil { + return *x.IncludeDerivedParties + } + return false +} + // Response that is received from listing accounts query. type ListAccountsResponse struct { state protoimpl.MessageState @@ -1201,6 +1239,9 @@ type ObserveAccountsRequest struct { Asset string `protobuf:"bytes,3,opt,name=asset,proto3" json:"asset,omitempty"` // Account type to subscribe to, required field. Type vega.AccountType `protobuf:"varint,4,opt,name=type,proto3,enum=vega.AccountType" json:"type,omitempty"` + // Whether to return all derived parties from AMMs for the given party. + // If used, party ID is required. + IncludeDerivedParties *bool `protobuf:"varint,5,opt,name=include_derived_parties,json=includeDerivedParties,proto3,oneof" json:"include_derived_parties,omitempty"` } func (x *ObserveAccountsRequest) Reset() { @@ -1263,6 +1304,13 @@ func (x *ObserveAccountsRequest) GetType() vega.AccountType { return vega.AccountType(0) } +func (x *ObserveAccountsRequest) GetIncludeDerivedParties() bool { + if x != nil && x.IncludeDerivedParties != nil { + return *x.IncludeDerivedParties + } + return false +} + // Response that is received when subscribing to a stream of accounts. type ObserveAccountsResponse struct { state protoimpl.MessageState @@ -2353,6 +2401,609 @@ func (x *GetStopOrderResponse) GetOrder() *v1.StopOrderEvent { return nil } +// Request that is sent when executing a query for a list of team game scores. +type ListGameTeamScoresRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Optional pagination control. + Pagination *Pagination `protobuf:"bytes,1,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` + // Team games filter contains all filtering conditions and values that are applied to the team games score listing. + Filter *GameTeamScoresFilter `protobuf:"bytes,2,opt,name=filter,proto3,oneof" json:"filter,omitempty"` +} + +func (x *ListGameTeamScoresRequest) Reset() { + *x = ListGameTeamScoresRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListGameTeamScoresRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGameTeamScoresRequest) ProtoMessage() {} + +func (x *ListGameTeamScoresRequest) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_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 ListGameTeamScoresRequest.ProtoReflect.Descriptor instead. +func (*ListGameTeamScoresRequest) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{30} +} + +func (x *ListGameTeamScoresRequest) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +func (x *ListGameTeamScoresRequest) GetFilter() *GameTeamScoresFilter { + if x != nil { + return x.Filter + } + return nil +} + +type GameTeamScoresFilter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Restrict game scores to the given ones. + GameIds []string `protobuf:"bytes,1,rep,name=game_ids,json=gameIds,proto3" json:"game_ids,omitempty"` + // Restrict game scores to those for the given teams. + TeamIds []string `protobuf:"bytes,2,rep,name=team_ids,json=teamIds,proto3" json:"team_ids,omitempty"` + // Restrict game scores to those from a given epoch. + EpochFrom *uint64 `protobuf:"varint,3,opt,name=epoch_from,json=epochFrom,proto3,oneof" json:"epoch_from,omitempty"` + // Restrict game scores to those up to a given epoch. + EpochTo *uint64 `protobuf:"varint,4,opt,name=epoch_to,json=epochTo,proto3,oneof" json:"epoch_to,omitempty"` +} + +func (x *GameTeamScoresFilter) Reset() { + *x = GameTeamScoresFilter{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameTeamScoresFilter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameTeamScoresFilter) ProtoMessage() {} + +func (x *GameTeamScoresFilter) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_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 GameTeamScoresFilter.ProtoReflect.Descriptor instead. +func (*GameTeamScoresFilter) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{31} +} + +func (x *GameTeamScoresFilter) GetGameIds() []string { + if x != nil { + return x.GameIds + } + return nil +} + +func (x *GameTeamScoresFilter) GetTeamIds() []string { + if x != nil { + return x.TeamIds + } + return nil +} + +func (x *GameTeamScoresFilter) GetEpochFrom() uint64 { + if x != nil && x.EpochFrom != nil { + return *x.EpochFrom + } + return 0 +} + +func (x *GameTeamScoresFilter) GetEpochTo() uint64 { + if x != nil && x.EpochTo != nil { + return *x.EpochTo + } + return 0 +} + +// Response received from the query for getting a list of game scores for teams. +type ListGameTeamScoresResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of team game scores data and corresponding page information. + TeamScores *GameTeamScoresConnection `protobuf:"bytes,1,opt,name=team_scores,json=teamScores,proto3" json:"team_scores,omitempty"` +} + +func (x *ListGameTeamScoresResponse) Reset() { + *x = ListGameTeamScoresResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListGameTeamScoresResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGameTeamScoresResponse) ProtoMessage() {} + +func (x *ListGameTeamScoresResponse) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[32] + 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 ListGameTeamScoresResponse.ProtoReflect.Descriptor instead. +func (*ListGameTeamScoresResponse) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{32} +} + +func (x *ListGameTeamScoresResponse) GetTeamScores() *GameTeamScoresConnection { + if x != nil { + return x.TeamScores + } + return nil +} + +// Page of team game scores data and corresponding page information. +type GameTeamScoresConnection struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of orders and their corresponding cursors. + Edges []*GameTeamScoresEdge `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 *GameTeamScoresConnection) Reset() { + *x = GameTeamScoresConnection{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameTeamScoresConnection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameTeamScoresConnection) ProtoMessage() {} + +func (x *GameTeamScoresConnection) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[33] + 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 GameTeamScoresConnection.ProtoReflect.Descriptor instead. +func (*GameTeamScoresConnection) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{33} +} + +func (x *GameTeamScoresConnection) GetEdges() []*GameTeamScoresEdge { + if x != nil { + return x.Edges + } + return nil +} + +func (x *GameTeamScoresConnection) GetPageInfo() *PageInfo { + if x != nil { + return x.PageInfo + } + return nil +} + +type GameTeamScoresEdge struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Data associated with an order submitted to a Vega node. + Node *v1.GameTeamScore `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 *GameTeamScoresEdge) Reset() { + *x = GameTeamScoresEdge{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GameTeamScoresEdge) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GameTeamScoresEdge) ProtoMessage() {} + +func (x *GameTeamScoresEdge) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_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 GameTeamScoresEdge.ProtoReflect.Descriptor instead. +func (*GameTeamScoresEdge) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{34} +} + +func (x *GameTeamScoresEdge) GetNode() *v1.GameTeamScore { + if x != nil { + return x.Node + } + return nil +} + +func (x *GameTeamScoresEdge) GetCursor() string { + if x != nil { + return x.Cursor + } + return "" +} + +// Request that is sent when executing a query for a list of party game scores. +type ListGamePartyScoresRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Optional pagination control. + Pagination *Pagination `protobuf:"bytes,1,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` + // Party games filter contains all filtering conditions and values that are applied to the party games score listing. + Filter *GamePartyScoresFilter `protobuf:"bytes,2,opt,name=filter,proto3,oneof" json:"filter,omitempty"` +} + +func (x *ListGamePartyScoresRequest) Reset() { + *x = ListGamePartyScoresRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListGamePartyScoresRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGamePartyScoresRequest) ProtoMessage() {} + +func (x *ListGamePartyScoresRequest) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_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 ListGamePartyScoresRequest.ProtoReflect.Descriptor instead. +func (*ListGamePartyScoresRequest) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{35} +} + +func (x *ListGamePartyScoresRequest) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +func (x *ListGamePartyScoresRequest) GetFilter() *GamePartyScoresFilter { + if x != nil { + return x.Filter + } + return nil +} + +type GamePartyScoresFilter struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Restrict game scores to those in the given games. + GameIds []string `protobuf:"bytes,1,rep,name=game_ids,json=gameIds,proto3" json:"game_ids,omitempty"` + // Restrict game scores to the parties in the given teams. + TeamIds []string `protobuf:"bytes,2,rep,name=team_ids,json=teamIds,proto3" json:"team_ids,omitempty"` + // Restrict game scores to those relating to the given parties. + PartyIds []string `protobuf:"bytes,3,rep,name=party_ids,json=partyIds,proto3" json:"party_ids,omitempty"` + // Restrict game scores to those from a given epoch. + EpochFrom *uint64 `protobuf:"varint,4,opt,name=epoch_from,json=epochFrom,proto3,oneof" json:"epoch_from,omitempty"` + // Restrict game scores to those up to a given epoch. + EpochTo *uint64 `protobuf:"varint,5,opt,name=epoch_to,json=epochTo,proto3,oneof" json:"epoch_to,omitempty"` +} + +func (x *GamePartyScoresFilter) Reset() { + *x = GamePartyScoresFilter{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GamePartyScoresFilter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GamePartyScoresFilter) ProtoMessage() {} + +func (x *GamePartyScoresFilter) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[36] + 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 GamePartyScoresFilter.ProtoReflect.Descriptor instead. +func (*GamePartyScoresFilter) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{36} +} + +func (x *GamePartyScoresFilter) GetGameIds() []string { + if x != nil { + return x.GameIds + } + return nil +} + +func (x *GamePartyScoresFilter) GetTeamIds() []string { + if x != nil { + return x.TeamIds + } + return nil +} + +func (x *GamePartyScoresFilter) GetPartyIds() []string { + if x != nil { + return x.PartyIds + } + return nil +} + +func (x *GamePartyScoresFilter) GetEpochFrom() uint64 { + if x != nil && x.EpochFrom != nil { + return *x.EpochFrom + } + return 0 +} + +func (x *GamePartyScoresFilter) GetEpochTo() uint64 { + if x != nil && x.EpochTo != nil { + return *x.EpochTo + } + return 0 +} + +// Response received from the query for getting a list of game scores for teams. +type ListGamePartyScoresResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of party game scores data and corresponding page information. + PartyScores *GamePartyScoresConnection `protobuf:"bytes,1,opt,name=party_scores,json=partyScores,proto3" json:"party_scores,omitempty"` +} + +func (x *ListGamePartyScoresResponse) Reset() { + *x = ListGamePartyScoresResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListGamePartyScoresResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGamePartyScoresResponse) ProtoMessage() {} + +func (x *ListGamePartyScoresResponse) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[37] + 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 ListGamePartyScoresResponse.ProtoReflect.Descriptor instead. +func (*ListGamePartyScoresResponse) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{37} +} + +func (x *ListGamePartyScoresResponse) GetPartyScores() *GamePartyScoresConnection { + if x != nil { + return x.PartyScores + } + return nil +} + +// Page of party game scores data and corresponding page information. +type GamePartyScoresConnection struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of orders and their corresponding cursors. + Edges []*GamePartyScoresEdge `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 *GamePartyScoresConnection) Reset() { + *x = GamePartyScoresConnection{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GamePartyScoresConnection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GamePartyScoresConnection) ProtoMessage() {} + +func (x *GamePartyScoresConnection) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[38] + 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 GamePartyScoresConnection.ProtoReflect.Descriptor instead. +func (*GamePartyScoresConnection) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{38} +} + +func (x *GamePartyScoresConnection) GetEdges() []*GamePartyScoresEdge { + if x != nil { + return x.Edges + } + return nil +} + +func (x *GamePartyScoresConnection) GetPageInfo() *PageInfo { + if x != nil { + return x.PageInfo + } + return nil +} + +type GamePartyScoresEdge struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Data associated with an order submitted to a Vega node. + Node *v1.GamePartyScore `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 *GamePartyScoresEdge) Reset() { + *x = GamePartyScoresEdge{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GamePartyScoresEdge) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GamePartyScoresEdge) ProtoMessage() {} + +func (x *GamePartyScoresEdge) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[39] + 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 GamePartyScoresEdge.ProtoReflect.Descriptor instead. +func (*GamePartyScoresEdge) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{39} +} + +func (x *GamePartyScoresEdge) GetNode() *v1.GamePartyScore { + if x != nil { + return x.Node + } + return nil +} + +func (x *GamePartyScoresEdge) GetCursor() string { + if x != nil { + return x.Cursor + } + return "" +} + // Request that is sent when executing a query for a list of stop orders. type ListStopOrdersRequest struct { state protoimpl.MessageState @@ -2368,7 +3019,7 @@ type ListStopOrdersRequest struct { func (x *ListStopOrdersRequest) Reset() { *x = ListStopOrdersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[30] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2381,7 +3032,7 @@ func (x *ListStopOrdersRequest) String() string { func (*ListStopOrdersRequest) ProtoMessage() {} func (x *ListStopOrdersRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[30] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2394,7 +3045,7 @@ func (x *ListStopOrdersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListStopOrdersRequest.ProtoReflect.Descriptor instead. func (*ListStopOrdersRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{30} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{40} } func (x *ListStopOrdersRequest) GetPagination() *Pagination { @@ -2436,7 +3087,7 @@ type StopOrderFilter struct { func (x *StopOrderFilter) Reset() { *x = StopOrderFilter{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[31] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2449,7 +3100,7 @@ func (x *StopOrderFilter) String() string { func (*StopOrderFilter) ProtoMessage() {} func (x *StopOrderFilter) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[31] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2462,7 +3113,7 @@ func (x *StopOrderFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use StopOrderFilter.ProtoReflect.Descriptor instead. func (*StopOrderFilter) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{31} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{41} } func (x *StopOrderFilter) GetStatuses() []vega.StopOrder_Status { @@ -2522,7 +3173,7 @@ type StopOrderEdge struct { func (x *StopOrderEdge) Reset() { *x = StopOrderEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[32] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2535,7 +3186,7 @@ func (x *StopOrderEdge) String() string { func (*StopOrderEdge) ProtoMessage() {} func (x *StopOrderEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[32] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2548,7 +3199,7 @@ func (x *StopOrderEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use StopOrderEdge.ProtoReflect.Descriptor instead. func (*StopOrderEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{32} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{42} } func (x *StopOrderEdge) GetNode() *v1.StopOrderEvent { @@ -2580,7 +3231,7 @@ type StopOrderConnection struct { func (x *StopOrderConnection) Reset() { *x = StopOrderConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[33] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2593,7 +3244,7 @@ func (x *StopOrderConnection) String() string { func (*StopOrderConnection) ProtoMessage() {} func (x *StopOrderConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[33] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2606,7 +3257,7 @@ func (x *StopOrderConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use StopOrderConnection.ProtoReflect.Descriptor instead. func (*StopOrderConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{33} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{43} } func (x *StopOrderConnection) GetEdges() []*StopOrderEdge { @@ -2636,7 +3287,7 @@ type ListStopOrdersResponse struct { func (x *ListStopOrdersResponse) Reset() { *x = ListStopOrdersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[34] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2649,7 +3300,7 @@ func (x *ListStopOrdersResponse) String() string { func (*ListStopOrdersResponse) ProtoMessage() {} func (x *ListStopOrdersResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[34] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2662,7 +3313,7 @@ func (x *ListStopOrdersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListStopOrdersResponse.ProtoReflect.Descriptor instead. func (*ListStopOrdersResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{34} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{44} } func (x *ListStopOrdersResponse) GetOrders() *StopOrderConnection { @@ -2692,7 +3343,7 @@ type ListPositionsRequest struct { func (x *ListPositionsRequest) Reset() { *x = ListPositionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[35] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2705,7 +3356,7 @@ func (x *ListPositionsRequest) String() string { func (*ListPositionsRequest) ProtoMessage() {} func (x *ListPositionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[35] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2718,7 +3369,7 @@ func (x *ListPositionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPositionsRequest.ProtoReflect.Descriptor instead. func (*ListPositionsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{35} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{45} } func (x *ListPositionsRequest) GetPartyId() string { @@ -2757,7 +3408,7 @@ type ListPositionsResponse struct { func (x *ListPositionsResponse) Reset() { *x = ListPositionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[36] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2770,7 +3421,7 @@ func (x *ListPositionsResponse) String() string { func (*ListPositionsResponse) ProtoMessage() {} func (x *ListPositionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[36] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2783,7 +3434,7 @@ func (x *ListPositionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPositionsResponse.ProtoReflect.Descriptor instead. func (*ListPositionsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{36} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{46} } func (x *ListPositionsResponse) GetPositions() *PositionConnection { @@ -2808,7 +3459,7 @@ type PositionsFilter struct { func (x *PositionsFilter) Reset() { *x = PositionsFilter{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[37] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2821,7 +3472,7 @@ func (x *PositionsFilter) String() string { func (*PositionsFilter) ProtoMessage() {} func (x *PositionsFilter) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[37] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2834,7 +3485,7 @@ func (x *PositionsFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use PositionsFilter.ProtoReflect.Descriptor instead. func (*PositionsFilter) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{37} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{47} } func (x *PositionsFilter) GetPartyIds() []string { @@ -2866,7 +3517,7 @@ type ListAllPositionsRequest struct { func (x *ListAllPositionsRequest) Reset() { *x = ListAllPositionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[38] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2879,7 +3530,7 @@ func (x *ListAllPositionsRequest) String() string { func (*ListAllPositionsRequest) ProtoMessage() {} func (x *ListAllPositionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[38] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2892,7 +3543,7 @@ func (x *ListAllPositionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAllPositionsRequest.ProtoReflect.Descriptor instead. func (*ListAllPositionsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{38} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{48} } func (x *ListAllPositionsRequest) GetFilter() *PositionsFilter { @@ -2922,7 +3573,7 @@ type ListAllPositionsResponse struct { func (x *ListAllPositionsResponse) Reset() { *x = ListAllPositionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[39] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2935,7 +3586,7 @@ func (x *ListAllPositionsResponse) String() string { func (*ListAllPositionsResponse) ProtoMessage() {} func (x *ListAllPositionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[39] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2948,7 +3599,7 @@ func (x *ListAllPositionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAllPositionsResponse.ProtoReflect.Descriptor instead. func (*ListAllPositionsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{39} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{49} } func (x *ListAllPositionsResponse) GetPositions() *PositionConnection { @@ -2973,7 +3624,7 @@ type PositionEdge struct { func (x *PositionEdge) Reset() { *x = PositionEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[40] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2986,7 +3637,7 @@ func (x *PositionEdge) String() string { func (*PositionEdge) ProtoMessage() {} func (x *PositionEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[40] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2999,7 +3650,7 @@ func (x *PositionEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use PositionEdge.ProtoReflect.Descriptor instead. func (*PositionEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{40} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{50} } func (x *PositionEdge) GetNode() *vega.Position { @@ -3031,7 +3682,7 @@ type PositionConnection struct { func (x *PositionConnection) Reset() { *x = PositionConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[41] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3044,7 +3695,7 @@ func (x *PositionConnection) String() string { func (*PositionConnection) ProtoMessage() {} func (x *PositionConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[41] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3057,7 +3708,7 @@ func (x *PositionConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use PositionConnection.ProtoReflect.Descriptor instead. func (*PositionConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{41} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{51} } func (x *PositionConnection) GetEdges() []*PositionEdge { @@ -3084,12 +3735,15 @@ type ObservePositionsRequest struct { PartyId *string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3,oneof" json:"party_id,omitempty"` // Restrict position updates to those related to the given markets. MarketId *string `protobuf:"bytes,2,opt,name=market_id,json=marketId,proto3,oneof" json:"market_id,omitempty"` + // Whether to return all derived parties from AMMs for the given party. + // If used, party ID is required. + IncludeDerivedParties *bool `protobuf:"varint,3,opt,name=include_derived_parties,json=includeDerivedParties,proto3,oneof" json:"include_derived_parties,omitempty"` } func (x *ObservePositionsRequest) Reset() { *x = ObservePositionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[42] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3102,7 +3756,7 @@ func (x *ObservePositionsRequest) String() string { func (*ObservePositionsRequest) ProtoMessage() {} func (x *ObservePositionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[42] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3115,7 +3769,7 @@ func (x *ObservePositionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObservePositionsRequest.ProtoReflect.Descriptor instead. func (*ObservePositionsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{42} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{52} } func (x *ObservePositionsRequest) GetPartyId() string { @@ -3132,6 +3786,13 @@ func (x *ObservePositionsRequest) GetMarketId() string { return "" } +func (x *ObservePositionsRequest) GetIncludeDerivedParties() bool { + if x != nil && x.IncludeDerivedParties != nil { + return *x.IncludeDerivedParties + } + return false +} + // Response received from a positions subscription request type ObservePositionsResponse struct { state protoimpl.MessageState @@ -3148,7 +3809,7 @@ type ObservePositionsResponse struct { func (x *ObservePositionsResponse) Reset() { *x = ObservePositionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[43] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3161,7 +3822,7 @@ func (x *ObservePositionsResponse) String() string { func (*ObservePositionsResponse) ProtoMessage() {} func (x *ObservePositionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[43] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3174,7 +3835,7 @@ func (x *ObservePositionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObservePositionsResponse.ProtoReflect.Descriptor instead. func (*ObservePositionsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{43} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{53} } func (m *ObservePositionsResponse) GetResponse() isObservePositionsResponse_Response { @@ -3231,7 +3892,7 @@ type PositionSnapshotPage struct { func (x *PositionSnapshotPage) Reset() { *x = PositionSnapshotPage{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[44] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3244,7 +3905,7 @@ func (x *PositionSnapshotPage) String() string { func (*PositionSnapshotPage) ProtoMessage() {} func (x *PositionSnapshotPage) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[44] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3257,7 +3918,7 @@ func (x *PositionSnapshotPage) ProtoReflect() protoreflect.Message { // Deprecated: Use PositionSnapshotPage.ProtoReflect.Descriptor instead. func (*PositionSnapshotPage) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{44} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{54} } func (x *PositionSnapshotPage) GetPositions() []*vega.Position { @@ -3287,7 +3948,7 @@ type PositionUpdates struct { func (x *PositionUpdates) Reset() { *x = PositionUpdates{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[45] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3300,7 +3961,7 @@ func (x *PositionUpdates) String() string { func (*PositionUpdates) ProtoMessage() {} func (x *PositionUpdates) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[45] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3313,7 +3974,7 @@ func (x *PositionUpdates) ProtoReflect() protoreflect.Message { // Deprecated: Use PositionUpdates.ProtoReflect.Descriptor instead. func (*PositionUpdates) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{45} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{55} } func (x *PositionUpdates) GetPositions() []*vega.Position { @@ -3346,7 +4007,7 @@ type LedgerEntryFilter struct { func (x *LedgerEntryFilter) Reset() { *x = LedgerEntryFilter{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[46] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3359,7 +4020,7 @@ func (x *LedgerEntryFilter) String() string { func (*LedgerEntryFilter) ProtoMessage() {} func (x *LedgerEntryFilter) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[46] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3372,7 +4033,7 @@ func (x *LedgerEntryFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use LedgerEntryFilter.ProtoReflect.Descriptor instead. func (*LedgerEntryFilter) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{46} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{56} } func (x *LedgerEntryFilter) GetCloseOnAccountFilters() bool { @@ -3448,7 +4109,7 @@ type AggregatedLedgerEntry struct { func (x *AggregatedLedgerEntry) Reset() { *x = AggregatedLedgerEntry{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[47] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3461,7 +4122,7 @@ func (x *AggregatedLedgerEntry) String() string { func (*AggregatedLedgerEntry) ProtoMessage() {} func (x *AggregatedLedgerEntry) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[47] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3474,7 +4135,7 @@ func (x *AggregatedLedgerEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use AggregatedLedgerEntry.ProtoReflect.Descriptor instead. func (*AggregatedLedgerEntry) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{47} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{57} } func (x *AggregatedLedgerEntry) GetTimestamp() int64 { @@ -3591,7 +4252,7 @@ type ListLedgerEntriesRequest struct { func (x *ListLedgerEntriesRequest) Reset() { *x = ListLedgerEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[48] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3604,7 +4265,7 @@ func (x *ListLedgerEntriesRequest) String() string { func (*ListLedgerEntriesRequest) ProtoMessage() {} func (x *ListLedgerEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[48] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3617,7 +4278,7 @@ func (x *ListLedgerEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLedgerEntriesRequest.ProtoReflect.Descriptor instead. func (*ListLedgerEntriesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{48} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{58} } func (x *ListLedgerEntriesRequest) GetFilter() *LedgerEntryFilter { @@ -3658,7 +4319,7 @@ type ExportLedgerEntriesRequest struct { func (x *ExportLedgerEntriesRequest) Reset() { *x = ExportLedgerEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[49] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3671,7 +4332,7 @@ func (x *ExportLedgerEntriesRequest) String() string { func (*ExportLedgerEntriesRequest) ProtoMessage() {} func (x *ExportLedgerEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[49] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3684,7 +4345,7 @@ func (x *ExportLedgerEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportLedgerEntriesRequest.ProtoReflect.Descriptor instead. func (*ExportLedgerEntriesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{49} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{59} } func (x *ExportLedgerEntriesRequest) GetPartyId() string { @@ -3721,7 +4382,7 @@ type ListLedgerEntriesResponse struct { func (x *ListLedgerEntriesResponse) Reset() { *x = ListLedgerEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[50] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3734,7 +4395,7 @@ func (x *ListLedgerEntriesResponse) String() string { func (*ListLedgerEntriesResponse) ProtoMessage() {} func (x *ListLedgerEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[50] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3747,7 +4408,7 @@ func (x *ListLedgerEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLedgerEntriesResponse.ProtoReflect.Descriptor instead. func (*ListLedgerEntriesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{50} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{60} } func (x *ListLedgerEntriesResponse) GetLedgerEntries() *AggregatedLedgerEntriesConnection { @@ -3772,7 +4433,7 @@ type AggregatedLedgerEntriesEdge struct { func (x *AggregatedLedgerEntriesEdge) Reset() { *x = AggregatedLedgerEntriesEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[51] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3785,7 +4446,7 @@ func (x *AggregatedLedgerEntriesEdge) String() string { func (*AggregatedLedgerEntriesEdge) ProtoMessage() {} func (x *AggregatedLedgerEntriesEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[51] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3798,7 +4459,7 @@ func (x *AggregatedLedgerEntriesEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use AggregatedLedgerEntriesEdge.ProtoReflect.Descriptor instead. func (*AggregatedLedgerEntriesEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{51} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{61} } func (x *AggregatedLedgerEntriesEdge) GetNode() *AggregatedLedgerEntry { @@ -3830,7 +4491,7 @@ type AggregatedLedgerEntriesConnection struct { func (x *AggregatedLedgerEntriesConnection) Reset() { *x = AggregatedLedgerEntriesConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[52] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3843,7 +4504,7 @@ func (x *AggregatedLedgerEntriesConnection) String() string { func (*AggregatedLedgerEntriesConnection) ProtoMessage() {} func (x *AggregatedLedgerEntriesConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[52] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3856,7 +4517,7 @@ func (x *AggregatedLedgerEntriesConnection) ProtoReflect() protoreflect.Message // Deprecated: Use AggregatedLedgerEntriesConnection.ProtoReflect.Descriptor instead. func (*AggregatedLedgerEntriesConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{52} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{62} } func (x *AggregatedLedgerEntriesConnection) GetEdges() []*AggregatedLedgerEntriesEdge { @@ -3894,7 +4555,7 @@ type ListBalanceChangesRequest struct { func (x *ListBalanceChangesRequest) Reset() { *x = ListBalanceChangesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[53] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3907,7 +4568,7 @@ func (x *ListBalanceChangesRequest) String() string { func (*ListBalanceChangesRequest) ProtoMessage() {} func (x *ListBalanceChangesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[53] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3920,7 +4581,7 @@ func (x *ListBalanceChangesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBalanceChangesRequest.ProtoReflect.Descriptor instead. func (*ListBalanceChangesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{53} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{63} } func (x *ListBalanceChangesRequest) GetFilter() *AccountFilter { @@ -3957,7 +4618,7 @@ type ListBalanceChangesResponse struct { func (x *ListBalanceChangesResponse) Reset() { *x = ListBalanceChangesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[54] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3970,7 +4631,7 @@ func (x *ListBalanceChangesResponse) String() string { func (*ListBalanceChangesResponse) ProtoMessage() {} func (x *ListBalanceChangesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[54] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3983,7 +4644,7 @@ func (x *ListBalanceChangesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBalanceChangesResponse.ProtoReflect.Descriptor instead. func (*ListBalanceChangesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{54} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{64} } func (x *ListBalanceChangesResponse) GetBalances() *AggregatedBalanceConnection { @@ -4011,7 +4672,7 @@ type GetBalanceHistoryRequest struct { func (x *GetBalanceHistoryRequest) Reset() { *x = GetBalanceHistoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[55] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4024,7 +4685,7 @@ func (x *GetBalanceHistoryRequest) String() string { func (*GetBalanceHistoryRequest) ProtoMessage() {} func (x *GetBalanceHistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[55] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4037,7 +4698,7 @@ func (x *GetBalanceHistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBalanceHistoryRequest.ProtoReflect.Descriptor instead. func (*GetBalanceHistoryRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{55} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{65} } func (x *GetBalanceHistoryRequest) GetFilter() *AccountFilter { @@ -4081,7 +4742,7 @@ type GetBalanceHistoryResponse struct { func (x *GetBalanceHistoryResponse) Reset() { *x = GetBalanceHistoryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[56] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4094,7 +4755,7 @@ func (x *GetBalanceHistoryResponse) String() string { func (*GetBalanceHistoryResponse) ProtoMessage() {} func (x *GetBalanceHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[56] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4107,7 +4768,7 @@ func (x *GetBalanceHistoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetBalanceHistoryResponse.ProtoReflect.Descriptor instead. func (*GetBalanceHistoryResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{56} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{66} } func (x *GetBalanceHistoryResponse) GetBalances() *AggregatedBalanceConnection { @@ -4132,7 +4793,7 @@ type AggregatedBalanceEdge struct { func (x *AggregatedBalanceEdge) Reset() { *x = AggregatedBalanceEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[57] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4145,7 +4806,7 @@ func (x *AggregatedBalanceEdge) String() string { func (*AggregatedBalanceEdge) ProtoMessage() {} func (x *AggregatedBalanceEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[57] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4158,7 +4819,7 @@ func (x *AggregatedBalanceEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use AggregatedBalanceEdge.ProtoReflect.Descriptor instead. func (*AggregatedBalanceEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{57} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{67} } func (x *AggregatedBalanceEdge) GetNode() *AggregatedBalance { @@ -4190,7 +4851,7 @@ type AggregatedBalanceConnection struct { func (x *AggregatedBalanceConnection) Reset() { *x = AggregatedBalanceConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[58] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4203,7 +4864,7 @@ func (x *AggregatedBalanceConnection) String() string { func (*AggregatedBalanceConnection) ProtoMessage() {} func (x *AggregatedBalanceConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[58] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4216,7 +4877,7 @@ func (x *AggregatedBalanceConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use AggregatedBalanceConnection.ProtoReflect.Descriptor instead. func (*AggregatedBalanceConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{58} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{68} } func (x *AggregatedBalanceConnection) GetEdges() []*AggregatedBalanceEdge { @@ -4259,7 +4920,7 @@ type AccountFilter struct { func (x *AccountFilter) Reset() { *x = AccountFilter{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[59] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4272,7 +4933,7 @@ func (x *AccountFilter) String() string { func (*AccountFilter) ProtoMessage() {} func (x *AccountFilter) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[59] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4285,7 +4946,7 @@ func (x *AccountFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use AccountFilter.ProtoReflect.Descriptor instead. func (*AccountFilter) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{59} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{69} } func (x *AccountFilter) GetAssetId() string { @@ -4340,7 +5001,7 @@ type AggregatedBalance struct { func (x *AggregatedBalance) Reset() { *x = AggregatedBalance{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[60] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4353,7 +5014,7 @@ func (x *AggregatedBalance) String() string { func (*AggregatedBalance) ProtoMessage() {} func (x *AggregatedBalance) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[60] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4366,7 +5027,7 @@ func (x *AggregatedBalance) ProtoReflect() protoreflect.Message { // Deprecated: Use AggregatedBalance.ProtoReflect.Descriptor instead. func (*AggregatedBalance) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{60} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{70} } func (x *AggregatedBalance) GetTimestamp() int64 { @@ -4424,7 +5085,7 @@ type ObserveMarketsDepthRequest struct { func (x *ObserveMarketsDepthRequest) Reset() { *x = ObserveMarketsDepthRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[61] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4437,7 +5098,7 @@ func (x *ObserveMarketsDepthRequest) String() string { func (*ObserveMarketsDepthRequest) ProtoMessage() {} func (x *ObserveMarketsDepthRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[61] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4450,7 +5111,7 @@ func (x *ObserveMarketsDepthRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveMarketsDepthRequest.ProtoReflect.Descriptor instead. func (*ObserveMarketsDepthRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{61} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{71} } func (x *ObserveMarketsDepthRequest) GetMarketIds() []string { @@ -4473,7 +5134,7 @@ type ObserveMarketsDepthResponse struct { func (x *ObserveMarketsDepthResponse) Reset() { *x = ObserveMarketsDepthResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[62] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4486,7 +5147,7 @@ func (x *ObserveMarketsDepthResponse) String() string { func (*ObserveMarketsDepthResponse) ProtoMessage() {} func (x *ObserveMarketsDepthResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[62] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4499,7 +5160,7 @@ func (x *ObserveMarketsDepthResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveMarketsDepthResponse.ProtoReflect.Descriptor instead. func (*ObserveMarketsDepthResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{62} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{72} } func (x *ObserveMarketsDepthResponse) GetMarketDepth() []*vega.MarketDepth { @@ -4522,7 +5183,7 @@ type ObserveMarketsDepthUpdatesRequest struct { func (x *ObserveMarketsDepthUpdatesRequest) Reset() { *x = ObserveMarketsDepthUpdatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[63] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4535,7 +5196,7 @@ func (x *ObserveMarketsDepthUpdatesRequest) String() string { func (*ObserveMarketsDepthUpdatesRequest) ProtoMessage() {} func (x *ObserveMarketsDepthUpdatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[63] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4548,7 +5209,7 @@ func (x *ObserveMarketsDepthUpdatesRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ObserveMarketsDepthUpdatesRequest.ProtoReflect.Descriptor instead. func (*ObserveMarketsDepthUpdatesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{63} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{73} } func (x *ObserveMarketsDepthUpdatesRequest) GetMarketIds() []string { @@ -4571,7 +5232,7 @@ type ObserveMarketsDepthUpdatesResponse struct { func (x *ObserveMarketsDepthUpdatesResponse) Reset() { *x = ObserveMarketsDepthUpdatesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[64] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4584,7 +5245,7 @@ func (x *ObserveMarketsDepthUpdatesResponse) String() string { func (*ObserveMarketsDepthUpdatesResponse) ProtoMessage() {} func (x *ObserveMarketsDepthUpdatesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[64] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4597,7 +5258,7 @@ func (x *ObserveMarketsDepthUpdatesResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ObserveMarketsDepthUpdatesResponse.ProtoReflect.Descriptor instead. func (*ObserveMarketsDepthUpdatesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{64} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{74} } func (x *ObserveMarketsDepthUpdatesResponse) GetUpdate() []*vega.MarketDepthUpdate { @@ -4620,7 +5281,7 @@ type ObserveMarketsDataRequest struct { func (x *ObserveMarketsDataRequest) Reset() { *x = ObserveMarketsDataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[65] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4633,7 +5294,7 @@ func (x *ObserveMarketsDataRequest) String() string { func (*ObserveMarketsDataRequest) ProtoMessage() {} func (x *ObserveMarketsDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[65] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4646,7 +5307,7 @@ func (x *ObserveMarketsDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveMarketsDataRequest.ProtoReflect.Descriptor instead. func (*ObserveMarketsDataRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{65} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{75} } func (x *ObserveMarketsDataRequest) GetMarketIds() []string { @@ -4669,7 +5330,7 @@ type ObserveMarketsDataResponse struct { func (x *ObserveMarketsDataResponse) Reset() { *x = ObserveMarketsDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[66] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4682,7 +5343,7 @@ func (x *ObserveMarketsDataResponse) String() string { func (*ObserveMarketsDataResponse) ProtoMessage() {} func (x *ObserveMarketsDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[66] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4695,7 +5356,7 @@ func (x *ObserveMarketsDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveMarketsDataResponse.ProtoReflect.Descriptor instead. func (*ObserveMarketsDataResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{66} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{76} } func (x *ObserveMarketsDataResponse) GetMarketData() []*vega.MarketData { @@ -4720,7 +5381,7 @@ type GetLatestMarketDepthRequest struct { func (x *GetLatestMarketDepthRequest) Reset() { *x = GetLatestMarketDepthRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[67] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4733,7 +5394,7 @@ func (x *GetLatestMarketDepthRequest) String() string { func (*GetLatestMarketDepthRequest) ProtoMessage() {} func (x *GetLatestMarketDepthRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[67] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4746,7 +5407,7 @@ func (x *GetLatestMarketDepthRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestMarketDepthRequest.ProtoReflect.Descriptor instead. func (*GetLatestMarketDepthRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{67} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{77} } func (x *GetLatestMarketDepthRequest) GetMarketId() string { @@ -4784,7 +5445,7 @@ type GetLatestMarketDepthResponse struct { func (x *GetLatestMarketDepthResponse) Reset() { *x = GetLatestMarketDepthResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[68] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4797,7 +5458,7 @@ func (x *GetLatestMarketDepthResponse) String() string { func (*GetLatestMarketDepthResponse) ProtoMessage() {} func (x *GetLatestMarketDepthResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[68] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4810,7 +5471,7 @@ func (x *GetLatestMarketDepthResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestMarketDepthResponse.ProtoReflect.Descriptor instead. func (*GetLatestMarketDepthResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{68} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{78} } func (x *GetLatestMarketDepthResponse) GetMarketId() string { @@ -4858,7 +5519,7 @@ type ListLatestMarketDataRequest struct { func (x *ListLatestMarketDataRequest) Reset() { *x = ListLatestMarketDataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[69] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4871,7 +5532,7 @@ func (x *ListLatestMarketDataRequest) String() string { func (*ListLatestMarketDataRequest) ProtoMessage() {} func (x *ListLatestMarketDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[69] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4884,7 +5545,7 @@ func (x *ListLatestMarketDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLatestMarketDataRequest.ProtoReflect.Descriptor instead. func (*ListLatestMarketDataRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{69} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{79} } // Response that is received when listing the latest market data for every market @@ -4899,7 +5560,7 @@ type ListLatestMarketDataResponse struct { func (x *ListLatestMarketDataResponse) Reset() { *x = ListLatestMarketDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[70] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4912,7 +5573,7 @@ func (x *ListLatestMarketDataResponse) String() string { func (*ListLatestMarketDataResponse) ProtoMessage() {} func (x *ListLatestMarketDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[70] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4925,7 +5586,7 @@ func (x *ListLatestMarketDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLatestMarketDataResponse.ProtoReflect.Descriptor instead. func (*ListLatestMarketDataResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{70} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{80} } func (x *ListLatestMarketDataResponse) GetMarketsData() []*vega.MarketData { @@ -4948,7 +5609,7 @@ type GetLatestMarketDataRequest struct { func (x *GetLatestMarketDataRequest) Reset() { *x = GetLatestMarketDataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[71] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4961,7 +5622,7 @@ func (x *GetLatestMarketDataRequest) String() string { func (*GetLatestMarketDataRequest) ProtoMessage() {} func (x *GetLatestMarketDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[71] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4974,7 +5635,7 @@ func (x *GetLatestMarketDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestMarketDataRequest.ProtoReflect.Descriptor instead. func (*GetLatestMarketDataRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{71} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{81} } func (x *GetLatestMarketDataRequest) GetMarketId() string { @@ -4997,7 +5658,7 @@ type GetLatestMarketDataResponse struct { func (x *GetLatestMarketDataResponse) Reset() { *x = GetLatestMarketDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[72] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5010,7 +5671,7 @@ func (x *GetLatestMarketDataResponse) String() string { func (*GetLatestMarketDataResponse) ProtoMessage() {} func (x *GetLatestMarketDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[72] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5023,7 +5684,7 @@ func (x *GetLatestMarketDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLatestMarketDataResponse.ProtoReflect.Descriptor instead. func (*GetLatestMarketDataResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{72} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{82} } func (x *GetLatestMarketDataResponse) GetMarketData() *vega.MarketData { @@ -5052,7 +5713,7 @@ type GetMarketDataHistoryByIDRequest struct { func (x *GetMarketDataHistoryByIDRequest) Reset() { *x = GetMarketDataHistoryByIDRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[73] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5065,7 +5726,7 @@ func (x *GetMarketDataHistoryByIDRequest) String() string { func (*GetMarketDataHistoryByIDRequest) ProtoMessage() {} func (x *GetMarketDataHistoryByIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[73] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5078,7 +5739,7 @@ func (x *GetMarketDataHistoryByIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMarketDataHistoryByIDRequest.ProtoReflect.Descriptor instead. func (*GetMarketDataHistoryByIDRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{73} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{83} } func (x *GetMarketDataHistoryByIDRequest) GetMarketId() string { @@ -5122,7 +5783,7 @@ type GetMarketDataHistoryByIDResponse struct { func (x *GetMarketDataHistoryByIDResponse) Reset() { *x = GetMarketDataHistoryByIDResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[74] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5135,7 +5796,7 @@ func (x *GetMarketDataHistoryByIDResponse) String() string { func (*GetMarketDataHistoryByIDResponse) ProtoMessage() {} func (x *GetMarketDataHistoryByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[74] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5148,7 +5809,7 @@ func (x *GetMarketDataHistoryByIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMarketDataHistoryByIDResponse.ProtoReflect.Descriptor instead. func (*GetMarketDataHistoryByIDResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{74} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{84} } func (x *GetMarketDataHistoryByIDResponse) GetMarketData() *MarketDataConnection { @@ -5173,7 +5834,7 @@ type MarketDataEdge struct { func (x *MarketDataEdge) Reset() { *x = MarketDataEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[75] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5186,7 +5847,7 @@ func (x *MarketDataEdge) String() string { func (*MarketDataEdge) ProtoMessage() {} func (x *MarketDataEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[75] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5199,7 +5860,7 @@ func (x *MarketDataEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketDataEdge.ProtoReflect.Descriptor instead. func (*MarketDataEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{75} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{85} } func (x *MarketDataEdge) GetNode() *vega.MarketData { @@ -5231,7 +5892,7 @@ type MarketDataConnection struct { func (x *MarketDataConnection) Reset() { *x = MarketDataConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[76] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5244,7 +5905,7 @@ func (x *MarketDataConnection) String() string { func (*MarketDataConnection) ProtoMessage() {} func (x *MarketDataConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[76] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5257,7 +5918,7 @@ func (x *MarketDataConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketDataConnection.ProtoReflect.Descriptor instead. func (*MarketDataConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{76} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{86} } func (x *MarketDataConnection) GetEdges() []*MarketDataEdge { @@ -5308,7 +5969,7 @@ type ListTransfersRequest struct { func (x *ListTransfersRequest) Reset() { *x = ListTransfersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[77] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5321,7 +5982,7 @@ func (x *ListTransfersRequest) String() string { func (*ListTransfersRequest) ProtoMessage() {} func (x *ListTransfersRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[77] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5334,7 +5995,7 @@ func (x *ListTransfersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTransfersRequest.ProtoReflect.Descriptor instead. func (*ListTransfersRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{77} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{87} } func (x *ListTransfersRequest) GetPubkey() string { @@ -5427,7 +6088,7 @@ type ListTransfersResponse struct { func (x *ListTransfersResponse) Reset() { *x = ListTransfersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[78] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5440,7 +6101,7 @@ func (x *ListTransfersResponse) String() string { func (*ListTransfersResponse) ProtoMessage() {} func (x *ListTransfersResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[78] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5453,7 +6114,7 @@ func (x *ListTransfersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTransfersResponse.ProtoReflect.Descriptor instead. func (*ListTransfersResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{78} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{88} } func (x *ListTransfersResponse) GetTransfers() *TransferConnection { @@ -5477,7 +6138,7 @@ type TransferNode struct { func (x *TransferNode) Reset() { *x = TransferNode{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[79] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5490,7 +6151,7 @@ func (x *TransferNode) String() string { func (*TransferNode) ProtoMessage() {} func (x *TransferNode) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[79] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5503,7 +6164,7 @@ func (x *TransferNode) ProtoReflect() protoreflect.Message { // Deprecated: Use TransferNode.ProtoReflect.Descriptor instead. func (*TransferNode) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{79} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{89} } func (x *TransferNode) GetTransfer() *v1.Transfer { @@ -5535,7 +6196,7 @@ type TransferEdge struct { func (x *TransferEdge) Reset() { *x = TransferEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[80] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5548,7 +6209,7 @@ func (x *TransferEdge) String() string { func (*TransferEdge) ProtoMessage() {} func (x *TransferEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[80] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5561,7 +6222,7 @@ func (x *TransferEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use TransferEdge.ProtoReflect.Descriptor instead. func (*TransferEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{80} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{90} } func (x *TransferEdge) GetNode() *TransferNode { @@ -5593,7 +6254,7 @@ type TransferConnection struct { func (x *TransferConnection) Reset() { *x = TransferConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[81] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5606,7 +6267,7 @@ func (x *TransferConnection) String() string { func (*TransferConnection) ProtoMessage() {} func (x *TransferConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[81] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5619,7 +6280,7 @@ func (x *TransferConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TransferConnection.ProtoReflect.Descriptor instead. func (*TransferConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{81} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{91} } func (x *TransferConnection) GetEdges() []*TransferEdge { @@ -5649,7 +6310,7 @@ type GetTransferRequest struct { func (x *GetTransferRequest) Reset() { *x = GetTransferRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[82] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5662,7 +6323,7 @@ func (x *GetTransferRequest) String() string { func (*GetTransferRequest) ProtoMessage() {} func (x *GetTransferRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[82] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5675,7 +6336,7 @@ func (x *GetTransferRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTransferRequest.ProtoReflect.Descriptor instead. func (*GetTransferRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{82} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{92} } func (x *GetTransferRequest) GetTransferId() string { @@ -5698,7 +6359,7 @@ type GetTransferResponse struct { func (x *GetTransferResponse) Reset() { *x = GetTransferResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[83] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5711,7 +6372,7 @@ func (x *GetTransferResponse) String() string { func (*GetTransferResponse) ProtoMessage() {} func (x *GetTransferResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[83] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5724,7 +6385,7 @@ func (x *GetTransferResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTransferResponse.ProtoReflect.Descriptor instead. func (*GetTransferResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{83} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{93} } func (x *GetTransferResponse) GetTransferNode() *TransferNode { @@ -5744,7 +6405,7 @@ type GetNetworkLimitsRequest struct { func (x *GetNetworkLimitsRequest) Reset() { *x = GetNetworkLimitsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[84] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5757,7 +6418,7 @@ func (x *GetNetworkLimitsRequest) String() string { func (*GetNetworkLimitsRequest) ProtoMessage() {} func (x *GetNetworkLimitsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[84] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5770,7 +6431,7 @@ func (x *GetNetworkLimitsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNetworkLimitsRequest.ProtoReflect.Descriptor instead. func (*GetNetworkLimitsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{84} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{94} } // Response received when querying the current network limits @@ -5786,7 +6447,7 @@ type GetNetworkLimitsResponse struct { func (x *GetNetworkLimitsResponse) Reset() { *x = GetNetworkLimitsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[85] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5799,7 +6460,7 @@ func (x *GetNetworkLimitsResponse) String() string { func (*GetNetworkLimitsResponse) ProtoMessage() {} func (x *GetNetworkLimitsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[85] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5812,7 +6473,7 @@ func (x *GetNetworkLimitsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNetworkLimitsResponse.ProtoReflect.Descriptor instead. func (*GetNetworkLimitsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{85} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{95} } func (x *GetNetworkLimitsResponse) GetLimits() *vega.NetworkLimits { @@ -5835,7 +6496,7 @@ type ListCandleIntervalsRequest struct { func (x *ListCandleIntervalsRequest) Reset() { *x = ListCandleIntervalsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[86] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5848,7 +6509,7 @@ func (x *ListCandleIntervalsRequest) String() string { func (*ListCandleIntervalsRequest) ProtoMessage() {} func (x *ListCandleIntervalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[86] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5861,7 +6522,7 @@ func (x *ListCandleIntervalsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCandleIntervalsRequest.ProtoReflect.Descriptor instead. func (*ListCandleIntervalsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{86} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{96} } func (x *ListCandleIntervalsRequest) GetMarketId() string { @@ -5886,7 +6547,7 @@ type IntervalToCandleId struct { func (x *IntervalToCandleId) Reset() { *x = IntervalToCandleId{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[87] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5899,7 +6560,7 @@ func (x *IntervalToCandleId) String() string { func (*IntervalToCandleId) ProtoMessage() {} func (x *IntervalToCandleId) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[87] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5912,7 +6573,7 @@ func (x *IntervalToCandleId) ProtoReflect() protoreflect.Message { // Deprecated: Use IntervalToCandleId.ProtoReflect.Descriptor instead. func (*IntervalToCandleId) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{87} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{97} } func (x *IntervalToCandleId) GetInterval() string { @@ -5942,7 +6603,7 @@ type ListCandleIntervalsResponse struct { func (x *ListCandleIntervalsResponse) Reset() { *x = ListCandleIntervalsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[88] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5955,7 +6616,7 @@ func (x *ListCandleIntervalsResponse) String() string { func (*ListCandleIntervalsResponse) ProtoMessage() {} func (x *ListCandleIntervalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[88] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5968,7 +6629,7 @@ func (x *ListCandleIntervalsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCandleIntervalsResponse.ProtoReflect.Descriptor instead. func (*ListCandleIntervalsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{88} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{98} } func (x *ListCandleIntervalsResponse) GetIntervalToCandleId() []*IntervalToCandleId { @@ -6007,7 +6668,7 @@ type Candle struct { func (x *Candle) Reset() { *x = Candle{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[89] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6020,7 +6681,7 @@ func (x *Candle) String() string { func (*Candle) ProtoMessage() {} func (x *Candle) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[89] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6033,7 +6694,7 @@ func (x *Candle) ProtoReflect() protoreflect.Message { // Deprecated: Use Candle.ProtoReflect.Descriptor instead. func (*Candle) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{89} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{99} } func (x *Candle) GetStart() int64 { @@ -6105,7 +6766,7 @@ type ObserveCandleDataRequest struct { func (x *ObserveCandleDataRequest) Reset() { *x = ObserveCandleDataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[90] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6118,7 +6779,7 @@ func (x *ObserveCandleDataRequest) String() string { func (*ObserveCandleDataRequest) ProtoMessage() {} func (x *ObserveCandleDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[90] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6131,7 +6792,7 @@ func (x *ObserveCandleDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveCandleDataRequest.ProtoReflect.Descriptor instead. func (*ObserveCandleDataRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{90} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{100} } func (x *ObserveCandleDataRequest) GetCandleId() string { @@ -6154,7 +6815,7 @@ type ObserveCandleDataResponse struct { func (x *ObserveCandleDataResponse) Reset() { *x = ObserveCandleDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[91] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6167,7 +6828,7 @@ func (x *ObserveCandleDataResponse) String() string { func (*ObserveCandleDataResponse) ProtoMessage() {} func (x *ObserveCandleDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[91] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6180,7 +6841,7 @@ func (x *ObserveCandleDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveCandleDataResponse.ProtoReflect.Descriptor instead. func (*ObserveCandleDataResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{91} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{101} } func (x *ObserveCandleDataResponse) GetCandle() *Candle { @@ -6209,7 +6870,7 @@ type ListCandleDataRequest struct { func (x *ListCandleDataRequest) Reset() { *x = ListCandleDataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[92] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6222,7 +6883,7 @@ func (x *ListCandleDataRequest) String() string { func (*ListCandleDataRequest) ProtoMessage() {} func (x *ListCandleDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[92] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6235,7 +6896,7 @@ func (x *ListCandleDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCandleDataRequest.ProtoReflect.Descriptor instead. func (*ListCandleDataRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{92} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{102} } func (x *ListCandleDataRequest) GetCandleId() string { @@ -6279,7 +6940,7 @@ type ListCandleDataResponse struct { func (x *ListCandleDataResponse) Reset() { *x = ListCandleDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[93] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6292,7 +6953,7 @@ func (x *ListCandleDataResponse) String() string { func (*ListCandleDataResponse) ProtoMessage() {} func (x *ListCandleDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[93] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6305,7 +6966,7 @@ func (x *ListCandleDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCandleDataResponse.ProtoReflect.Descriptor instead. func (*ListCandleDataResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{93} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{103} } func (x *ListCandleDataResponse) GetCandles() *CandleDataConnection { @@ -6330,7 +6991,7 @@ type CandleEdge struct { func (x *CandleEdge) Reset() { *x = CandleEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[94] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6343,7 +7004,7 @@ func (x *CandleEdge) String() string { func (*CandleEdge) ProtoMessage() {} func (x *CandleEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[94] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6356,7 +7017,7 @@ func (x *CandleEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use CandleEdge.ProtoReflect.Descriptor instead. func (*CandleEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{94} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{104} } func (x *CandleEdge) GetNode() *Candle { @@ -6388,7 +7049,7 @@ type CandleDataConnection struct { func (x *CandleDataConnection) Reset() { *x = CandleDataConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[95] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6401,7 +7062,7 @@ func (x *CandleDataConnection) String() string { func (*CandleDataConnection) ProtoMessage() {} func (x *CandleDataConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[95] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6414,7 +7075,7 @@ func (x *CandleDataConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use CandleDataConnection.ProtoReflect.Descriptor instead. func (*CandleDataConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{95} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{105} } func (x *CandleDataConnection) GetEdges() []*CandleEdge { @@ -6448,7 +7109,7 @@ type ListVotesRequest struct { func (x *ListVotesRequest) Reset() { *x = ListVotesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[96] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6461,7 +7122,7 @@ func (x *ListVotesRequest) String() string { func (*ListVotesRequest) ProtoMessage() {} func (x *ListVotesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[96] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6474,7 +7135,7 @@ func (x *ListVotesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListVotesRequest.ProtoReflect.Descriptor instead. func (*ListVotesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{96} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{106} } func (x *ListVotesRequest) GetPartyId() string { @@ -6511,7 +7172,7 @@ type ListVotesResponse struct { func (x *ListVotesResponse) Reset() { *x = ListVotesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[97] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6524,7 +7185,7 @@ func (x *ListVotesResponse) String() string { func (*ListVotesResponse) ProtoMessage() {} func (x *ListVotesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[97] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6537,7 +7198,7 @@ func (x *ListVotesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListVotesResponse.ProtoReflect.Descriptor instead. func (*ListVotesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{97} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{107} } func (x *ListVotesResponse) GetVotes() *VoteConnection { @@ -6562,7 +7223,7 @@ type VoteEdge struct { func (x *VoteEdge) Reset() { *x = VoteEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[98] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6575,7 +7236,7 @@ func (x *VoteEdge) String() string { func (*VoteEdge) ProtoMessage() {} func (x *VoteEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[98] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6588,7 +7249,7 @@ func (x *VoteEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use VoteEdge.ProtoReflect.Descriptor instead. func (*VoteEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{98} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{108} } func (x *VoteEdge) GetNode() *vega.Vote { @@ -6620,7 +7281,7 @@ type VoteConnection struct { func (x *VoteConnection) Reset() { *x = VoteConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[99] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6633,7 +7294,7 @@ func (x *VoteConnection) String() string { func (*VoteConnection) ProtoMessage() {} func (x *VoteConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[99] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6646,7 +7307,7 @@ func (x *VoteConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use VoteConnection.ProtoReflect.Descriptor instead. func (*VoteConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{99} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{109} } func (x *VoteConnection) GetEdges() []*VoteEdge { @@ -6678,7 +7339,7 @@ type ObserveVotesRequest struct { func (x *ObserveVotesRequest) Reset() { *x = ObserveVotesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[100] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6691,7 +7352,7 @@ func (x *ObserveVotesRequest) String() string { func (*ObserveVotesRequest) ProtoMessage() {} func (x *ObserveVotesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[100] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6704,7 +7365,7 @@ func (x *ObserveVotesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveVotesRequest.ProtoReflect.Descriptor instead. func (*ObserveVotesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{100} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{110} } func (x *ObserveVotesRequest) GetPartyId() string { @@ -6734,7 +7395,7 @@ type ObserveVotesResponse struct { func (x *ObserveVotesResponse) Reset() { *x = ObserveVotesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[101] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6747,7 +7408,7 @@ func (x *ObserveVotesResponse) String() string { func (*ObserveVotesResponse) ProtoMessage() {} func (x *ObserveVotesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[101] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6760,7 +7421,7 @@ func (x *ObserveVotesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveVotesResponse.ProtoReflect.Descriptor instead. func (*ObserveVotesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{101} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{111} } func (x *ObserveVotesResponse) GetVote() *vega.Vote { @@ -6791,7 +7452,7 @@ type ListERC20MultiSigSignerAddedBundlesRequest struct { func (x *ListERC20MultiSigSignerAddedBundlesRequest) Reset() { *x = ListERC20MultiSigSignerAddedBundlesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[102] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6804,7 +7465,7 @@ func (x *ListERC20MultiSigSignerAddedBundlesRequest) String() string { func (*ListERC20MultiSigSignerAddedBundlesRequest) ProtoMessage() {} func (x *ListERC20MultiSigSignerAddedBundlesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[102] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6817,7 +7478,7 @@ func (x *ListERC20MultiSigSignerAddedBundlesRequest) ProtoReflect() protoreflect // Deprecated: Use ListERC20MultiSigSignerAddedBundlesRequest.ProtoReflect.Descriptor instead. func (*ListERC20MultiSigSignerAddedBundlesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{102} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{112} } func (x *ListERC20MultiSigSignerAddedBundlesRequest) GetNodeId() string { @@ -6868,7 +7529,7 @@ type ListERC20MultiSigSignerAddedBundlesResponse struct { func (x *ListERC20MultiSigSignerAddedBundlesResponse) Reset() { *x = ListERC20MultiSigSignerAddedBundlesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[103] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6881,7 +7542,7 @@ func (x *ListERC20MultiSigSignerAddedBundlesResponse) String() string { func (*ListERC20MultiSigSignerAddedBundlesResponse) ProtoMessage() {} func (x *ListERC20MultiSigSignerAddedBundlesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[103] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6894,7 +7555,7 @@ func (x *ListERC20MultiSigSignerAddedBundlesResponse) ProtoReflect() protoreflec // Deprecated: Use ListERC20MultiSigSignerAddedBundlesResponse.ProtoReflect.Descriptor instead. func (*ListERC20MultiSigSignerAddedBundlesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{103} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{113} } func (x *ListERC20MultiSigSignerAddedBundlesResponse) GetBundles() *ERC20MultiSigSignerAddedConnection { @@ -6919,7 +7580,7 @@ type ERC20MultiSigSignerAddedEdge struct { func (x *ERC20MultiSigSignerAddedEdge) Reset() { *x = ERC20MultiSigSignerAddedEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[104] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6932,7 +7593,7 @@ func (x *ERC20MultiSigSignerAddedEdge) String() string { func (*ERC20MultiSigSignerAddedEdge) ProtoMessage() {} func (x *ERC20MultiSigSignerAddedEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[104] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6945,7 +7606,7 @@ func (x *ERC20MultiSigSignerAddedEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigSignerAddedEdge.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerAddedEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{104} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{114} } func (x *ERC20MultiSigSignerAddedEdge) GetNode() *v1.ERC20MultiSigSignerAdded { @@ -6977,7 +7638,7 @@ type ERC20MultiSigSignerAddedBundleEdge struct { func (x *ERC20MultiSigSignerAddedBundleEdge) Reset() { *x = ERC20MultiSigSignerAddedBundleEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[105] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6990,7 +7651,7 @@ func (x *ERC20MultiSigSignerAddedBundleEdge) String() string { func (*ERC20MultiSigSignerAddedBundleEdge) ProtoMessage() {} func (x *ERC20MultiSigSignerAddedBundleEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[105] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7003,7 +7664,7 @@ func (x *ERC20MultiSigSignerAddedBundleEdge) ProtoReflect() protoreflect.Message // Deprecated: Use ERC20MultiSigSignerAddedBundleEdge.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerAddedBundleEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{105} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{115} } func (x *ERC20MultiSigSignerAddedBundleEdge) GetNode() *ERC20MultiSigSignerAddedBundle { @@ -7035,7 +7696,7 @@ type ERC20MultiSigSignerAddedConnection struct { func (x *ERC20MultiSigSignerAddedConnection) Reset() { *x = ERC20MultiSigSignerAddedConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[106] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7048,7 +7709,7 @@ func (x *ERC20MultiSigSignerAddedConnection) String() string { func (*ERC20MultiSigSignerAddedConnection) ProtoMessage() {} func (x *ERC20MultiSigSignerAddedConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[106] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7061,7 +7722,7 @@ func (x *ERC20MultiSigSignerAddedConnection) ProtoReflect() protoreflect.Message // Deprecated: Use ERC20MultiSigSignerAddedConnection.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerAddedConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{106} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{116} } func (x *ERC20MultiSigSignerAddedConnection) GetEdges() []*ERC20MultiSigSignerAddedBundleEdge { @@ -7103,7 +7764,7 @@ type ERC20MultiSigSignerAddedBundle struct { func (x *ERC20MultiSigSignerAddedBundle) Reset() { *x = ERC20MultiSigSignerAddedBundle{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[107] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7116,7 +7777,7 @@ func (x *ERC20MultiSigSignerAddedBundle) String() string { func (*ERC20MultiSigSignerAddedBundle) ProtoMessage() {} func (x *ERC20MultiSigSignerAddedBundle) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[107] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7129,7 +7790,7 @@ func (x *ERC20MultiSigSignerAddedBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigSignerAddedBundle.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerAddedBundle) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{107} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{117} } func (x *ERC20MultiSigSignerAddedBundle) GetNewSigner() string { @@ -7202,7 +7863,7 @@ type ListERC20MultiSigSignerRemovedBundlesRequest struct { func (x *ListERC20MultiSigSignerRemovedBundlesRequest) Reset() { *x = ListERC20MultiSigSignerRemovedBundlesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[108] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7215,7 +7876,7 @@ func (x *ListERC20MultiSigSignerRemovedBundlesRequest) String() string { func (*ListERC20MultiSigSignerRemovedBundlesRequest) ProtoMessage() {} func (x *ListERC20MultiSigSignerRemovedBundlesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[108] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7228,7 +7889,7 @@ func (x *ListERC20MultiSigSignerRemovedBundlesRequest) ProtoReflect() protorefle // Deprecated: Use ListERC20MultiSigSignerRemovedBundlesRequest.ProtoReflect.Descriptor instead. func (*ListERC20MultiSigSignerRemovedBundlesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{108} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{118} } func (x *ListERC20MultiSigSignerRemovedBundlesRequest) GetNodeId() string { @@ -7279,7 +7940,7 @@ type ListERC20MultiSigSignerRemovedBundlesResponse struct { func (x *ListERC20MultiSigSignerRemovedBundlesResponse) Reset() { *x = ListERC20MultiSigSignerRemovedBundlesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[109] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7292,7 +7953,7 @@ func (x *ListERC20MultiSigSignerRemovedBundlesResponse) String() string { func (*ListERC20MultiSigSignerRemovedBundlesResponse) ProtoMessage() {} func (x *ListERC20MultiSigSignerRemovedBundlesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[109] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7305,7 +7966,7 @@ func (x *ListERC20MultiSigSignerRemovedBundlesResponse) ProtoReflect() protorefl // Deprecated: Use ListERC20MultiSigSignerRemovedBundlesResponse.ProtoReflect.Descriptor instead. func (*ListERC20MultiSigSignerRemovedBundlesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{109} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{119} } func (x *ListERC20MultiSigSignerRemovedBundlesResponse) GetBundles() *ERC20MultiSigSignerRemovedConnection { @@ -7330,7 +7991,7 @@ type ERC20MultiSigSignerRemovedEdge struct { func (x *ERC20MultiSigSignerRemovedEdge) Reset() { *x = ERC20MultiSigSignerRemovedEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[110] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7343,7 +8004,7 @@ func (x *ERC20MultiSigSignerRemovedEdge) String() string { func (*ERC20MultiSigSignerRemovedEdge) ProtoMessage() {} func (x *ERC20MultiSigSignerRemovedEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[110] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7356,7 +8017,7 @@ func (x *ERC20MultiSigSignerRemovedEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigSignerRemovedEdge.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerRemovedEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{110} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{120} } func (x *ERC20MultiSigSignerRemovedEdge) GetNode() *v1.ERC20MultiSigSignerRemoved { @@ -7388,7 +8049,7 @@ type ERC20MultiSigSignerRemovedBundleEdge struct { func (x *ERC20MultiSigSignerRemovedBundleEdge) Reset() { *x = ERC20MultiSigSignerRemovedBundleEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[111] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7401,7 +8062,7 @@ func (x *ERC20MultiSigSignerRemovedBundleEdge) String() string { func (*ERC20MultiSigSignerRemovedBundleEdge) ProtoMessage() {} func (x *ERC20MultiSigSignerRemovedBundleEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[111] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7414,7 +8075,7 @@ func (x *ERC20MultiSigSignerRemovedBundleEdge) ProtoReflect() protoreflect.Messa // Deprecated: Use ERC20MultiSigSignerRemovedBundleEdge.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerRemovedBundleEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{111} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{121} } func (x *ERC20MultiSigSignerRemovedBundleEdge) GetNode() *ERC20MultiSigSignerRemovedBundle { @@ -7446,7 +8107,7 @@ type ERC20MultiSigSignerRemovedConnection struct { func (x *ERC20MultiSigSignerRemovedConnection) Reset() { *x = ERC20MultiSigSignerRemovedConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[112] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7459,7 +8120,7 @@ func (x *ERC20MultiSigSignerRemovedConnection) String() string { func (*ERC20MultiSigSignerRemovedConnection) ProtoMessage() {} func (x *ERC20MultiSigSignerRemovedConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[112] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7472,7 +8133,7 @@ func (x *ERC20MultiSigSignerRemovedConnection) ProtoReflect() protoreflect.Messa // Deprecated: Use ERC20MultiSigSignerRemovedConnection.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerRemovedConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{112} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{122} } func (x *ERC20MultiSigSignerRemovedConnection) GetEdges() []*ERC20MultiSigSignerRemovedBundleEdge { @@ -7514,7 +8175,7 @@ type ERC20MultiSigSignerRemovedBundle struct { func (x *ERC20MultiSigSignerRemovedBundle) Reset() { *x = ERC20MultiSigSignerRemovedBundle{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[113] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7527,7 +8188,7 @@ func (x *ERC20MultiSigSignerRemovedBundle) String() string { func (*ERC20MultiSigSignerRemovedBundle) ProtoMessage() {} func (x *ERC20MultiSigSignerRemovedBundle) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[113] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7540,7 +8201,7 @@ func (x *ERC20MultiSigSignerRemovedBundle) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigSignerRemovedBundle.ProtoReflect.Descriptor instead. func (*ERC20MultiSigSignerRemovedBundle) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{113} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{123} } func (x *ERC20MultiSigSignerRemovedBundle) GetOldSigner() string { @@ -7605,7 +8266,7 @@ type GetERC20ListAssetBundleRequest struct { func (x *GetERC20ListAssetBundleRequest) Reset() { *x = GetERC20ListAssetBundleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[114] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7618,7 +8279,7 @@ func (x *GetERC20ListAssetBundleRequest) String() string { func (*GetERC20ListAssetBundleRequest) ProtoMessage() {} func (x *GetERC20ListAssetBundleRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[114] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7631,7 +8292,7 @@ func (x *GetERC20ListAssetBundleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetERC20ListAssetBundleRequest.ProtoReflect.Descriptor instead. func (*GetERC20ListAssetBundleRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{114} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{124} } func (x *GetERC20ListAssetBundleRequest) GetAssetId() string { @@ -7661,7 +8322,7 @@ type GetERC20ListAssetBundleResponse struct { func (x *GetERC20ListAssetBundleResponse) Reset() { *x = GetERC20ListAssetBundleResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[115] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7674,7 +8335,7 @@ func (x *GetERC20ListAssetBundleResponse) String() string { func (*GetERC20ListAssetBundleResponse) ProtoMessage() {} func (x *GetERC20ListAssetBundleResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[115] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[125] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7687,7 +8348,7 @@ func (x *GetERC20ListAssetBundleResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetERC20ListAssetBundleResponse.ProtoReflect.Descriptor instead. func (*GetERC20ListAssetBundleResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{115} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{125} } func (x *GetERC20ListAssetBundleResponse) GetAssetSource() string { @@ -7731,7 +8392,7 @@ type GetERC20SetAssetLimitsBundleRequest struct { func (x *GetERC20SetAssetLimitsBundleRequest) Reset() { *x = GetERC20SetAssetLimitsBundleRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[116] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7744,7 +8405,7 @@ func (x *GetERC20SetAssetLimitsBundleRequest) String() string { func (*GetERC20SetAssetLimitsBundleRequest) ProtoMessage() {} func (x *GetERC20SetAssetLimitsBundleRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[116] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[126] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7757,7 +8418,7 @@ func (x *GetERC20SetAssetLimitsBundleRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use GetERC20SetAssetLimitsBundleRequest.ProtoReflect.Descriptor instead. func (*GetERC20SetAssetLimitsBundleRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{116} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{126} } func (x *GetERC20SetAssetLimitsBundleRequest) GetProposalId() string { @@ -7791,7 +8452,7 @@ type GetERC20SetAssetLimitsBundleResponse struct { func (x *GetERC20SetAssetLimitsBundleResponse) Reset() { *x = GetERC20SetAssetLimitsBundleResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[117] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7804,7 +8465,7 @@ func (x *GetERC20SetAssetLimitsBundleResponse) String() string { func (*GetERC20SetAssetLimitsBundleResponse) ProtoMessage() {} func (x *GetERC20SetAssetLimitsBundleResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[117] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[127] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7817,7 +8478,7 @@ func (x *GetERC20SetAssetLimitsBundleResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use GetERC20SetAssetLimitsBundleResponse.ProtoReflect.Descriptor instead. func (*GetERC20SetAssetLimitsBundleResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{117} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{127} } func (x *GetERC20SetAssetLimitsBundleResponse) GetAssetSource() string { @@ -7875,7 +8536,7 @@ type GetERC20WithdrawalApprovalRequest struct { func (x *GetERC20WithdrawalApprovalRequest) Reset() { *x = GetERC20WithdrawalApprovalRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[118] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7888,7 +8549,7 @@ func (x *GetERC20WithdrawalApprovalRequest) String() string { func (*GetERC20WithdrawalApprovalRequest) ProtoMessage() {} func (x *GetERC20WithdrawalApprovalRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[118] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[128] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7901,7 +8562,7 @@ func (x *GetERC20WithdrawalApprovalRequest) ProtoReflect() protoreflect.Message // Deprecated: Use GetERC20WithdrawalApprovalRequest.ProtoReflect.Descriptor instead. func (*GetERC20WithdrawalApprovalRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{118} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{128} } func (x *GetERC20WithdrawalApprovalRequest) GetWithdrawalId() string { @@ -7938,7 +8599,7 @@ type GetERC20WithdrawalApprovalResponse struct { func (x *GetERC20WithdrawalApprovalResponse) Reset() { *x = GetERC20WithdrawalApprovalResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[119] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7951,7 +8612,7 @@ func (x *GetERC20WithdrawalApprovalResponse) String() string { func (*GetERC20WithdrawalApprovalResponse) ProtoMessage() {} func (x *GetERC20WithdrawalApprovalResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[119] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[129] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7964,7 +8625,7 @@ func (x *GetERC20WithdrawalApprovalResponse) ProtoReflect() protoreflect.Message // Deprecated: Use GetERC20WithdrawalApprovalResponse.ProtoReflect.Descriptor instead. func (*GetERC20WithdrawalApprovalResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{119} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{129} } func (x *GetERC20WithdrawalApprovalResponse) GetAssetSource() string { @@ -8029,7 +8690,7 @@ type GetLastTradeRequest struct { func (x *GetLastTradeRequest) Reset() { *x = GetLastTradeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[120] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8042,7 +8703,7 @@ func (x *GetLastTradeRequest) String() string { func (*GetLastTradeRequest) ProtoMessage() {} func (x *GetLastTradeRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[120] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[130] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8055,7 +8716,7 @@ func (x *GetLastTradeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLastTradeRequest.ProtoReflect.Descriptor instead. func (*GetLastTradeRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{120} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{130} } func (x *GetLastTradeRequest) GetMarketId() string { @@ -8078,7 +8739,7 @@ type GetLastTradeResponse struct { func (x *GetLastTradeResponse) Reset() { *x = GetLastTradeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[121] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8091,7 +8752,7 @@ func (x *GetLastTradeResponse) String() string { func (*GetLastTradeResponse) ProtoMessage() {} func (x *GetLastTradeResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[121] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[131] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8104,7 +8765,7 @@ func (x *GetLastTradeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLastTradeResponse.ProtoReflect.Descriptor instead. func (*GetLastTradeResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{121} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{131} } func (x *GetLastTradeResponse) GetTrade() *vega.Trade { @@ -8135,7 +8796,7 @@ type ListTradesRequest struct { func (x *ListTradesRequest) Reset() { *x = ListTradesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[122] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8148,7 +8809,7 @@ func (x *ListTradesRequest) String() string { func (*ListTradesRequest) ProtoMessage() {} func (x *ListTradesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[122] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[132] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8161,7 +8822,7 @@ func (x *ListTradesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTradesRequest.ProtoReflect.Descriptor instead. func (*ListTradesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{122} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{132} } func (x *ListTradesRequest) GetMarketIds() []string { @@ -8212,7 +8873,7 @@ type ListTradesResponse struct { func (x *ListTradesResponse) Reset() { *x = ListTradesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[123] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8225,7 +8886,7 @@ func (x *ListTradesResponse) String() string { func (*ListTradesResponse) ProtoMessage() {} func (x *ListTradesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[123] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[133] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8238,7 +8899,7 @@ func (x *ListTradesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTradesResponse.ProtoReflect.Descriptor instead. func (*ListTradesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{123} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{133} } func (x *ListTradesResponse) GetTrades() *TradeConnection { @@ -8263,7 +8924,7 @@ type TradeConnection struct { func (x *TradeConnection) Reset() { *x = TradeConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[124] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8276,7 +8937,7 @@ func (x *TradeConnection) String() string { func (*TradeConnection) ProtoMessage() {} func (x *TradeConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[124] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[134] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8289,7 +8950,7 @@ func (x *TradeConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TradeConnection.ProtoReflect.Descriptor instead. func (*TradeConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{124} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{134} } func (x *TradeConnection) GetEdges() []*TradeEdge { @@ -8321,7 +8982,7 @@ type TradeEdge struct { func (x *TradeEdge) Reset() { *x = TradeEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[125] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8334,7 +8995,7 @@ func (x *TradeEdge) String() string { func (*TradeEdge) ProtoMessage() {} func (x *TradeEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[125] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[135] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8347,7 +9008,7 @@ func (x *TradeEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use TradeEdge.ProtoReflect.Descriptor instead. func (*TradeEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{125} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{135} } func (x *TradeEdge) GetNode() *vega.Trade { @@ -8379,7 +9040,7 @@ type ObserveTradesRequest struct { func (x *ObserveTradesRequest) Reset() { *x = ObserveTradesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[126] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8392,7 +9053,7 @@ func (x *ObserveTradesRequest) String() string { func (*ObserveTradesRequest) ProtoMessage() {} func (x *ObserveTradesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[126] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[136] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8405,7 +9066,7 @@ func (x *ObserveTradesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveTradesRequest.ProtoReflect.Descriptor instead. func (*ObserveTradesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{126} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{136} } func (x *ObserveTradesRequest) GetMarketIds() []string { @@ -8435,7 +9096,7 @@ type ObserveTradesResponse struct { func (x *ObserveTradesResponse) Reset() { *x = ObserveTradesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[127] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8448,7 +9109,7 @@ func (x *ObserveTradesResponse) String() string { func (*ObserveTradesResponse) ProtoMessage() {} func (x *ObserveTradesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[127] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[137] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8461,7 +9122,7 @@ func (x *ObserveTradesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveTradesResponse.ProtoReflect.Descriptor instead. func (*ObserveTradesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{127} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{137} } func (x *ObserveTradesResponse) GetTrades() []*vega.Trade { @@ -8484,7 +9145,7 @@ type GetOracleSpecRequest struct { func (x *GetOracleSpecRequest) Reset() { *x = GetOracleSpecRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[128] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8497,7 +9158,7 @@ func (x *GetOracleSpecRequest) String() string { func (*GetOracleSpecRequest) ProtoMessage() {} func (x *GetOracleSpecRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[128] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[138] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8510,7 +9171,7 @@ func (x *GetOracleSpecRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOracleSpecRequest.ProtoReflect.Descriptor instead. func (*GetOracleSpecRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{128} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{138} } func (x *GetOracleSpecRequest) GetOracleSpecId() string { @@ -8533,7 +9194,7 @@ type GetOracleSpecResponse struct { func (x *GetOracleSpecResponse) Reset() { *x = GetOracleSpecResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[129] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8546,7 +9207,7 @@ func (x *GetOracleSpecResponse) String() string { func (*GetOracleSpecResponse) ProtoMessage() {} func (x *GetOracleSpecResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[129] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[139] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8559,7 +9220,7 @@ func (x *GetOracleSpecResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOracleSpecResponse.ProtoReflect.Descriptor instead. func (*GetOracleSpecResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{129} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{139} } func (x *GetOracleSpecResponse) GetOracleSpec() *vega.OracleSpec { @@ -8582,7 +9243,7 @@ type ListOracleSpecsRequest struct { func (x *ListOracleSpecsRequest) Reset() { *x = ListOracleSpecsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[130] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8595,7 +9256,7 @@ func (x *ListOracleSpecsRequest) String() string { func (*ListOracleSpecsRequest) ProtoMessage() {} func (x *ListOracleSpecsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[130] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[140] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8608,7 +9269,7 @@ func (x *ListOracleSpecsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOracleSpecsRequest.ProtoReflect.Descriptor instead. func (*ListOracleSpecsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{130} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{140} } func (x *ListOracleSpecsRequest) GetPagination() *Pagination { @@ -8631,7 +9292,7 @@ type ListOracleSpecsResponse struct { func (x *ListOracleSpecsResponse) Reset() { *x = ListOracleSpecsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[131] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8644,7 +9305,7 @@ func (x *ListOracleSpecsResponse) String() string { func (*ListOracleSpecsResponse) ProtoMessage() {} func (x *ListOracleSpecsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[131] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[141] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8657,7 +9318,7 @@ func (x *ListOracleSpecsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOracleSpecsResponse.ProtoReflect.Descriptor instead. func (*ListOracleSpecsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{131} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{141} } func (x *ListOracleSpecsResponse) GetOracleSpecs() *OracleSpecsConnection { @@ -8682,7 +9343,7 @@ type ListOracleDataRequest struct { func (x *ListOracleDataRequest) Reset() { *x = ListOracleDataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[132] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8695,7 +9356,7 @@ func (x *ListOracleDataRequest) String() string { func (*ListOracleDataRequest) ProtoMessage() {} func (x *ListOracleDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[132] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[142] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8708,7 +9369,7 @@ func (x *ListOracleDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOracleDataRequest.ProtoReflect.Descriptor instead. func (*ListOracleDataRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{132} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{142} } func (x *ListOracleDataRequest) GetOracleSpecId() string { @@ -8738,7 +9399,7 @@ type ListOracleDataResponse struct { func (x *ListOracleDataResponse) Reset() { *x = ListOracleDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[133] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8751,7 +9412,7 @@ func (x *ListOracleDataResponse) String() string { func (*ListOracleDataResponse) ProtoMessage() {} func (x *ListOracleDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[133] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[143] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8764,7 +9425,7 @@ func (x *ListOracleDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOracleDataResponse.ProtoReflect.Descriptor instead. func (*ListOracleDataResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{133} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{143} } func (x *ListOracleDataResponse) GetOracleData() *OracleDataConnection { @@ -8789,7 +9450,7 @@ type OracleSpecEdge struct { func (x *OracleSpecEdge) Reset() { *x = OracleSpecEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[134] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8802,7 +9463,7 @@ func (x *OracleSpecEdge) String() string { func (*OracleSpecEdge) ProtoMessage() {} func (x *OracleSpecEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[134] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[144] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8815,7 +9476,7 @@ func (x *OracleSpecEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use OracleSpecEdge.ProtoReflect.Descriptor instead. func (*OracleSpecEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{134} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{144} } func (x *OracleSpecEdge) GetNode() *vega.OracleSpec { @@ -8847,7 +9508,7 @@ type OracleSpecsConnection struct { func (x *OracleSpecsConnection) Reset() { *x = OracleSpecsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[135] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8860,7 +9521,7 @@ func (x *OracleSpecsConnection) String() string { func (*OracleSpecsConnection) ProtoMessage() {} func (x *OracleSpecsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[135] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[145] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8873,7 +9534,7 @@ func (x *OracleSpecsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use OracleSpecsConnection.ProtoReflect.Descriptor instead. func (*OracleSpecsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{135} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{145} } func (x *OracleSpecsConnection) GetEdges() []*OracleSpecEdge { @@ -8905,7 +9566,7 @@ type OracleDataEdge struct { func (x *OracleDataEdge) Reset() { *x = OracleDataEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[136] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8918,7 +9579,7 @@ func (x *OracleDataEdge) String() string { func (*OracleDataEdge) ProtoMessage() {} func (x *OracleDataEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[136] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[146] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8931,7 +9592,7 @@ func (x *OracleDataEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use OracleDataEdge.ProtoReflect.Descriptor instead. func (*OracleDataEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{136} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{146} } func (x *OracleDataEdge) GetNode() *vega.OracleData { @@ -8963,7 +9624,7 @@ type OracleDataConnection struct { func (x *OracleDataConnection) Reset() { *x = OracleDataConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[137] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8976,7 +9637,7 @@ func (x *OracleDataConnection) String() string { func (*OracleDataConnection) ProtoMessage() {} func (x *OracleDataConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[137] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[147] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8989,7 +9650,7 @@ func (x *OracleDataConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use OracleDataConnection.ProtoReflect.Descriptor instead. func (*OracleDataConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{137} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{147} } func (x *OracleDataConnection) GetEdges() []*OracleDataEdge { @@ -9019,7 +9680,7 @@ type GetMarketRequest struct { func (x *GetMarketRequest) Reset() { *x = GetMarketRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[138] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9032,7 +9693,7 @@ func (x *GetMarketRequest) String() string { func (*GetMarketRequest) ProtoMessage() {} func (x *GetMarketRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[138] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[148] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9045,7 +9706,7 @@ func (x *GetMarketRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMarketRequest.ProtoReflect.Descriptor instead. func (*GetMarketRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{138} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{148} } func (x *GetMarketRequest) GetMarketId() string { @@ -9068,7 +9729,7 @@ type GetMarketResponse struct { func (x *GetMarketResponse) Reset() { *x = GetMarketResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[139] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9081,7 +9742,7 @@ func (x *GetMarketResponse) String() string { func (*GetMarketResponse) ProtoMessage() {} func (x *GetMarketResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[139] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[149] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9094,7 +9755,7 @@ func (x *GetMarketResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMarketResponse.ProtoReflect.Descriptor instead. func (*GetMarketResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{139} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{149} } func (x *GetMarketResponse) GetMarket() *vega.Market { @@ -9119,7 +9780,7 @@ type ListMarketsRequest struct { func (x *ListMarketsRequest) Reset() { *x = ListMarketsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[140] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9132,7 +9793,7 @@ func (x *ListMarketsRequest) String() string { func (*ListMarketsRequest) ProtoMessage() {} func (x *ListMarketsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[140] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[150] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9145,7 +9806,7 @@ func (x *ListMarketsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMarketsRequest.ProtoReflect.Descriptor instead. func (*ListMarketsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{140} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{150} } func (x *ListMarketsRequest) GetPagination() *Pagination { @@ -9175,7 +9836,7 @@ type ListMarketsResponse struct { func (x *ListMarketsResponse) Reset() { *x = ListMarketsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[141] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9188,7 +9849,7 @@ func (x *ListMarketsResponse) String() string { func (*ListMarketsResponse) ProtoMessage() {} func (x *ListMarketsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[141] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[151] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9201,7 +9862,7 @@ func (x *ListMarketsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMarketsResponse.ProtoReflect.Descriptor instead. func (*ListMarketsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{141} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{151} } func (x *ListMarketsResponse) GetMarkets() *MarketConnection { @@ -9226,7 +9887,7 @@ type MarketEdge struct { func (x *MarketEdge) Reset() { *x = MarketEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[142] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9239,7 +9900,7 @@ func (x *MarketEdge) String() string { func (*MarketEdge) ProtoMessage() {} func (x *MarketEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[142] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[152] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9252,7 +9913,7 @@ func (x *MarketEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketEdge.ProtoReflect.Descriptor instead. func (*MarketEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{142} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{152} } func (x *MarketEdge) GetNode() *vega.Market { @@ -9284,7 +9945,7 @@ type MarketConnection struct { func (x *MarketConnection) Reset() { *x = MarketConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[143] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9297,7 +9958,7 @@ func (x *MarketConnection) String() string { func (*MarketConnection) ProtoMessage() {} func (x *MarketConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[143] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[153] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9310,7 +9971,7 @@ func (x *MarketConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketConnection.ProtoReflect.Descriptor instead. func (*MarketConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{143} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{153} } func (x *MarketConnection) GetEdges() []*MarketEdge { @@ -9346,7 +10007,7 @@ type ListSuccessorMarketsRequest struct { func (x *ListSuccessorMarketsRequest) Reset() { *x = ListSuccessorMarketsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[144] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9359,7 +10020,7 @@ func (x *ListSuccessorMarketsRequest) String() string { func (*ListSuccessorMarketsRequest) ProtoMessage() {} func (x *ListSuccessorMarketsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[144] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[154] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9372,7 +10033,7 @@ func (x *ListSuccessorMarketsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSuccessorMarketsRequest.ProtoReflect.Descriptor instead. func (*ListSuccessorMarketsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{144} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{154} } func (x *ListSuccessorMarketsRequest) GetMarketId() string { @@ -9413,7 +10074,7 @@ type SuccessorMarket struct { func (x *SuccessorMarket) Reset() { *x = SuccessorMarket{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[145] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9426,7 +10087,7 @@ func (x *SuccessorMarket) String() string { func (*SuccessorMarket) ProtoMessage() {} func (x *SuccessorMarket) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[145] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[155] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9439,7 +10100,7 @@ func (x *SuccessorMarket) ProtoReflect() protoreflect.Message { // Deprecated: Use SuccessorMarket.ProtoReflect.Descriptor instead. func (*SuccessorMarket) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{145} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{155} } func (x *SuccessorMarket) GetMarket() *vega.Market { @@ -9471,7 +10132,7 @@ type SuccessorMarketEdge struct { func (x *SuccessorMarketEdge) Reset() { *x = SuccessorMarketEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[146] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9484,7 +10145,7 @@ func (x *SuccessorMarketEdge) String() string { func (*SuccessorMarketEdge) ProtoMessage() {} func (x *SuccessorMarketEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[146] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[156] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9497,7 +10158,7 @@ func (x *SuccessorMarketEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use SuccessorMarketEdge.ProtoReflect.Descriptor instead. func (*SuccessorMarketEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{146} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{156} } func (x *SuccessorMarketEdge) GetNode() *SuccessorMarket { @@ -9529,7 +10190,7 @@ type SuccessorMarketConnection struct { func (x *SuccessorMarketConnection) Reset() { *x = SuccessorMarketConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[147] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9542,7 +10203,7 @@ func (x *SuccessorMarketConnection) String() string { func (*SuccessorMarketConnection) ProtoMessage() {} func (x *SuccessorMarketConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[147] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[157] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9555,7 +10216,7 @@ func (x *SuccessorMarketConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use SuccessorMarketConnection.ProtoReflect.Descriptor instead. func (*SuccessorMarketConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{147} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{157} } func (x *SuccessorMarketConnection) GetEdges() []*SuccessorMarketEdge { @@ -9585,7 +10246,7 @@ type ListSuccessorMarketsResponse struct { func (x *ListSuccessorMarketsResponse) Reset() { *x = ListSuccessorMarketsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[148] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9598,7 +10259,7 @@ func (x *ListSuccessorMarketsResponse) String() string { func (*ListSuccessorMarketsResponse) ProtoMessage() {} func (x *ListSuccessorMarketsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[148] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[158] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9611,7 +10272,7 @@ func (x *ListSuccessorMarketsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSuccessorMarketsResponse.ProtoReflect.Descriptor instead. func (*ListSuccessorMarketsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{148} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{158} } func (x *ListSuccessorMarketsResponse) GetSuccessorMarkets() *SuccessorMarketConnection { @@ -9634,7 +10295,7 @@ type GetPartyRequest struct { func (x *GetPartyRequest) Reset() { *x = GetPartyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[149] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9647,7 +10308,7 @@ func (x *GetPartyRequest) String() string { func (*GetPartyRequest) ProtoMessage() {} func (x *GetPartyRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[149] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[159] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9660,7 +10321,7 @@ func (x *GetPartyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPartyRequest.ProtoReflect.Descriptor instead. func (*GetPartyRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{149} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{159} } func (x *GetPartyRequest) GetPartyId() string { @@ -9683,7 +10344,7 @@ type GetPartyResponse struct { func (x *GetPartyResponse) Reset() { *x = GetPartyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[150] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9696,7 +10357,7 @@ func (x *GetPartyResponse) String() string { func (*GetPartyResponse) ProtoMessage() {} func (x *GetPartyResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[150] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[160] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9709,7 +10370,7 @@ func (x *GetPartyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPartyResponse.ProtoReflect.Descriptor instead. func (*GetPartyResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{150} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{160} } func (x *GetPartyResponse) GetParty() *vega.Party { @@ -9734,7 +10395,7 @@ type ListPartiesRequest struct { func (x *ListPartiesRequest) Reset() { *x = ListPartiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[151] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9747,7 +10408,7 @@ func (x *ListPartiesRequest) String() string { func (*ListPartiesRequest) ProtoMessage() {} func (x *ListPartiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[151] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[161] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9760,7 +10421,7 @@ func (x *ListPartiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartiesRequest.ProtoReflect.Descriptor instead. func (*ListPartiesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{151} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{161} } func (x *ListPartiesRequest) GetPartyId() string { @@ -9790,7 +10451,7 @@ type ListPartiesResponse struct { func (x *ListPartiesResponse) Reset() { *x = ListPartiesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[152] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9803,7 +10464,7 @@ func (x *ListPartiesResponse) String() string { func (*ListPartiesResponse) ProtoMessage() {} func (x *ListPartiesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[152] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[162] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9816,7 +10477,7 @@ func (x *ListPartiesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartiesResponse.ProtoReflect.Descriptor instead. func (*ListPartiesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{152} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{162} } func (x *ListPartiesResponse) GetParties() *PartyConnection { @@ -9841,7 +10502,7 @@ type PartyEdge struct { func (x *PartyEdge) Reset() { *x = PartyEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[153] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9854,7 +10515,7 @@ func (x *PartyEdge) String() string { func (*PartyEdge) ProtoMessage() {} func (x *PartyEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[153] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[163] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9867,7 +10528,7 @@ func (x *PartyEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyEdge.ProtoReflect.Descriptor instead. func (*PartyEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{153} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{163} } func (x *PartyEdge) GetNode() *vega.Party { @@ -9899,7 +10560,7 @@ type PartyConnection struct { func (x *PartyConnection) Reset() { *x = PartyConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[154] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9912,7 +10573,7 @@ func (x *PartyConnection) String() string { func (*PartyConnection) ProtoMessage() {} func (x *PartyConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[154] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[164] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9925,7 +10586,7 @@ func (x *PartyConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyConnection.ProtoReflect.Descriptor instead. func (*PartyConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{154} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{164} } func (x *PartyConnection) GetEdges() []*PartyEdge { @@ -9958,7 +10619,7 @@ type ListPartiesProfilesRequest struct { func (x *ListPartiesProfilesRequest) Reset() { *x = ListPartiesProfilesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[155] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9971,7 +10632,7 @@ func (x *ListPartiesProfilesRequest) String() string { func (*ListPartiesProfilesRequest) ProtoMessage() {} func (x *ListPartiesProfilesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[155] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[165] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9984,7 +10645,7 @@ func (x *ListPartiesProfilesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartiesProfilesRequest.ProtoReflect.Descriptor instead. func (*ListPartiesProfilesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{155} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{165} } func (x *ListPartiesProfilesRequest) GetParties() []string { @@ -10014,7 +10675,7 @@ type ListPartiesProfilesResponse struct { func (x *ListPartiesProfilesResponse) Reset() { *x = ListPartiesProfilesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[156] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10027,7 +10688,7 @@ func (x *ListPartiesProfilesResponse) String() string { func (*ListPartiesProfilesResponse) ProtoMessage() {} func (x *ListPartiesProfilesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[156] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[166] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10040,7 +10701,7 @@ func (x *ListPartiesProfilesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartiesProfilesResponse.ProtoReflect.Descriptor instead. func (*ListPartiesProfilesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{156} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{166} } func (x *ListPartiesProfilesResponse) GetProfiles() *PartiesProfilesConnection { @@ -10065,7 +10726,7 @@ type PartyProfileEdge struct { func (x *PartyProfileEdge) Reset() { *x = PartyProfileEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[157] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10078,7 +10739,7 @@ func (x *PartyProfileEdge) String() string { func (*PartyProfileEdge) ProtoMessage() {} func (x *PartyProfileEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[157] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[167] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10091,7 +10752,7 @@ func (x *PartyProfileEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyProfileEdge.ProtoReflect.Descriptor instead. func (*PartyProfileEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{157} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{167} } func (x *PartyProfileEdge) GetNode() *vega.PartyProfile { @@ -10123,7 +10784,7 @@ type PartiesProfilesConnection struct { func (x *PartiesProfilesConnection) Reset() { *x = PartiesProfilesConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[158] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10136,7 +10797,7 @@ func (x *PartiesProfilesConnection) String() string { func (*PartiesProfilesConnection) ProtoMessage() {} func (x *PartiesProfilesConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[158] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[168] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10149,7 +10810,7 @@ func (x *PartiesProfilesConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use PartiesProfilesConnection.ProtoReflect.Descriptor instead. func (*PartiesProfilesConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{158} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{168} } func (x *PartiesProfilesConnection) GetEdges() []*PartyProfileEdge { @@ -10181,7 +10842,7 @@ type OrderEdge struct { func (x *OrderEdge) Reset() { *x = OrderEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[159] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10194,7 +10855,7 @@ func (x *OrderEdge) String() string { func (*OrderEdge) ProtoMessage() {} func (x *OrderEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[159] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[169] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10207,7 +10868,7 @@ func (x *OrderEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderEdge.ProtoReflect.Descriptor instead. func (*OrderEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{159} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{169} } func (x *OrderEdge) GetNode() *vega.Order { @@ -10241,7 +10902,7 @@ type ListMarginLevelsRequest struct { func (x *ListMarginLevelsRequest) Reset() { *x = ListMarginLevelsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[160] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10254,7 +10915,7 @@ func (x *ListMarginLevelsRequest) String() string { func (*ListMarginLevelsRequest) ProtoMessage() {} func (x *ListMarginLevelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[160] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[170] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10267,7 +10928,7 @@ func (x *ListMarginLevelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMarginLevelsRequest.ProtoReflect.Descriptor instead. func (*ListMarginLevelsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{160} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{170} } func (x *ListMarginLevelsRequest) GetPartyId() string { @@ -10304,7 +10965,7 @@ type ListMarginLevelsResponse struct { func (x *ListMarginLevelsResponse) Reset() { *x = ListMarginLevelsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[161] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10317,7 +10978,7 @@ func (x *ListMarginLevelsResponse) String() string { func (*ListMarginLevelsResponse) ProtoMessage() {} func (x *ListMarginLevelsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[161] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[171] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10330,7 +10991,7 @@ func (x *ListMarginLevelsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMarginLevelsResponse.ProtoReflect.Descriptor instead. func (*ListMarginLevelsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{161} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{171} } func (x *ListMarginLevelsResponse) GetMarginLevels() *MarginConnection { @@ -10357,7 +11018,7 @@ type ObserveMarginLevelsRequest struct { func (x *ObserveMarginLevelsRequest) Reset() { *x = ObserveMarginLevelsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[162] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10370,7 +11031,7 @@ func (x *ObserveMarginLevelsRequest) String() string { func (*ObserveMarginLevelsRequest) ProtoMessage() {} func (x *ObserveMarginLevelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[162] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[172] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10383,7 +11044,7 @@ func (x *ObserveMarginLevelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveMarginLevelsRequest.ProtoReflect.Descriptor instead. func (*ObserveMarginLevelsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{162} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{172} } func (x *ObserveMarginLevelsRequest) GetPartyId() string { @@ -10413,7 +11074,7 @@ type ObserveMarginLevelsResponse struct { func (x *ObserveMarginLevelsResponse) Reset() { *x = ObserveMarginLevelsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[163] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10426,7 +11087,7 @@ func (x *ObserveMarginLevelsResponse) String() string { func (*ObserveMarginLevelsResponse) ProtoMessage() {} func (x *ObserveMarginLevelsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[163] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[173] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10439,7 +11100,7 @@ func (x *ObserveMarginLevelsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveMarginLevelsResponse.ProtoReflect.Descriptor instead. func (*ObserveMarginLevelsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{163} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{173} } func (x *ObserveMarginLevelsResponse) GetMarginLevels() *vega.MarginLevels { @@ -10464,7 +11125,7 @@ type OrderConnection struct { func (x *OrderConnection) Reset() { *x = OrderConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[164] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10477,7 +11138,7 @@ func (x *OrderConnection) String() string { func (*OrderConnection) ProtoMessage() {} func (x *OrderConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[164] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[174] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10490,7 +11151,7 @@ func (x *OrderConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderConnection.ProtoReflect.Descriptor instead. func (*OrderConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{164} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{174} } func (x *OrderConnection) GetEdges() []*OrderEdge { @@ -10522,7 +11183,7 @@ type MarginEdge struct { func (x *MarginEdge) Reset() { *x = MarginEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[165] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10535,7 +11196,7 @@ func (x *MarginEdge) String() string { func (*MarginEdge) ProtoMessage() {} func (x *MarginEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[165] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[175] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10548,7 +11209,7 @@ func (x *MarginEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use MarginEdge.ProtoReflect.Descriptor instead. func (*MarginEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{165} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{175} } func (x *MarginEdge) GetNode() *vega.MarginLevels { @@ -10580,7 +11241,7 @@ type MarginConnection struct { func (x *MarginConnection) Reset() { *x = MarginConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[166] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10593,7 +11254,7 @@ func (x *MarginConnection) String() string { func (*MarginConnection) ProtoMessage() {} func (x *MarginConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[166] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[176] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10606,7 +11267,7 @@ func (x *MarginConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use MarginConnection.ProtoReflect.Descriptor instead. func (*MarginConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{166} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{176} } func (x *MarginConnection) GetEdges() []*MarginEdge { @@ -10643,12 +11304,16 @@ type ListRewardsRequest struct { TeamId *string `protobuf:"bytes,6,opt,name=team_id,json=teamId,proto3,oneof" json:"team_id,omitempty"` // Filter for rewards paid if the party participated in the given game GameId *string `protobuf:"bytes,7,opt,name=game_id,json=gameId,proto3,oneof" json:"game_id,omitempty"` + // Whether to return all derived parties from AMMs for the given party. + IncludeDerivedParties *bool `protobuf:"varint,8,opt,name=include_derived_parties,json=includeDerivedParties,proto3,oneof" json:"include_derived_parties,omitempty"` + // Filter the rewards by market ID. + MarketId *string `protobuf:"bytes,9,opt,name=market_id,json=marketId,proto3,oneof" json:"market_id,omitempty"` } func (x *ListRewardsRequest) Reset() { *x = ListRewardsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[167] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10661,7 +11326,7 @@ func (x *ListRewardsRequest) String() string { func (*ListRewardsRequest) ProtoMessage() {} func (x *ListRewardsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[167] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[177] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10674,7 +11339,7 @@ func (x *ListRewardsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRewardsRequest.ProtoReflect.Descriptor instead. func (*ListRewardsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{167} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{177} } func (x *ListRewardsRequest) GetPartyId() string { @@ -10726,6 +11391,20 @@ func (x *ListRewardsRequest) GetGameId() string { return "" } +func (x *ListRewardsRequest) GetIncludeDerivedParties() bool { + if x != nil && x.IncludeDerivedParties != nil { + return *x.IncludeDerivedParties + } + return false +} + +func (x *ListRewardsRequest) GetMarketId() string { + if x != nil && x.MarketId != nil { + return *x.MarketId + } + return "" +} + // Response for listing reward details for a single party type ListRewardsResponse struct { state protoimpl.MessageState @@ -10739,7 +11418,7 @@ type ListRewardsResponse struct { func (x *ListRewardsResponse) Reset() { *x = ListRewardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[168] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10752,7 +11431,7 @@ func (x *ListRewardsResponse) String() string { func (*ListRewardsResponse) ProtoMessage() {} func (x *ListRewardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[168] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[178] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10765,7 +11444,7 @@ func (x *ListRewardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRewardsResponse.ProtoReflect.Descriptor instead. func (*ListRewardsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{168} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{178} } func (x *ListRewardsResponse) GetRewards() *RewardsConnection { @@ -10790,7 +11469,7 @@ type RewardEdge struct { func (x *RewardEdge) Reset() { *x = RewardEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[169] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10803,7 +11482,7 @@ func (x *RewardEdge) String() string { func (*RewardEdge) ProtoMessage() {} func (x *RewardEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[169] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[179] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10816,7 +11495,7 @@ func (x *RewardEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardEdge.ProtoReflect.Descriptor instead. func (*RewardEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{169} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{179} } func (x *RewardEdge) GetNode() *vega.Reward { @@ -10848,7 +11527,7 @@ type RewardsConnection struct { func (x *RewardsConnection) Reset() { *x = RewardsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[170] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10861,7 +11540,7 @@ func (x *RewardsConnection) String() string { func (*RewardsConnection) ProtoMessage() {} func (x *RewardsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[170] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[180] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10874,7 +11553,7 @@ func (x *RewardsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardsConnection.ProtoReflect.Descriptor instead. func (*RewardsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{170} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{180} } func (x *RewardsConnection) GetEdges() []*RewardEdge { @@ -10903,12 +11582,15 @@ type ListRewardSummariesRequest struct { AssetId *string `protobuf:"bytes,2,opt,name=asset_id,json=assetId,proto3,oneof" json:"asset_id,omitempty"` // Pagination controls. Pagination *Pagination `protobuf:"bytes,3,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` + // Whether to return rewards for all derived parties from AMMs for the given party. + // If used, party ID is required. + IncludeDerivedParties *bool `protobuf:"varint,8,opt,name=include_derived_parties,json=includeDerivedParties,proto3,oneof" json:"include_derived_parties,omitempty"` } func (x *ListRewardSummariesRequest) Reset() { *x = ListRewardSummariesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[171] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10921,7 +11603,7 @@ func (x *ListRewardSummariesRequest) String() string { func (*ListRewardSummariesRequest) ProtoMessage() {} func (x *ListRewardSummariesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[171] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[181] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10934,7 +11616,7 @@ func (x *ListRewardSummariesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRewardSummariesRequest.ProtoReflect.Descriptor instead. func (*ListRewardSummariesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{171} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{181} } func (x *ListRewardSummariesRequest) GetPartyId() string { @@ -10958,6 +11640,13 @@ func (x *ListRewardSummariesRequest) GetPagination() *Pagination { return nil } +func (x *ListRewardSummariesRequest) GetIncludeDerivedParties() bool { + if x != nil && x.IncludeDerivedParties != nil { + return *x.IncludeDerivedParties + } + return false +} + // Response from listing reward details in for a single party type ListRewardSummariesResponse struct { state protoimpl.MessageState @@ -10971,7 +11660,7 @@ type ListRewardSummariesResponse struct { func (x *ListRewardSummariesResponse) Reset() { *x = ListRewardSummariesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[172] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10984,7 +11673,7 @@ func (x *ListRewardSummariesResponse) String() string { func (*ListRewardSummariesResponse) ProtoMessage() {} func (x *ListRewardSummariesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[172] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[182] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10997,7 +11686,7 @@ func (x *ListRewardSummariesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRewardSummariesResponse.ProtoReflect.Descriptor instead. func (*ListRewardSummariesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{172} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{182} } func (x *ListRewardSummariesResponse) GetSummaries() []*vega.RewardSummary { @@ -11026,7 +11715,7 @@ type RewardSummaryFilter struct { func (x *RewardSummaryFilter) Reset() { *x = RewardSummaryFilter{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[173] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11039,7 +11728,7 @@ func (x *RewardSummaryFilter) String() string { func (*RewardSummaryFilter) ProtoMessage() {} func (x *RewardSummaryFilter) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[173] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[183] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11052,7 +11741,7 @@ func (x *RewardSummaryFilter) ProtoReflect() protoreflect.Message { // Deprecated: Use RewardSummaryFilter.ProtoReflect.Descriptor instead. func (*RewardSummaryFilter) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{173} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{183} } func (x *RewardSummaryFilter) GetAssetIds() []string { @@ -11098,7 +11787,7 @@ type ListEpochRewardSummariesRequest struct { func (x *ListEpochRewardSummariesRequest) Reset() { *x = ListEpochRewardSummariesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[174] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11111,7 +11800,7 @@ func (x *ListEpochRewardSummariesRequest) String() string { func (*ListEpochRewardSummariesRequest) ProtoMessage() {} func (x *ListEpochRewardSummariesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[174] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[184] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11124,7 +11813,7 @@ func (x *ListEpochRewardSummariesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEpochRewardSummariesRequest.ProtoReflect.Descriptor instead. func (*ListEpochRewardSummariesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{174} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{184} } func (x *ListEpochRewardSummariesRequest) GetFilter() *RewardSummaryFilter { @@ -11154,7 +11843,7 @@ type ListEpochRewardSummariesResponse struct { func (x *ListEpochRewardSummariesResponse) Reset() { *x = ListEpochRewardSummariesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[175] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11167,7 +11856,7 @@ func (x *ListEpochRewardSummariesResponse) String() string { func (*ListEpochRewardSummariesResponse) ProtoMessage() {} func (x *ListEpochRewardSummariesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[175] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[185] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11180,7 +11869,7 @@ func (x *ListEpochRewardSummariesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEpochRewardSummariesResponse.ProtoReflect.Descriptor instead. func (*ListEpochRewardSummariesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{175} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{185} } func (x *ListEpochRewardSummariesResponse) GetSummaries() *EpochRewardSummaryConnection { @@ -11205,7 +11894,7 @@ type EpochRewardSummaryConnection struct { func (x *EpochRewardSummaryConnection) Reset() { *x = EpochRewardSummaryConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[176] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11218,7 +11907,7 @@ func (x *EpochRewardSummaryConnection) String() string { func (*EpochRewardSummaryConnection) ProtoMessage() {} func (x *EpochRewardSummaryConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[176] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[186] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11231,7 +11920,7 @@ func (x *EpochRewardSummaryConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochRewardSummaryConnection.ProtoReflect.Descriptor instead. func (*EpochRewardSummaryConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{176} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{186} } func (x *EpochRewardSummaryConnection) GetEdges() []*EpochRewardSummaryEdge { @@ -11263,7 +11952,7 @@ type EpochRewardSummaryEdge struct { func (x *EpochRewardSummaryEdge) Reset() { *x = EpochRewardSummaryEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[177] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11276,7 +11965,7 @@ func (x *EpochRewardSummaryEdge) String() string { func (*EpochRewardSummaryEdge) ProtoMessage() {} func (x *EpochRewardSummaryEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[177] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[187] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11289,7 +11978,7 @@ func (x *EpochRewardSummaryEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use EpochRewardSummaryEdge.ProtoReflect.Descriptor instead. func (*EpochRewardSummaryEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{177} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{187} } func (x *EpochRewardSummaryEdge) GetNode() *vega.EpochRewardSummary { @@ -11321,7 +12010,7 @@ type ObserveRewardsRequest struct { func (x *ObserveRewardsRequest) Reset() { *x = ObserveRewardsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[178] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11334,7 +12023,7 @@ func (x *ObserveRewardsRequest) String() string { func (*ObserveRewardsRequest) ProtoMessage() {} func (x *ObserveRewardsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[178] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[188] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11347,7 +12036,7 @@ func (x *ObserveRewardsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveRewardsRequest.ProtoReflect.Descriptor instead. func (*ObserveRewardsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{178} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{188} } func (x *ObserveRewardsRequest) GetAssetId() string { @@ -11377,7 +12066,7 @@ type ObserveRewardsResponse struct { func (x *ObserveRewardsResponse) Reset() { *x = ObserveRewardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[179] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11390,7 +12079,7 @@ func (x *ObserveRewardsResponse) String() string { func (*ObserveRewardsResponse) ProtoMessage() {} func (x *ObserveRewardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[179] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[189] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11403,7 +12092,7 @@ func (x *ObserveRewardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveRewardsResponse.ProtoReflect.Descriptor instead. func (*ObserveRewardsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{179} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{189} } func (x *ObserveRewardsResponse) GetReward() *vega.Reward { @@ -11426,7 +12115,7 @@ type GetDepositRequest struct { func (x *GetDepositRequest) Reset() { *x = GetDepositRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[180] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11439,7 +12128,7 @@ func (x *GetDepositRequest) String() string { func (*GetDepositRequest) ProtoMessage() {} func (x *GetDepositRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[180] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[190] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11452,7 +12141,7 @@ func (x *GetDepositRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDepositRequest.ProtoReflect.Descriptor instead. func (*GetDepositRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{180} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{190} } func (x *GetDepositRequest) GetId() string { @@ -11475,7 +12164,7 @@ type GetDepositResponse struct { func (x *GetDepositResponse) Reset() { *x = GetDepositResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[181] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11488,7 +12177,7 @@ func (x *GetDepositResponse) String() string { func (*GetDepositResponse) ProtoMessage() {} func (x *GetDepositResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[181] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[191] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11501,7 +12190,7 @@ func (x *GetDepositResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDepositResponse.ProtoReflect.Descriptor instead. func (*GetDepositResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{181} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{191} } func (x *GetDepositResponse) GetDeposit() *vega.Deposit { @@ -11528,7 +12217,7 @@ type ListDepositsRequest struct { func (x *ListDepositsRequest) Reset() { *x = ListDepositsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[182] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11541,7 +12230,7 @@ func (x *ListDepositsRequest) String() string { func (*ListDepositsRequest) ProtoMessage() {} func (x *ListDepositsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[182] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[192] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11554,7 +12243,7 @@ func (x *ListDepositsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDepositsRequest.ProtoReflect.Descriptor instead. func (*ListDepositsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{182} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{192} } func (x *ListDepositsRequest) GetPartyId() string { @@ -11591,7 +12280,7 @@ type ListDepositsResponse struct { func (x *ListDepositsResponse) Reset() { *x = ListDepositsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[183] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11604,7 +12293,7 @@ func (x *ListDepositsResponse) String() string { func (*ListDepositsResponse) ProtoMessage() {} func (x *ListDepositsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[183] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[193] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11617,7 +12306,7 @@ func (x *ListDepositsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDepositsResponse.ProtoReflect.Descriptor instead. func (*ListDepositsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{183} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{193} } func (x *ListDepositsResponse) GetDeposits() *DepositsConnection { @@ -11642,7 +12331,7 @@ type DepositEdge struct { func (x *DepositEdge) Reset() { *x = DepositEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[184] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11655,7 +12344,7 @@ func (x *DepositEdge) String() string { func (*DepositEdge) ProtoMessage() {} func (x *DepositEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[184] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[194] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11668,7 +12357,7 @@ func (x *DepositEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use DepositEdge.ProtoReflect.Descriptor instead. func (*DepositEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{184} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{194} } func (x *DepositEdge) GetNode() *vega.Deposit { @@ -11700,7 +12389,7 @@ type DepositsConnection struct { func (x *DepositsConnection) Reset() { *x = DepositsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[185] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11713,7 +12402,7 @@ func (x *DepositsConnection) String() string { func (*DepositsConnection) ProtoMessage() {} func (x *DepositsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[185] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[195] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11726,7 +12415,7 @@ func (x *DepositsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use DepositsConnection.ProtoReflect.Descriptor instead. func (*DepositsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{185} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{195} } func (x *DepositsConnection) GetEdges() []*DepositEdge { @@ -11756,7 +12445,7 @@ type GetWithdrawalRequest struct { func (x *GetWithdrawalRequest) Reset() { *x = GetWithdrawalRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[186] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[196] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11769,7 +12458,7 @@ func (x *GetWithdrawalRequest) String() string { func (*GetWithdrawalRequest) ProtoMessage() {} func (x *GetWithdrawalRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[186] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[196] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11782,7 +12471,7 @@ func (x *GetWithdrawalRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWithdrawalRequest.ProtoReflect.Descriptor instead. func (*GetWithdrawalRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{186} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{196} } func (x *GetWithdrawalRequest) GetId() string { @@ -11805,7 +12494,7 @@ type GetWithdrawalResponse struct { func (x *GetWithdrawalResponse) Reset() { *x = GetWithdrawalResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[187] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[197] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11818,7 +12507,7 @@ func (x *GetWithdrawalResponse) String() string { func (*GetWithdrawalResponse) ProtoMessage() {} func (x *GetWithdrawalResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[187] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[197] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11831,7 +12520,7 @@ func (x *GetWithdrawalResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWithdrawalResponse.ProtoReflect.Descriptor instead. func (*GetWithdrawalResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{187} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{197} } func (x *GetWithdrawalResponse) GetWithdrawal() *vega.Withdrawal { @@ -11858,7 +12547,7 @@ type ListWithdrawalsRequest struct { func (x *ListWithdrawalsRequest) Reset() { *x = ListWithdrawalsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[188] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[198] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11871,7 +12560,7 @@ func (x *ListWithdrawalsRequest) String() string { func (*ListWithdrawalsRequest) ProtoMessage() {} func (x *ListWithdrawalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[188] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[198] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11884,7 +12573,7 @@ func (x *ListWithdrawalsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWithdrawalsRequest.ProtoReflect.Descriptor instead. func (*ListWithdrawalsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{188} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{198} } func (x *ListWithdrawalsRequest) GetPartyId() string { @@ -11921,7 +12610,7 @@ type ListWithdrawalsResponse struct { func (x *ListWithdrawalsResponse) Reset() { *x = ListWithdrawalsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[189] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[199] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11934,7 +12623,7 @@ func (x *ListWithdrawalsResponse) String() string { func (*ListWithdrawalsResponse) ProtoMessage() {} func (x *ListWithdrawalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[189] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[199] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11947,7 +12636,7 @@ func (x *ListWithdrawalsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWithdrawalsResponse.ProtoReflect.Descriptor instead. func (*ListWithdrawalsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{189} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{199} } func (x *ListWithdrawalsResponse) GetWithdrawals() *WithdrawalsConnection { @@ -11972,7 +12661,7 @@ type WithdrawalEdge struct { func (x *WithdrawalEdge) Reset() { *x = WithdrawalEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[190] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[200] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11985,7 +12674,7 @@ func (x *WithdrawalEdge) String() string { func (*WithdrawalEdge) ProtoMessage() {} func (x *WithdrawalEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[190] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[200] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11998,7 +12687,7 @@ func (x *WithdrawalEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawalEdge.ProtoReflect.Descriptor instead. func (*WithdrawalEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{190} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{200} } func (x *WithdrawalEdge) GetNode() *vega.Withdrawal { @@ -12030,7 +12719,7 @@ type WithdrawalsConnection struct { func (x *WithdrawalsConnection) Reset() { *x = WithdrawalsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[191] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[201] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12043,7 +12732,7 @@ func (x *WithdrawalsConnection) String() string { func (*WithdrawalsConnection) ProtoMessage() {} func (x *WithdrawalsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[191] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[201] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12056,7 +12745,7 @@ func (x *WithdrawalsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use WithdrawalsConnection.ProtoReflect.Descriptor instead. func (*WithdrawalsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{191} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{201} } func (x *WithdrawalsConnection) GetEdges() []*WithdrawalEdge { @@ -12086,7 +12775,7 @@ type GetAssetRequest struct { func (x *GetAssetRequest) Reset() { *x = GetAssetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[192] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[202] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12099,7 +12788,7 @@ func (x *GetAssetRequest) String() string { func (*GetAssetRequest) ProtoMessage() {} func (x *GetAssetRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[192] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[202] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12112,7 +12801,7 @@ func (x *GetAssetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAssetRequest.ProtoReflect.Descriptor instead. func (*GetAssetRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{192} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{202} } func (x *GetAssetRequest) GetAssetId() string { @@ -12135,7 +12824,7 @@ type GetAssetResponse struct { func (x *GetAssetResponse) Reset() { *x = GetAssetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[193] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[203] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12148,7 +12837,7 @@ func (x *GetAssetResponse) String() string { func (*GetAssetResponse) ProtoMessage() {} func (x *GetAssetResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[193] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[203] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12161,7 +12850,7 @@ func (x *GetAssetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAssetResponse.ProtoReflect.Descriptor instead. func (*GetAssetResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{193} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{203} } func (x *GetAssetResponse) GetAsset() *vega.Asset { @@ -12186,7 +12875,7 @@ type ListAssetsRequest struct { func (x *ListAssetsRequest) Reset() { *x = ListAssetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[194] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[204] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12199,7 +12888,7 @@ func (x *ListAssetsRequest) String() string { func (*ListAssetsRequest) ProtoMessage() {} func (x *ListAssetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[194] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[204] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12212,7 +12901,7 @@ func (x *ListAssetsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAssetsRequest.ProtoReflect.Descriptor instead. func (*ListAssetsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{194} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{204} } func (x *ListAssetsRequest) GetAssetId() string { @@ -12242,7 +12931,7 @@ type ListAssetsResponse struct { func (x *ListAssetsResponse) Reset() { *x = ListAssetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[195] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[205] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12255,7 +12944,7 @@ func (x *ListAssetsResponse) String() string { func (*ListAssetsResponse) ProtoMessage() {} func (x *ListAssetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[195] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[205] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12268,7 +12957,7 @@ func (x *ListAssetsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAssetsResponse.ProtoReflect.Descriptor instead. func (*ListAssetsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{195} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{205} } func (x *ListAssetsResponse) GetAssets() *AssetsConnection { @@ -12293,7 +12982,7 @@ type AssetEdge struct { func (x *AssetEdge) Reset() { *x = AssetEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[196] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[206] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12306,7 +12995,7 @@ func (x *AssetEdge) String() string { func (*AssetEdge) ProtoMessage() {} func (x *AssetEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[196] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[206] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12319,7 +13008,7 @@ func (x *AssetEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetEdge.ProtoReflect.Descriptor instead. func (*AssetEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{196} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{206} } func (x *AssetEdge) GetNode() *vega.Asset { @@ -12351,7 +13040,7 @@ type AssetsConnection struct { func (x *AssetsConnection) Reset() { *x = AssetsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[197] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[207] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12364,7 +13053,7 @@ func (x *AssetsConnection) String() string { func (*AssetsConnection) ProtoMessage() {} func (x *AssetsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[197] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[207] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12377,7 +13066,7 @@ func (x *AssetsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetsConnection.ProtoReflect.Descriptor instead. func (*AssetsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{197} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{207} } func (x *AssetsConnection) GetEdges() []*AssetEdge { @@ -12415,7 +13104,7 @@ type ListLiquidityProvisionsRequest struct { func (x *ListLiquidityProvisionsRequest) Reset() { *x = ListLiquidityProvisionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[198] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[208] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12428,7 +13117,7 @@ func (x *ListLiquidityProvisionsRequest) String() string { func (*ListLiquidityProvisionsRequest) ProtoMessage() {} func (x *ListLiquidityProvisionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[198] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[208] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12441,7 +13130,7 @@ func (x *ListLiquidityProvisionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLiquidityProvisionsRequest.ProtoReflect.Descriptor instead. func (*ListLiquidityProvisionsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{198} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{208} } func (x *ListLiquidityProvisionsRequest) GetMarketId() string { @@ -12500,7 +13189,7 @@ type ListAllLiquidityProvisionsRequest struct { func (x *ListAllLiquidityProvisionsRequest) Reset() { *x = ListAllLiquidityProvisionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[199] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[209] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12513,7 +13202,7 @@ func (x *ListAllLiquidityProvisionsRequest) String() string { func (*ListAllLiquidityProvisionsRequest) ProtoMessage() {} func (x *ListAllLiquidityProvisionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[199] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[209] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12526,7 +13215,7 @@ func (x *ListAllLiquidityProvisionsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ListAllLiquidityProvisionsRequest.ProtoReflect.Descriptor instead. func (*ListAllLiquidityProvisionsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{199} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{209} } func (x *ListAllLiquidityProvisionsRequest) GetMarketId() string { @@ -12577,7 +13266,7 @@ type ListLiquidityProvisionsResponse struct { func (x *ListLiquidityProvisionsResponse) Reset() { *x = ListLiquidityProvisionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[200] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[210] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12590,7 +13279,7 @@ func (x *ListLiquidityProvisionsResponse) String() string { func (*ListLiquidityProvisionsResponse) ProtoMessage() {} func (x *ListLiquidityProvisionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[200] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[210] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12603,7 +13292,7 @@ func (x *ListLiquidityProvisionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLiquidityProvisionsResponse.ProtoReflect.Descriptor instead. func (*ListLiquidityProvisionsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{200} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{210} } func (x *ListLiquidityProvisionsResponse) GetLiquidityProvisions() *LiquidityProvisionsConnection { @@ -12626,7 +13315,7 @@ type ListAllLiquidityProvisionsResponse struct { func (x *ListAllLiquidityProvisionsResponse) Reset() { *x = ListAllLiquidityProvisionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[201] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[211] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12639,7 +13328,7 @@ func (x *ListAllLiquidityProvisionsResponse) String() string { func (*ListAllLiquidityProvisionsResponse) ProtoMessage() {} func (x *ListAllLiquidityProvisionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[201] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[211] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12652,7 +13341,7 @@ func (x *ListAllLiquidityProvisionsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ListAllLiquidityProvisionsResponse.ProtoReflect.Descriptor instead. func (*ListAllLiquidityProvisionsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{201} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{211} } func (x *ListAllLiquidityProvisionsResponse) GetLiquidityProvisions() *LiquidityProvisionsWithPendingConnection { @@ -12679,7 +13368,7 @@ type LiquidityProvision struct { func (x *LiquidityProvision) Reset() { *x = LiquidityProvision{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[202] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[212] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12692,7 +13381,7 @@ func (x *LiquidityProvision) String() string { func (*LiquidityProvision) ProtoMessage() {} func (x *LiquidityProvision) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[202] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[212] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12705,7 +13394,7 @@ func (x *LiquidityProvision) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityProvision.ProtoReflect.Descriptor instead. func (*LiquidityProvision) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{202} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{212} } func (x *LiquidityProvision) GetCurrent() *vega.LiquidityProvision { @@ -12737,7 +13426,7 @@ type LiquidityProvisionsEdge struct { func (x *LiquidityProvisionsEdge) Reset() { *x = LiquidityProvisionsEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[203] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[213] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12750,7 +13439,7 @@ func (x *LiquidityProvisionsEdge) String() string { func (*LiquidityProvisionsEdge) ProtoMessage() {} func (x *LiquidityProvisionsEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[203] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[213] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12763,7 +13452,7 @@ func (x *LiquidityProvisionsEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityProvisionsEdge.ProtoReflect.Descriptor instead. func (*LiquidityProvisionsEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{203} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{213} } func (x *LiquidityProvisionsEdge) GetNode() *vega.LiquidityProvision { @@ -12795,7 +13484,7 @@ type LiquidityProvisionWithPendingEdge struct { func (x *LiquidityProvisionWithPendingEdge) Reset() { *x = LiquidityProvisionWithPendingEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[204] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[214] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12808,7 +13497,7 @@ func (x *LiquidityProvisionWithPendingEdge) String() string { func (*LiquidityProvisionWithPendingEdge) ProtoMessage() {} func (x *LiquidityProvisionWithPendingEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[204] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[214] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12821,7 +13510,7 @@ func (x *LiquidityProvisionWithPendingEdge) ProtoReflect() protoreflect.Message // Deprecated: Use LiquidityProvisionWithPendingEdge.ProtoReflect.Descriptor instead. func (*LiquidityProvisionWithPendingEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{204} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{214} } func (x *LiquidityProvisionWithPendingEdge) GetNode() *LiquidityProvision { @@ -12853,7 +13542,7 @@ type LiquidityProvisionsConnection struct { func (x *LiquidityProvisionsConnection) Reset() { *x = LiquidityProvisionsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[205] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[215] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12866,7 +13555,7 @@ func (x *LiquidityProvisionsConnection) String() string { func (*LiquidityProvisionsConnection) ProtoMessage() {} func (x *LiquidityProvisionsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[205] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[215] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12879,7 +13568,7 @@ func (x *LiquidityProvisionsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityProvisionsConnection.ProtoReflect.Descriptor instead. func (*LiquidityProvisionsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{205} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{215} } func (x *LiquidityProvisionsConnection) GetEdges() []*LiquidityProvisionsEdge { @@ -12911,7 +13600,7 @@ type LiquidityProvisionsWithPendingConnection struct { func (x *LiquidityProvisionsWithPendingConnection) Reset() { *x = LiquidityProvisionsWithPendingConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[206] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[216] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12924,7 +13613,7 @@ func (x *LiquidityProvisionsWithPendingConnection) String() string { func (*LiquidityProvisionsWithPendingConnection) ProtoMessage() {} func (x *LiquidityProvisionsWithPendingConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[206] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[216] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12937,7 +13626,7 @@ func (x *LiquidityProvisionsWithPendingConnection) ProtoReflect() protoreflect.M // Deprecated: Use LiquidityProvisionsWithPendingConnection.ProtoReflect.Descriptor instead. func (*LiquidityProvisionsWithPendingConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{206} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{216} } func (x *LiquidityProvisionsWithPendingConnection) GetEdges() []*LiquidityProvisionWithPendingEdge { @@ -12969,7 +13658,7 @@ type ObserveLiquidityProvisionsRequest struct { func (x *ObserveLiquidityProvisionsRequest) Reset() { *x = ObserveLiquidityProvisionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[207] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[217] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12982,7 +13671,7 @@ func (x *ObserveLiquidityProvisionsRequest) String() string { func (*ObserveLiquidityProvisionsRequest) ProtoMessage() {} func (x *ObserveLiquidityProvisionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[207] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[217] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12995,7 +13684,7 @@ func (x *ObserveLiquidityProvisionsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ObserveLiquidityProvisionsRequest.ProtoReflect.Descriptor instead. func (*ObserveLiquidityProvisionsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{207} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{217} } func (x *ObserveLiquidityProvisionsRequest) GetMarketId() string { @@ -13024,7 +13713,7 @@ type ObserveLiquidityProvisionsResponse struct { func (x *ObserveLiquidityProvisionsResponse) Reset() { *x = ObserveLiquidityProvisionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[208] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[218] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13037,7 +13726,7 @@ func (x *ObserveLiquidityProvisionsResponse) String() string { func (*ObserveLiquidityProvisionsResponse) ProtoMessage() {} func (x *ObserveLiquidityProvisionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[208] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[218] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13050,7 +13739,7 @@ func (x *ObserveLiquidityProvisionsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ObserveLiquidityProvisionsResponse.ProtoReflect.Descriptor instead. func (*ObserveLiquidityProvisionsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{208} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{218} } func (x *ObserveLiquidityProvisionsResponse) GetLiquidityProvisions() []*vega.LiquidityProvision { @@ -13078,7 +13767,7 @@ type ListLiquidityProvidersRequest struct { func (x *ListLiquidityProvidersRequest) Reset() { *x = ListLiquidityProvidersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[209] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[219] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13091,7 +13780,7 @@ func (x *ListLiquidityProvidersRequest) String() string { func (*ListLiquidityProvidersRequest) ProtoMessage() {} func (x *ListLiquidityProvidersRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[209] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[219] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13104,7 +13793,7 @@ func (x *ListLiquidityProvidersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLiquidityProvidersRequest.ProtoReflect.Descriptor instead. func (*ListLiquidityProvidersRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{209} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{219} } func (x *ListLiquidityProvidersRequest) GetMarketId() string { @@ -13148,7 +13837,7 @@ type LiquidityProvider struct { func (x *LiquidityProvider) Reset() { *x = LiquidityProvider{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[210] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[220] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13161,7 +13850,7 @@ func (x *LiquidityProvider) String() string { func (*LiquidityProvider) ProtoMessage() {} func (x *LiquidityProvider) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[210] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[220] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13174,7 +13863,7 @@ func (x *LiquidityProvider) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityProvider.ProtoReflect.Descriptor instead. func (*LiquidityProvider) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{210} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{220} } func (x *LiquidityProvider) GetPartyId() string { @@ -13220,7 +13909,7 @@ type LiquidityProviderEdge struct { func (x *LiquidityProviderEdge) Reset() { *x = LiquidityProviderEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[211] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[221] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13233,7 +13922,7 @@ func (x *LiquidityProviderEdge) String() string { func (*LiquidityProviderEdge) ProtoMessage() {} func (x *LiquidityProviderEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[211] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[221] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13246,7 +13935,7 @@ func (x *LiquidityProviderEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityProviderEdge.ProtoReflect.Descriptor instead. func (*LiquidityProviderEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{211} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{221} } func (x *LiquidityProviderEdge) GetNode() *LiquidityProvider { @@ -13278,7 +13967,7 @@ type LiquidityProviderConnection struct { func (x *LiquidityProviderConnection) Reset() { *x = LiquidityProviderConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[212] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[222] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13291,7 +13980,7 @@ func (x *LiquidityProviderConnection) String() string { func (*LiquidityProviderConnection) ProtoMessage() {} func (x *LiquidityProviderConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[212] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[222] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13304,7 +13993,7 @@ func (x *LiquidityProviderConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityProviderConnection.ProtoReflect.Descriptor instead. func (*LiquidityProviderConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{212} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{222} } func (x *LiquidityProviderConnection) GetEdges() []*LiquidityProviderEdge { @@ -13334,7 +14023,7 @@ type ListLiquidityProvidersResponse struct { func (x *ListLiquidityProvidersResponse) Reset() { *x = ListLiquidityProvidersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[213] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[223] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13347,7 +14036,7 @@ func (x *ListLiquidityProvidersResponse) String() string { func (*ListLiquidityProvidersResponse) ProtoMessage() {} func (x *ListLiquidityProvidersResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[213] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[223] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13360,7 +14049,7 @@ func (x *ListLiquidityProvidersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLiquidityProvidersResponse.ProtoReflect.Descriptor instead. func (*ListLiquidityProvidersResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{213} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{223} } func (x *ListLiquidityProvidersResponse) GetLiquidityProviders() *LiquidityProviderConnection { @@ -13386,12 +14075,18 @@ type ListPaidLiquidityFeesRequest struct { PartyIds []string `protobuf:"bytes,4,rep,name=party_ids,json=partyIds,proto3" json:"party_ids,omitempty"` // Pagination controls. Pagination *Pagination `protobuf:"bytes,5,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` + // Whether to return all derived parties from AMMs for the given party. If used, party ID is required. + IncludeDerivedParties *bool `protobuf:"varint,6,opt,name=include_derived_parties,json=includeDerivedParties,proto3,oneof" json:"include_derived_parties,omitempty"` + // Restrict paid liquidity fees to those from a given epoch. + EpochFrom *uint64 `protobuf:"varint,7,opt,name=epoch_from,json=epochFrom,proto3,oneof" json:"epoch_from,omitempty"` + // Restrict paid liquidity fees to those up to a given epoch. + EpochTo *uint64 `protobuf:"varint,8,opt,name=epoch_to,json=epochTo,proto3,oneof" json:"epoch_to,omitempty"` } func (x *ListPaidLiquidityFeesRequest) Reset() { *x = ListPaidLiquidityFeesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[214] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[224] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13404,7 +14099,7 @@ func (x *ListPaidLiquidityFeesRequest) String() string { func (*ListPaidLiquidityFeesRequest) ProtoMessage() {} func (x *ListPaidLiquidityFeesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[214] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[224] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13417,7 +14112,7 @@ func (x *ListPaidLiquidityFeesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPaidLiquidityFeesRequest.ProtoReflect.Descriptor instead. func (*ListPaidLiquidityFeesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{214} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{224} } func (x *ListPaidLiquidityFeesRequest) GetMarketId() string { @@ -13455,6 +14150,27 @@ func (x *ListPaidLiquidityFeesRequest) GetPagination() *Pagination { return nil } +func (x *ListPaidLiquidityFeesRequest) GetIncludeDerivedParties() bool { + if x != nil && x.IncludeDerivedParties != nil { + return *x.IncludeDerivedParties + } + return false +} + +func (x *ListPaidLiquidityFeesRequest) GetEpochFrom() uint64 { + if x != nil && x.EpochFrom != nil { + return *x.EpochFrom + } + return 0 +} + +func (x *ListPaidLiquidityFeesRequest) GetEpochTo() uint64 { + if x != nil && x.EpochTo != nil { + return *x.EpochTo + } + return 0 +} + // Paid liquidity fees response. type ListPaidLiquidityFeesResponse struct { state protoimpl.MessageState @@ -13468,7 +14184,7 @@ type ListPaidLiquidityFeesResponse struct { func (x *ListPaidLiquidityFeesResponse) Reset() { *x = ListPaidLiquidityFeesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[215] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[225] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13481,7 +14197,7 @@ func (x *ListPaidLiquidityFeesResponse) String() string { func (*ListPaidLiquidityFeesResponse) ProtoMessage() {} func (x *ListPaidLiquidityFeesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[215] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[225] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13494,7 +14210,7 @@ func (x *ListPaidLiquidityFeesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPaidLiquidityFeesResponse.ProtoReflect.Descriptor instead. func (*ListPaidLiquidityFeesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{215} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{225} } func (x *ListPaidLiquidityFeesResponse) GetPaidLiquidityFees() *PaidLiquidityFeesConnection { @@ -13519,7 +14235,7 @@ type PaidLiquidityFeesEdge struct { func (x *PaidLiquidityFeesEdge) Reset() { *x = PaidLiquidityFeesEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[216] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[226] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13532,7 +14248,7 @@ func (x *PaidLiquidityFeesEdge) String() string { func (*PaidLiquidityFeesEdge) ProtoMessage() {} func (x *PaidLiquidityFeesEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[216] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[226] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13545,7 +14261,7 @@ func (x *PaidLiquidityFeesEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use PaidLiquidityFeesEdge.ProtoReflect.Descriptor instead. func (*PaidLiquidityFeesEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{216} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{226} } func (x *PaidLiquidityFeesEdge) GetNode() *v1.PaidLiquidityFeesStats { @@ -13577,7 +14293,7 @@ type PaidLiquidityFeesConnection struct { func (x *PaidLiquidityFeesConnection) Reset() { *x = PaidLiquidityFeesConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[217] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[227] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13590,7 +14306,7 @@ func (x *PaidLiquidityFeesConnection) String() string { func (*PaidLiquidityFeesConnection) ProtoMessage() {} func (x *PaidLiquidityFeesConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[217] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[227] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13603,7 +14319,7 @@ func (x *PaidLiquidityFeesConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use PaidLiquidityFeesConnection.ProtoReflect.Descriptor instead. func (*PaidLiquidityFeesConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{217} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{227} } func (x *PaidLiquidityFeesConnection) GetEdges() []*PaidLiquidityFeesEdge { @@ -13635,7 +14351,7 @@ type GetGovernanceDataRequest struct { func (x *GetGovernanceDataRequest) Reset() { *x = GetGovernanceDataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[218] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[228] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13648,7 +14364,7 @@ func (x *GetGovernanceDataRequest) String() string { func (*GetGovernanceDataRequest) ProtoMessage() {} func (x *GetGovernanceDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[218] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[228] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13661,7 +14377,7 @@ func (x *GetGovernanceDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGovernanceDataRequest.ProtoReflect.Descriptor instead. func (*GetGovernanceDataRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{218} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{228} } func (x *GetGovernanceDataRequest) GetProposalId() string { @@ -13691,7 +14407,7 @@ type GetGovernanceDataResponse struct { func (x *GetGovernanceDataResponse) Reset() { *x = GetGovernanceDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[219] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[229] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13704,7 +14420,7 @@ func (x *GetGovernanceDataResponse) String() string { func (*GetGovernanceDataResponse) ProtoMessage() {} func (x *GetGovernanceDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[219] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[229] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13717,7 +14433,7 @@ func (x *GetGovernanceDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetGovernanceDataResponse.ProtoReflect.Descriptor instead. func (*GetGovernanceDataResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{219} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{229} } func (x *GetGovernanceDataResponse) GetData() *vega.GovernanceData { @@ -13748,7 +14464,7 @@ type ListGovernanceDataRequest struct { func (x *ListGovernanceDataRequest) Reset() { *x = ListGovernanceDataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[220] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[230] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13761,7 +14477,7 @@ func (x *ListGovernanceDataRequest) String() string { func (*ListGovernanceDataRequest) ProtoMessage() {} func (x *ListGovernanceDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[220] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[230] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13774,7 +14490,7 @@ func (x *ListGovernanceDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListGovernanceDataRequest.ProtoReflect.Descriptor instead. func (*ListGovernanceDataRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{220} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{230} } func (x *ListGovernanceDataRequest) GetProposalState() vega.Proposal_State { @@ -13825,7 +14541,7 @@ type ListGovernanceDataResponse struct { func (x *ListGovernanceDataResponse) Reset() { *x = ListGovernanceDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[221] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[231] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13838,7 +14554,7 @@ func (x *ListGovernanceDataResponse) String() string { func (*ListGovernanceDataResponse) ProtoMessage() {} func (x *ListGovernanceDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[221] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[231] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13851,7 +14567,7 @@ func (x *ListGovernanceDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListGovernanceDataResponse.ProtoReflect.Descriptor instead. func (*ListGovernanceDataResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{221} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{231} } func (x *ListGovernanceDataResponse) GetConnection() *GovernanceDataConnection { @@ -13876,7 +14592,7 @@ type GovernanceDataEdge struct { func (x *GovernanceDataEdge) Reset() { *x = GovernanceDataEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[222] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[232] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13889,7 +14605,7 @@ func (x *GovernanceDataEdge) String() string { func (*GovernanceDataEdge) ProtoMessage() {} func (x *GovernanceDataEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[222] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[232] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13902,7 +14618,7 @@ func (x *GovernanceDataEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use GovernanceDataEdge.ProtoReflect.Descriptor instead. func (*GovernanceDataEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{222} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{232} } func (x *GovernanceDataEdge) GetNode() *vega.GovernanceData { @@ -13934,7 +14650,7 @@ type GovernanceDataConnection struct { func (x *GovernanceDataConnection) Reset() { *x = GovernanceDataConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[223] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[233] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13947,7 +14663,7 @@ func (x *GovernanceDataConnection) String() string { func (*GovernanceDataConnection) ProtoMessage() {} func (x *GovernanceDataConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[223] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[233] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13960,7 +14676,7 @@ func (x *GovernanceDataConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use GovernanceDataConnection.ProtoReflect.Descriptor instead. func (*GovernanceDataConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{223} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{233} } func (x *GovernanceDataConnection) GetEdges() []*GovernanceDataEdge { @@ -13990,7 +14706,7 @@ type ObserveGovernanceRequest struct { func (x *ObserveGovernanceRequest) Reset() { *x = ObserveGovernanceRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[224] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[234] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14003,7 +14719,7 @@ func (x *ObserveGovernanceRequest) String() string { func (*ObserveGovernanceRequest) ProtoMessage() {} func (x *ObserveGovernanceRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[224] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[234] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14016,7 +14732,7 @@ func (x *ObserveGovernanceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveGovernanceRequest.ProtoReflect.Descriptor instead. func (*ObserveGovernanceRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{224} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{234} } func (x *ObserveGovernanceRequest) GetPartyId() string { @@ -14039,7 +14755,7 @@ type ObserveGovernanceResponse struct { func (x *ObserveGovernanceResponse) Reset() { *x = ObserveGovernanceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[225] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[235] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14052,7 +14768,7 @@ func (x *ObserveGovernanceResponse) String() string { func (*ObserveGovernanceResponse) ProtoMessage() {} func (x *ObserveGovernanceResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[225] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[235] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14065,7 +14781,7 @@ func (x *ObserveGovernanceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveGovernanceResponse.ProtoReflect.Descriptor instead. func (*ObserveGovernanceResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{225} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{235} } func (x *ObserveGovernanceResponse) GetData() *vega.GovernanceData { @@ -14094,7 +14810,7 @@ type ListDelegationsRequest struct { func (x *ListDelegationsRequest) Reset() { *x = ListDelegationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[226] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[236] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14107,7 +14823,7 @@ func (x *ListDelegationsRequest) String() string { func (*ListDelegationsRequest) ProtoMessage() {} func (x *ListDelegationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[226] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[236] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14120,7 +14836,7 @@ func (x *ListDelegationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDelegationsRequest.ProtoReflect.Descriptor instead. func (*ListDelegationsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{226} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{236} } func (x *ListDelegationsRequest) GetPartyId() string { @@ -14164,7 +14880,7 @@ type ListDelegationsResponse struct { func (x *ListDelegationsResponse) Reset() { *x = ListDelegationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[227] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[237] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14177,7 +14893,7 @@ func (x *ListDelegationsResponse) String() string { func (*ListDelegationsResponse) ProtoMessage() {} func (x *ListDelegationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[227] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[237] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14190,7 +14906,7 @@ func (x *ListDelegationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDelegationsResponse.ProtoReflect.Descriptor instead. func (*ListDelegationsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{227} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{237} } func (x *ListDelegationsResponse) GetDelegations() *DelegationsConnection { @@ -14215,7 +14931,7 @@ type DelegationEdge struct { func (x *DelegationEdge) Reset() { *x = DelegationEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[228] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[238] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14228,7 +14944,7 @@ func (x *DelegationEdge) String() string { func (*DelegationEdge) ProtoMessage() {} func (x *DelegationEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[228] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[238] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14241,7 +14957,7 @@ func (x *DelegationEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegationEdge.ProtoReflect.Descriptor instead. func (*DelegationEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{228} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{238} } func (x *DelegationEdge) GetNode() *vega.Delegation { @@ -14273,7 +14989,7 @@ type DelegationsConnection struct { func (x *DelegationsConnection) Reset() { *x = DelegationsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[229] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[239] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14286,7 +15002,7 @@ func (x *DelegationsConnection) String() string { func (*DelegationsConnection) ProtoMessage() {} func (x *DelegationsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[229] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[239] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14299,7 +15015,7 @@ func (x *DelegationsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegationsConnection.ProtoReflect.Descriptor instead. func (*DelegationsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{229} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{239} } func (x *DelegationsConnection) GetEdges() []*DelegationEdge { @@ -14331,7 +15047,7 @@ type ObserveDelegationsRequest struct { func (x *ObserveDelegationsRequest) Reset() { *x = ObserveDelegationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[230] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[240] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14344,7 +15060,7 @@ func (x *ObserveDelegationsRequest) String() string { func (*ObserveDelegationsRequest) ProtoMessage() {} func (x *ObserveDelegationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[230] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[240] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14357,7 +15073,7 @@ func (x *ObserveDelegationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveDelegationsRequest.ProtoReflect.Descriptor instead. func (*ObserveDelegationsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{230} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{240} } func (x *ObserveDelegationsRequest) GetPartyId() string { @@ -14387,7 +15103,7 @@ type ObserveDelegationsResponse struct { func (x *ObserveDelegationsResponse) Reset() { *x = ObserveDelegationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[231] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[241] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14400,7 +15116,7 @@ func (x *ObserveDelegationsResponse) String() string { func (*ObserveDelegationsResponse) ProtoMessage() {} func (x *ObserveDelegationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[231] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[241] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14413,7 +15129,7 @@ func (x *ObserveDelegationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveDelegationsResponse.ProtoReflect.Descriptor instead. func (*ObserveDelegationsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{231} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{241} } func (x *ObserveDelegationsResponse) GetDelegation() *vega.Delegation { @@ -14452,7 +15168,7 @@ type NodeBasic struct { func (x *NodeBasic) Reset() { *x = NodeBasic{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[232] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[242] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14465,7 +15181,7 @@ func (x *NodeBasic) String() string { func (*NodeBasic) ProtoMessage() {} func (x *NodeBasic) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[232] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[242] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14478,7 +15194,7 @@ func (x *NodeBasic) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeBasic.ProtoReflect.Descriptor instead. func (*NodeBasic) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{232} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{242} } func (x *NodeBasic) GetId() string { @@ -14554,7 +15270,7 @@ type GetNetworkDataRequest struct { func (x *GetNetworkDataRequest) Reset() { *x = GetNetworkDataRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[233] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[243] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14567,7 +15283,7 @@ func (x *GetNetworkDataRequest) String() string { func (*GetNetworkDataRequest) ProtoMessage() {} func (x *GetNetworkDataRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[233] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[243] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14580,7 +15296,7 @@ func (x *GetNetworkDataRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNetworkDataRequest.ProtoReflect.Descriptor instead. func (*GetNetworkDataRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{233} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{243} } // Response from getting network data @@ -14596,7 +15312,7 @@ type GetNetworkDataResponse struct { func (x *GetNetworkDataResponse) Reset() { *x = GetNetworkDataResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[234] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[244] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14609,7 +15325,7 @@ func (x *GetNetworkDataResponse) String() string { func (*GetNetworkDataResponse) ProtoMessage() {} func (x *GetNetworkDataResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[234] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[244] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14622,7 +15338,7 @@ func (x *GetNetworkDataResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNetworkDataResponse.ProtoReflect.Descriptor instead. func (*GetNetworkDataResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{234} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{244} } func (x *GetNetworkDataResponse) GetNodeData() *vega.NodeData { @@ -14645,7 +15361,7 @@ type GetNodeRequest struct { func (x *GetNodeRequest) Reset() { *x = GetNodeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[235] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[245] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14658,7 +15374,7 @@ func (x *GetNodeRequest) String() string { func (*GetNodeRequest) ProtoMessage() {} func (x *GetNodeRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[235] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[245] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14671,7 +15387,7 @@ func (x *GetNodeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNodeRequest.ProtoReflect.Descriptor instead. func (*GetNodeRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{235} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{245} } func (x *GetNodeRequest) GetId() string { @@ -14694,7 +15410,7 @@ type GetNodeResponse struct { func (x *GetNodeResponse) Reset() { *x = GetNodeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[236] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[246] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14707,7 +15423,7 @@ func (x *GetNodeResponse) String() string { func (*GetNodeResponse) ProtoMessage() {} func (x *GetNodeResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[236] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[246] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14720,7 +15436,7 @@ func (x *GetNodeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNodeResponse.ProtoReflect.Descriptor instead. func (*GetNodeResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{236} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{246} } func (x *GetNodeResponse) GetNode() *vega.Node { @@ -14745,7 +15461,7 @@ type ListNodesRequest struct { func (x *ListNodesRequest) Reset() { *x = ListNodesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[237] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[247] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14758,7 +15474,7 @@ func (x *ListNodesRequest) String() string { func (*ListNodesRequest) ProtoMessage() {} func (x *ListNodesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[237] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[247] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14771,7 +15487,7 @@ func (x *ListNodesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNodesRequest.ProtoReflect.Descriptor instead. func (*ListNodesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{237} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{247} } func (x *ListNodesRequest) GetEpochSeq() uint64 { @@ -14801,7 +15517,7 @@ type ListNodesResponse struct { func (x *ListNodesResponse) Reset() { *x = ListNodesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[238] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[248] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14814,7 +15530,7 @@ func (x *ListNodesResponse) String() string { func (*ListNodesResponse) ProtoMessage() {} func (x *ListNodesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[238] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[248] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14827,7 +15543,7 @@ func (x *ListNodesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNodesResponse.ProtoReflect.Descriptor instead. func (*ListNodesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{238} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{248} } func (x *ListNodesResponse) GetNodes() *NodesConnection { @@ -14852,7 +15568,7 @@ type NodeEdge struct { func (x *NodeEdge) Reset() { *x = NodeEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[239] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[249] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14865,7 +15581,7 @@ func (x *NodeEdge) String() string { func (*NodeEdge) ProtoMessage() {} func (x *NodeEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[239] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[249] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14878,7 +15594,7 @@ func (x *NodeEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeEdge.ProtoReflect.Descriptor instead. func (*NodeEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{239} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{249} } func (x *NodeEdge) GetNode() *vega.Node { @@ -14910,7 +15626,7 @@ type NodesConnection struct { func (x *NodesConnection) Reset() { *x = NodesConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[240] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[250] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14923,7 +15639,7 @@ func (x *NodesConnection) String() string { func (*NodesConnection) ProtoMessage() {} func (x *NodesConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[240] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[250] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14936,7 +15652,7 @@ func (x *NodesConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use NodesConnection.ProtoReflect.Descriptor instead. func (*NodesConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{240} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{250} } func (x *NodesConnection) GetEdges() []*NodeEdge { @@ -14968,7 +15684,7 @@ type ListNodeSignaturesRequest struct { func (x *ListNodeSignaturesRequest) Reset() { *x = ListNodeSignaturesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[241] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[251] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14981,7 +15697,7 @@ func (x *ListNodeSignaturesRequest) String() string { func (*ListNodeSignaturesRequest) ProtoMessage() {} func (x *ListNodeSignaturesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[241] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[251] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14994,7 +15710,7 @@ func (x *ListNodeSignaturesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNodeSignaturesRequest.ProtoReflect.Descriptor instead. func (*ListNodeSignaturesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{241} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{251} } func (x *ListNodeSignaturesRequest) GetId() string { @@ -15024,7 +15740,7 @@ type ListNodeSignaturesResponse struct { func (x *ListNodeSignaturesResponse) Reset() { *x = ListNodeSignaturesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[242] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[252] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15037,7 +15753,7 @@ func (x *ListNodeSignaturesResponse) String() string { func (*ListNodeSignaturesResponse) ProtoMessage() {} func (x *ListNodeSignaturesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[242] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[252] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15050,7 +15766,7 @@ func (x *ListNodeSignaturesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNodeSignaturesResponse.ProtoReflect.Descriptor instead. func (*ListNodeSignaturesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{242} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{252} } func (x *ListNodeSignaturesResponse) GetSignatures() *NodeSignaturesConnection { @@ -15075,7 +15791,7 @@ type NodeSignatureEdge struct { func (x *NodeSignatureEdge) Reset() { *x = NodeSignatureEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[243] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[253] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15088,7 +15804,7 @@ func (x *NodeSignatureEdge) String() string { func (*NodeSignatureEdge) ProtoMessage() {} func (x *NodeSignatureEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[243] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[253] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15101,7 +15817,7 @@ func (x *NodeSignatureEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeSignatureEdge.ProtoReflect.Descriptor instead. func (*NodeSignatureEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{243} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{253} } func (x *NodeSignatureEdge) GetNode() *v11.NodeSignature { @@ -15133,7 +15849,7 @@ type NodeSignaturesConnection struct { func (x *NodeSignaturesConnection) Reset() { *x = NodeSignaturesConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[244] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[254] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15146,7 +15862,7 @@ func (x *NodeSignaturesConnection) String() string { func (*NodeSignaturesConnection) ProtoMessage() {} func (x *NodeSignaturesConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[244] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[254] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15159,7 +15875,7 @@ func (x *NodeSignaturesConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use NodeSignaturesConnection.ProtoReflect.Descriptor instead. func (*NodeSignaturesConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{244} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{254} } func (x *NodeSignaturesConnection) GetEdges() []*NodeSignatureEdge { @@ -15193,7 +15909,7 @@ type GetEpochRequest struct { func (x *GetEpochRequest) Reset() { *x = GetEpochRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[245] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[255] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15206,7 +15922,7 @@ func (x *GetEpochRequest) String() string { func (*GetEpochRequest) ProtoMessage() {} func (x *GetEpochRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[245] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[255] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15219,7 +15935,7 @@ func (x *GetEpochRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEpochRequest.ProtoReflect.Descriptor instead. func (*GetEpochRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{245} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{255} } func (x *GetEpochRequest) GetId() uint64 { @@ -15250,7 +15966,7 @@ type GetEpochResponse struct { func (x *GetEpochResponse) Reset() { *x = GetEpochResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[246] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[256] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15263,7 +15979,7 @@ func (x *GetEpochResponse) String() string { func (*GetEpochResponse) ProtoMessage() {} func (x *GetEpochResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[246] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[256] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15276,7 +15992,7 @@ func (x *GetEpochResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEpochResponse.ProtoReflect.Descriptor instead. func (*GetEpochResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{246} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{256} } func (x *GetEpochResponse) GetEpoch() *vega.Epoch { @@ -15303,7 +16019,7 @@ type EstimateFeeRequest struct { func (x *EstimateFeeRequest) Reset() { *x = EstimateFeeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[247] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[257] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15316,7 +16032,7 @@ func (x *EstimateFeeRequest) String() string { func (*EstimateFeeRequest) ProtoMessage() {} func (x *EstimateFeeRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[247] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[257] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15329,7 +16045,7 @@ func (x *EstimateFeeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateFeeRequest.ProtoReflect.Descriptor instead. func (*EstimateFeeRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{247} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{257} } func (x *EstimateFeeRequest) GetMarketId() string { @@ -15366,7 +16082,7 @@ type EstimateFeeResponse struct { func (x *EstimateFeeResponse) Reset() { *x = EstimateFeeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[248] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[258] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15379,7 +16095,7 @@ func (x *EstimateFeeResponse) String() string { func (*EstimateFeeResponse) ProtoMessage() {} func (x *EstimateFeeResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[248] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[258] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15392,7 +16108,7 @@ func (x *EstimateFeeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateFeeResponse.ProtoReflect.Descriptor instead. func (*EstimateFeeResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{248} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{258} } func (x *EstimateFeeResponse) GetFee() *vega.Fee { @@ -15427,7 +16143,7 @@ type EstimateMarginRequest struct { func (x *EstimateMarginRequest) Reset() { *x = EstimateMarginRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[249] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[259] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15440,7 +16156,7 @@ func (x *EstimateMarginRequest) String() string { func (*EstimateMarginRequest) ProtoMessage() {} func (x *EstimateMarginRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[249] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[259] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15453,7 +16169,7 @@ func (x *EstimateMarginRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateMarginRequest.ProtoReflect.Descriptor instead. func (*EstimateMarginRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{249} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{259} } func (x *EstimateMarginRequest) GetMarketId() string { @@ -15513,7 +16229,7 @@ type EstimateMarginResponse struct { func (x *EstimateMarginResponse) Reset() { *x = EstimateMarginResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[250] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[260] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15526,7 +16242,7 @@ func (x *EstimateMarginResponse) String() string { func (*EstimateMarginResponse) ProtoMessage() {} func (x *EstimateMarginResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[250] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[260] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15539,7 +16255,7 @@ func (x *EstimateMarginResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateMarginResponse.ProtoReflect.Descriptor instead. func (*EstimateMarginResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{250} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{260} } func (x *EstimateMarginResponse) GetMarginLevels() *vega.MarginLevels { @@ -15562,7 +16278,7 @@ type ListNetworkParametersRequest struct { func (x *ListNetworkParametersRequest) Reset() { *x = ListNetworkParametersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[251] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[261] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15575,7 +16291,7 @@ func (x *ListNetworkParametersRequest) String() string { func (*ListNetworkParametersRequest) ProtoMessage() {} func (x *ListNetworkParametersRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[251] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[261] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15588,7 +16304,7 @@ func (x *ListNetworkParametersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNetworkParametersRequest.ProtoReflect.Descriptor instead. func (*ListNetworkParametersRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{251} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{261} } func (x *ListNetworkParametersRequest) GetPagination() *Pagination { @@ -15611,7 +16327,7 @@ type ListNetworkParametersResponse struct { func (x *ListNetworkParametersResponse) Reset() { *x = ListNetworkParametersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[252] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[262] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15624,7 +16340,7 @@ func (x *ListNetworkParametersResponse) String() string { func (*ListNetworkParametersResponse) ProtoMessage() {} func (x *ListNetworkParametersResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[252] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[262] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15637,7 +16353,7 @@ func (x *ListNetworkParametersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNetworkParametersResponse.ProtoReflect.Descriptor instead. func (*ListNetworkParametersResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{252} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{262} } func (x *ListNetworkParametersResponse) GetNetworkParameters() *NetworkParameterConnection { @@ -15660,7 +16376,7 @@ type GetNetworkParameterRequest struct { func (x *GetNetworkParameterRequest) Reset() { *x = GetNetworkParameterRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[253] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[263] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15673,7 +16389,7 @@ func (x *GetNetworkParameterRequest) String() string { func (*GetNetworkParameterRequest) ProtoMessage() {} func (x *GetNetworkParameterRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[253] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[263] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15686,7 +16402,7 @@ func (x *GetNetworkParameterRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNetworkParameterRequest.ProtoReflect.Descriptor instead. func (*GetNetworkParameterRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{253} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{263} } func (x *GetNetworkParameterRequest) GetKey() string { @@ -15709,7 +16425,7 @@ type GetNetworkParameterResponse struct { func (x *GetNetworkParameterResponse) Reset() { *x = GetNetworkParameterResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[254] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[264] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15722,7 +16438,7 @@ func (x *GetNetworkParameterResponse) String() string { func (*GetNetworkParameterResponse) ProtoMessage() {} func (x *GetNetworkParameterResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[254] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[264] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15735,7 +16451,7 @@ func (x *GetNetworkParameterResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNetworkParameterResponse.ProtoReflect.Descriptor instead. func (*GetNetworkParameterResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{254} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{264} } func (x *GetNetworkParameterResponse) GetNetworkParameter() *vega.NetworkParameter { @@ -15760,7 +16476,7 @@ type NetworkParameterEdge struct { func (x *NetworkParameterEdge) Reset() { *x = NetworkParameterEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[255] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[265] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15773,7 +16489,7 @@ func (x *NetworkParameterEdge) String() string { func (*NetworkParameterEdge) ProtoMessage() {} func (x *NetworkParameterEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[255] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[265] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15786,7 +16502,7 @@ func (x *NetworkParameterEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use NetworkParameterEdge.ProtoReflect.Descriptor instead. func (*NetworkParameterEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{255} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{265} } func (x *NetworkParameterEdge) GetNode() *vega.NetworkParameter { @@ -15818,7 +16534,7 @@ type NetworkParameterConnection struct { func (x *NetworkParameterConnection) Reset() { *x = NetworkParameterConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[256] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[266] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15831,7 +16547,7 @@ func (x *NetworkParameterConnection) String() string { func (*NetworkParameterConnection) ProtoMessage() {} func (x *NetworkParameterConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[256] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[266] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15844,7 +16560,7 @@ func (x *NetworkParameterConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use NetworkParameterConnection.ProtoReflect.Descriptor instead. func (*NetworkParameterConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{256} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{266} } func (x *NetworkParameterConnection) GetEdges() []*NetworkParameterEdge { @@ -15878,7 +16594,7 @@ type Checkpoint struct { func (x *Checkpoint) Reset() { *x = Checkpoint{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[257] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[267] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15891,7 +16607,7 @@ func (x *Checkpoint) String() string { func (*Checkpoint) ProtoMessage() {} func (x *Checkpoint) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[257] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[267] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15904,7 +16620,7 @@ func (x *Checkpoint) ProtoReflect() protoreflect.Message { // Deprecated: Use Checkpoint.ProtoReflect.Descriptor instead. func (*Checkpoint) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{257} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{267} } func (x *Checkpoint) GetHash() string { @@ -15941,7 +16657,7 @@ type ListCheckpointsRequest struct { func (x *ListCheckpointsRequest) Reset() { *x = ListCheckpointsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[258] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[268] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -15954,7 +16670,7 @@ func (x *ListCheckpointsRequest) String() string { func (*ListCheckpointsRequest) ProtoMessage() {} func (x *ListCheckpointsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[258] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[268] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -15967,7 +16683,7 @@ func (x *ListCheckpointsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCheckpointsRequest.ProtoReflect.Descriptor instead. func (*ListCheckpointsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{258} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{268} } func (x *ListCheckpointsRequest) GetPagination() *Pagination { @@ -15990,7 +16706,7 @@ type ListCheckpointsResponse struct { func (x *ListCheckpointsResponse) Reset() { *x = ListCheckpointsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[259] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[269] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16003,7 +16719,7 @@ func (x *ListCheckpointsResponse) String() string { func (*ListCheckpointsResponse) ProtoMessage() {} func (x *ListCheckpointsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[259] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[269] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16016,7 +16732,7 @@ func (x *ListCheckpointsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCheckpointsResponse.ProtoReflect.Descriptor instead. func (*ListCheckpointsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{259} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{269} } func (x *ListCheckpointsResponse) GetCheckpoints() *CheckpointsConnection { @@ -16041,7 +16757,7 @@ type CheckpointEdge struct { func (x *CheckpointEdge) Reset() { *x = CheckpointEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[260] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[270] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16054,7 +16770,7 @@ func (x *CheckpointEdge) String() string { func (*CheckpointEdge) ProtoMessage() {} func (x *CheckpointEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[260] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[270] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16067,7 +16783,7 @@ func (x *CheckpointEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckpointEdge.ProtoReflect.Descriptor instead. func (*CheckpointEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{260} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{270} } func (x *CheckpointEdge) GetNode() *Checkpoint { @@ -16099,7 +16815,7 @@ type CheckpointsConnection struct { func (x *CheckpointsConnection) Reset() { *x = CheckpointsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[261] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[271] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16112,7 +16828,7 @@ func (x *CheckpointsConnection) String() string { func (*CheckpointsConnection) ProtoMessage() {} func (x *CheckpointsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[261] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[271] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16125,7 +16841,7 @@ func (x *CheckpointsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckpointsConnection.ProtoReflect.Descriptor instead. func (*CheckpointsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{261} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{271} } func (x *CheckpointsConnection) GetEdges() []*CheckpointEdge { @@ -16157,7 +16873,7 @@ type GetStakeRequest struct { func (x *GetStakeRequest) Reset() { *x = GetStakeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[262] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[272] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16170,7 +16886,7 @@ func (x *GetStakeRequest) String() string { func (*GetStakeRequest) ProtoMessage() {} func (x *GetStakeRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[262] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[272] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16183,7 +16899,7 @@ func (x *GetStakeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStakeRequest.ProtoReflect.Descriptor instead. func (*GetStakeRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{262} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{272} } func (x *GetStakeRequest) GetPartyId() string { @@ -16215,7 +16931,7 @@ type GetStakeResponse struct { func (x *GetStakeResponse) Reset() { *x = GetStakeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[263] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[273] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16228,7 +16944,7 @@ func (x *GetStakeResponse) String() string { func (*GetStakeResponse) ProtoMessage() {} func (x *GetStakeResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[263] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[273] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16241,7 +16957,7 @@ func (x *GetStakeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStakeResponse.ProtoReflect.Descriptor instead. func (*GetStakeResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{263} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{273} } func (x *GetStakeResponse) GetCurrentStakeAvailable() string { @@ -16273,7 +16989,7 @@ type StakeLinkingEdge struct { func (x *StakeLinkingEdge) Reset() { *x = StakeLinkingEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[264] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[274] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16286,7 +17002,7 @@ func (x *StakeLinkingEdge) String() string { func (*StakeLinkingEdge) ProtoMessage() {} func (x *StakeLinkingEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[264] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[274] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16299,7 +17015,7 @@ func (x *StakeLinkingEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use StakeLinkingEdge.ProtoReflect.Descriptor instead. func (*StakeLinkingEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{264} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{274} } func (x *StakeLinkingEdge) GetNode() *v1.StakeLinking { @@ -16331,7 +17047,7 @@ type StakesConnection struct { func (x *StakesConnection) Reset() { *x = StakesConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[265] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[275] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16344,7 +17060,7 @@ func (x *StakesConnection) String() string { func (*StakesConnection) ProtoMessage() {} func (x *StakesConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[265] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[275] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16357,7 +17073,7 @@ func (x *StakesConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use StakesConnection.ProtoReflect.Descriptor instead. func (*StakesConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{265} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{275} } func (x *StakesConnection) GetEdges() []*StakeLinkingEdge { @@ -16387,7 +17103,7 @@ type GetRiskFactorsRequest struct { func (x *GetRiskFactorsRequest) Reset() { *x = GetRiskFactorsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[266] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[276] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16400,7 +17116,7 @@ func (x *GetRiskFactorsRequest) String() string { func (*GetRiskFactorsRequest) ProtoMessage() {} func (x *GetRiskFactorsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[266] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[276] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16413,7 +17129,7 @@ func (x *GetRiskFactorsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRiskFactorsRequest.ProtoReflect.Descriptor instead. func (*GetRiskFactorsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{266} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{276} } func (x *GetRiskFactorsRequest) GetMarketId() string { @@ -16436,7 +17152,7 @@ type GetRiskFactorsResponse struct { func (x *GetRiskFactorsResponse) Reset() { *x = GetRiskFactorsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[267] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[277] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16449,7 +17165,7 @@ func (x *GetRiskFactorsResponse) String() string { func (*GetRiskFactorsResponse) ProtoMessage() {} func (x *GetRiskFactorsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[267] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[277] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16462,7 +17178,7 @@ func (x *GetRiskFactorsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRiskFactorsResponse.ProtoReflect.Descriptor instead. func (*GetRiskFactorsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{267} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{277} } func (x *GetRiskFactorsResponse) GetRiskFactor() *vega.RiskFactor { @@ -16497,7 +17213,7 @@ type ObserveEventBusRequest struct { func (x *ObserveEventBusRequest) Reset() { *x = ObserveEventBusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[268] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[278] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16510,7 +17226,7 @@ func (x *ObserveEventBusRequest) String() string { func (*ObserveEventBusRequest) ProtoMessage() {} func (x *ObserveEventBusRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[268] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[278] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16523,7 +17239,7 @@ func (x *ObserveEventBusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveEventBusRequest.ProtoReflect.Descriptor instead. func (*ObserveEventBusRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{268} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{278} } func (x *ObserveEventBusRequest) GetType() []v1.BusEventType { @@ -16567,7 +17283,7 @@ type ObserveEventBusResponse struct { func (x *ObserveEventBusResponse) Reset() { *x = ObserveEventBusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[269] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[279] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16580,7 +17296,7 @@ func (x *ObserveEventBusResponse) String() string { func (*ObserveEventBusResponse) ProtoMessage() {} func (x *ObserveEventBusResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[269] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[279] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16593,7 +17309,7 @@ func (x *ObserveEventBusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveEventBusResponse.ProtoReflect.Descriptor instead. func (*ObserveEventBusResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{269} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{279} } func (x *ObserveEventBusResponse) GetEvents() []*v1.BusEvent { @@ -16613,7 +17329,7 @@ type ObserveLedgerMovementsRequest struct { func (x *ObserveLedgerMovementsRequest) Reset() { *x = ObserveLedgerMovementsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[270] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[280] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16626,7 +17342,7 @@ func (x *ObserveLedgerMovementsRequest) String() string { func (*ObserveLedgerMovementsRequest) ProtoMessage() {} func (x *ObserveLedgerMovementsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[270] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[280] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16639,7 +17355,7 @@ func (x *ObserveLedgerMovementsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveLedgerMovementsRequest.ProtoReflect.Descriptor instead. func (*ObserveLedgerMovementsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{270} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{280} } // Response from ledger movements subscription @@ -16655,7 +17371,7 @@ type ObserveLedgerMovementsResponse struct { func (x *ObserveLedgerMovementsResponse) Reset() { *x = ObserveLedgerMovementsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[271] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[281] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16668,7 +17384,7 @@ func (x *ObserveLedgerMovementsResponse) String() string { func (*ObserveLedgerMovementsResponse) ProtoMessage() {} func (x *ObserveLedgerMovementsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[271] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[281] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16681,7 +17397,7 @@ func (x *ObserveLedgerMovementsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveLedgerMovementsResponse.ProtoReflect.Descriptor instead. func (*ObserveLedgerMovementsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{271} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{281} } func (x *ObserveLedgerMovementsResponse) GetLedgerMovement() *vega.LedgerMovement { @@ -16706,7 +17422,7 @@ type ListKeyRotationsRequest struct { func (x *ListKeyRotationsRequest) Reset() { *x = ListKeyRotationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[272] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[282] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16719,7 +17435,7 @@ func (x *ListKeyRotationsRequest) String() string { func (*ListKeyRotationsRequest) ProtoMessage() {} func (x *ListKeyRotationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[272] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[282] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16732,7 +17448,7 @@ func (x *ListKeyRotationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListKeyRotationsRequest.ProtoReflect.Descriptor instead. func (*ListKeyRotationsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{272} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{282} } func (x *ListKeyRotationsRequest) GetNodeId() string { @@ -16762,7 +17478,7 @@ type ListKeyRotationsResponse struct { func (x *ListKeyRotationsResponse) Reset() { *x = ListKeyRotationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[273] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[283] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16775,7 +17491,7 @@ func (x *ListKeyRotationsResponse) String() string { func (*ListKeyRotationsResponse) ProtoMessage() {} func (x *ListKeyRotationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[273] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[283] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16788,7 +17504,7 @@ func (x *ListKeyRotationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListKeyRotationsResponse.ProtoReflect.Descriptor instead. func (*ListKeyRotationsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{273} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{283} } func (x *ListKeyRotationsResponse) GetRotations() *KeyRotationConnection { @@ -16813,7 +17529,7 @@ type KeyRotationEdge struct { func (x *KeyRotationEdge) Reset() { *x = KeyRotationEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[274] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[284] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16826,7 +17542,7 @@ func (x *KeyRotationEdge) String() string { func (*KeyRotationEdge) ProtoMessage() {} func (x *KeyRotationEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[274] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[284] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16839,7 +17555,7 @@ func (x *KeyRotationEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyRotationEdge.ProtoReflect.Descriptor instead. func (*KeyRotationEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{274} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{284} } func (x *KeyRotationEdge) GetNode() *v1.KeyRotation { @@ -16871,7 +17587,7 @@ type KeyRotationConnection struct { func (x *KeyRotationConnection) Reset() { *x = KeyRotationConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[275] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[285] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16884,7 +17600,7 @@ func (x *KeyRotationConnection) String() string { func (*KeyRotationConnection) ProtoMessage() {} func (x *KeyRotationConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[275] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[285] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16897,7 +17613,7 @@ func (x *KeyRotationConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyRotationConnection.ProtoReflect.Descriptor instead. func (*KeyRotationConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{275} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{285} } func (x *KeyRotationConnection) GetEdges() []*KeyRotationEdge { @@ -16929,7 +17645,7 @@ type ListEthereumKeyRotationsRequest struct { func (x *ListEthereumKeyRotationsRequest) Reset() { *x = ListEthereumKeyRotationsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[276] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[286] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16942,7 +17658,7 @@ func (x *ListEthereumKeyRotationsRequest) String() string { func (*ListEthereumKeyRotationsRequest) ProtoMessage() {} func (x *ListEthereumKeyRotationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[276] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[286] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -16955,7 +17671,7 @@ func (x *ListEthereumKeyRotationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEthereumKeyRotationsRequest.ProtoReflect.Descriptor instead. func (*ListEthereumKeyRotationsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{276} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{286} } func (x *ListEthereumKeyRotationsRequest) GetNodeId() string { @@ -16985,7 +17701,7 @@ type ListEthereumKeyRotationsResponse struct { func (x *ListEthereumKeyRotationsResponse) Reset() { *x = ListEthereumKeyRotationsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[277] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[287] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -16998,7 +17714,7 @@ func (x *ListEthereumKeyRotationsResponse) String() string { func (*ListEthereumKeyRotationsResponse) ProtoMessage() {} func (x *ListEthereumKeyRotationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[277] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[287] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17011,7 +17727,7 @@ func (x *ListEthereumKeyRotationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEthereumKeyRotationsResponse.ProtoReflect.Descriptor instead. func (*ListEthereumKeyRotationsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{277} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{287} } func (x *ListEthereumKeyRotationsResponse) GetKeyRotations() *EthereumKeyRotationsConnection { @@ -17036,7 +17752,7 @@ type EthereumKeyRotationsConnection struct { func (x *EthereumKeyRotationsConnection) Reset() { *x = EthereumKeyRotationsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[278] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[288] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17049,7 +17765,7 @@ func (x *EthereumKeyRotationsConnection) String() string { func (*EthereumKeyRotationsConnection) ProtoMessage() {} func (x *EthereumKeyRotationsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[278] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[288] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17062,7 +17778,7 @@ func (x *EthereumKeyRotationsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use EthereumKeyRotationsConnection.ProtoReflect.Descriptor instead. func (*EthereumKeyRotationsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{278} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{288} } func (x *EthereumKeyRotationsConnection) GetEdges() []*EthereumKeyRotationEdge { @@ -17094,7 +17810,7 @@ type EthereumKeyRotationEdge struct { func (x *EthereumKeyRotationEdge) Reset() { *x = EthereumKeyRotationEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[279] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[289] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17107,7 +17823,7 @@ func (x *EthereumKeyRotationEdge) String() string { func (*EthereumKeyRotationEdge) ProtoMessage() {} func (x *EthereumKeyRotationEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[279] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[289] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17120,7 +17836,7 @@ func (x *EthereumKeyRotationEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use EthereumKeyRotationEdge.ProtoReflect.Descriptor instead. func (*EthereumKeyRotationEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{279} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{289} } func (x *EthereumKeyRotationEdge) GetNode() *v1.EthereumKeyRotation { @@ -17147,7 +17863,7 @@ type GetVegaTimeRequest struct { func (x *GetVegaTimeRequest) Reset() { *x = GetVegaTimeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[280] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[290] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17160,7 +17876,7 @@ func (x *GetVegaTimeRequest) String() string { func (*GetVegaTimeRequest) ProtoMessage() {} func (x *GetVegaTimeRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[280] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[290] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17173,7 +17889,7 @@ func (x *GetVegaTimeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVegaTimeRequest.ProtoReflect.Descriptor instead. func (*GetVegaTimeRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{280} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{290} } // Response for the current consensus coordinated time on the Vega network, referred to as "VegaTime" @@ -17190,7 +17906,7 @@ type GetVegaTimeResponse struct { func (x *GetVegaTimeResponse) Reset() { *x = GetVegaTimeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[281] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[291] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17203,7 +17919,7 @@ func (x *GetVegaTimeResponse) String() string { func (*GetVegaTimeResponse) ProtoMessage() {} func (x *GetVegaTimeResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[281] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[291] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17216,7 +17932,7 @@ func (x *GetVegaTimeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVegaTimeResponse.ProtoReflect.Descriptor instead. func (*GetVegaTimeResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{281} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{291} } func (x *GetVegaTimeResponse) GetTimestamp() int64 { @@ -17242,7 +17958,7 @@ type DateRange struct { func (x *DateRange) Reset() { *x = DateRange{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[282] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[292] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17255,7 +17971,7 @@ func (x *DateRange) String() string { func (*DateRange) ProtoMessage() {} func (x *DateRange) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[282] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[292] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17268,7 +17984,7 @@ func (x *DateRange) ProtoReflect() protoreflect.Message { // Deprecated: Use DateRange.ProtoReflect.Descriptor instead. func (*DateRange) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{282} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{292} } func (x *DateRange) GetStartTimestamp() int64 { @@ -17295,7 +18011,7 @@ type GetProtocolUpgradeStatusRequest struct { func (x *GetProtocolUpgradeStatusRequest) Reset() { *x = GetProtocolUpgradeStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[283] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[293] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17308,7 +18024,7 @@ func (x *GetProtocolUpgradeStatusRequest) String() string { func (*GetProtocolUpgradeStatusRequest) ProtoMessage() {} func (x *GetProtocolUpgradeStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[283] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[293] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17321,7 +18037,7 @@ func (x *GetProtocolUpgradeStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProtocolUpgradeStatusRequest.ProtoReflect.Descriptor instead. func (*GetProtocolUpgradeStatusRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{283} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{293} } // Response from getting protocol upgrade status @@ -17337,7 +18053,7 @@ type GetProtocolUpgradeStatusResponse struct { func (x *GetProtocolUpgradeStatusResponse) Reset() { *x = GetProtocolUpgradeStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[284] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[294] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17350,7 +18066,7 @@ func (x *GetProtocolUpgradeStatusResponse) String() string { func (*GetProtocolUpgradeStatusResponse) ProtoMessage() {} func (x *GetProtocolUpgradeStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[284] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[294] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17363,7 +18079,7 @@ func (x *GetProtocolUpgradeStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProtocolUpgradeStatusResponse.ProtoReflect.Descriptor instead. func (*GetProtocolUpgradeStatusResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{284} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{294} } func (x *GetProtocolUpgradeStatusResponse) GetReady() bool { @@ -17390,7 +18106,7 @@ type ListProtocolUpgradeProposalsRequest struct { func (x *ListProtocolUpgradeProposalsRequest) Reset() { *x = ListProtocolUpgradeProposalsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[285] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[295] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17403,7 +18119,7 @@ func (x *ListProtocolUpgradeProposalsRequest) String() string { func (*ListProtocolUpgradeProposalsRequest) ProtoMessage() {} func (x *ListProtocolUpgradeProposalsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[285] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[295] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17416,7 +18132,7 @@ func (x *ListProtocolUpgradeProposalsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ListProtocolUpgradeProposalsRequest.ProtoReflect.Descriptor instead. func (*ListProtocolUpgradeProposalsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{285} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{295} } func (x *ListProtocolUpgradeProposalsRequest) GetStatus() v1.ProtocolUpgradeProposalStatus { @@ -17453,7 +18169,7 @@ type ListProtocolUpgradeProposalsResponse struct { func (x *ListProtocolUpgradeProposalsResponse) Reset() { *x = ListProtocolUpgradeProposalsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[286] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[296] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17466,7 +18182,7 @@ func (x *ListProtocolUpgradeProposalsResponse) String() string { func (*ListProtocolUpgradeProposalsResponse) ProtoMessage() {} func (x *ListProtocolUpgradeProposalsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[286] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[296] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17479,7 +18195,7 @@ func (x *ListProtocolUpgradeProposalsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ListProtocolUpgradeProposalsResponse.ProtoReflect.Descriptor instead. func (*ListProtocolUpgradeProposalsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{286} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{296} } func (x *ListProtocolUpgradeProposalsResponse) GetProtocolUpgradeProposals() *ProtocolUpgradeProposalConnection { @@ -17504,7 +18220,7 @@ type ProtocolUpgradeProposalConnection struct { func (x *ProtocolUpgradeProposalConnection) Reset() { *x = ProtocolUpgradeProposalConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[287] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[297] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17517,7 +18233,7 @@ func (x *ProtocolUpgradeProposalConnection) String() string { func (*ProtocolUpgradeProposalConnection) ProtoMessage() {} func (x *ProtocolUpgradeProposalConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[287] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[297] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17530,7 +18246,7 @@ func (x *ProtocolUpgradeProposalConnection) ProtoReflect() protoreflect.Message // Deprecated: Use ProtocolUpgradeProposalConnection.ProtoReflect.Descriptor instead. func (*ProtocolUpgradeProposalConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{287} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{297} } func (x *ProtocolUpgradeProposalConnection) GetEdges() []*ProtocolUpgradeProposalEdge { @@ -17562,7 +18278,7 @@ type ProtocolUpgradeProposalEdge struct { func (x *ProtocolUpgradeProposalEdge) Reset() { *x = ProtocolUpgradeProposalEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[288] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[298] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17575,7 +18291,7 @@ func (x *ProtocolUpgradeProposalEdge) String() string { func (*ProtocolUpgradeProposalEdge) ProtoMessage() {} func (x *ProtocolUpgradeProposalEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[288] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[298] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17588,7 +18304,7 @@ func (x *ProtocolUpgradeProposalEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ProtocolUpgradeProposalEdge.ProtoReflect.Descriptor instead. func (*ProtocolUpgradeProposalEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{288} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{298} } func (x *ProtocolUpgradeProposalEdge) GetNode() *v1.ProtocolUpgradeEvent { @@ -17618,7 +18334,7 @@ type ListCoreSnapshotsRequest struct { func (x *ListCoreSnapshotsRequest) Reset() { *x = ListCoreSnapshotsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[289] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[299] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17631,7 +18347,7 @@ func (x *ListCoreSnapshotsRequest) String() string { func (*ListCoreSnapshotsRequest) ProtoMessage() {} func (x *ListCoreSnapshotsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[289] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[299] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17644,7 +18360,7 @@ func (x *ListCoreSnapshotsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCoreSnapshotsRequest.ProtoReflect.Descriptor instead. func (*ListCoreSnapshotsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{289} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{299} } func (x *ListCoreSnapshotsRequest) GetPagination() *Pagination { @@ -17667,7 +18383,7 @@ type ListCoreSnapshotsResponse struct { func (x *ListCoreSnapshotsResponse) Reset() { *x = ListCoreSnapshotsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[290] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[300] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17680,7 +18396,7 @@ func (x *ListCoreSnapshotsResponse) String() string { func (*ListCoreSnapshotsResponse) ProtoMessage() {} func (x *ListCoreSnapshotsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[290] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[300] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17693,7 +18409,7 @@ func (x *ListCoreSnapshotsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCoreSnapshotsResponse.ProtoReflect.Descriptor instead. func (*ListCoreSnapshotsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{290} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{300} } func (x *ListCoreSnapshotsResponse) GetCoreSnapshots() *CoreSnapshotConnection { @@ -17718,7 +18434,7 @@ type CoreSnapshotConnection struct { func (x *CoreSnapshotConnection) Reset() { *x = CoreSnapshotConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[291] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[301] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17731,7 +18447,7 @@ func (x *CoreSnapshotConnection) String() string { func (*CoreSnapshotConnection) ProtoMessage() {} func (x *CoreSnapshotConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[291] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[301] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17744,7 +18460,7 @@ func (x *CoreSnapshotConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use CoreSnapshotConnection.ProtoReflect.Descriptor instead. func (*CoreSnapshotConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{291} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{301} } func (x *CoreSnapshotConnection) GetEdges() []*CoreSnapshotEdge { @@ -17776,7 +18492,7 @@ type CoreSnapshotEdge struct { func (x *CoreSnapshotEdge) Reset() { *x = CoreSnapshotEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[292] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[302] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17789,7 +18505,7 @@ func (x *CoreSnapshotEdge) String() string { func (*CoreSnapshotEdge) ProtoMessage() {} func (x *CoreSnapshotEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[292] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[302] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17802,7 +18518,7 @@ func (x *CoreSnapshotEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use CoreSnapshotEdge.ProtoReflect.Descriptor instead. func (*CoreSnapshotEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{292} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{302} } func (x *CoreSnapshotEdge) GetNode() *v1.CoreSnapshotData { @@ -17842,7 +18558,7 @@ type HistorySegment struct { func (x *HistorySegment) Reset() { *x = HistorySegment{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[293] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[303] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17855,7 +18571,7 @@ func (x *HistorySegment) String() string { func (*HistorySegment) ProtoMessage() {} func (x *HistorySegment) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[293] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[303] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17868,7 +18584,7 @@ func (x *HistorySegment) ProtoReflect() protoreflect.Message { // Deprecated: Use HistorySegment.ProtoReflect.Descriptor instead. func (*HistorySegment) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{293} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{303} } func (x *HistorySegment) GetFromHeight() int64 { @@ -17923,7 +18639,7 @@ type GetMostRecentNetworkHistorySegmentRequest struct { func (x *GetMostRecentNetworkHistorySegmentRequest) Reset() { *x = GetMostRecentNetworkHistorySegmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[294] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[304] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17936,7 +18652,7 @@ func (x *GetMostRecentNetworkHistorySegmentRequest) String() string { func (*GetMostRecentNetworkHistorySegmentRequest) ProtoMessage() {} func (x *GetMostRecentNetworkHistorySegmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[294] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[304] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17949,7 +18665,7 @@ func (x *GetMostRecentNetworkHistorySegmentRequest) ProtoReflect() protoreflect. // Deprecated: Use GetMostRecentNetworkHistorySegmentRequest.ProtoReflect.Descriptor instead. func (*GetMostRecentNetworkHistorySegmentRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{294} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{304} } // Response from getting most recent history segment @@ -17967,7 +18683,7 @@ type GetMostRecentNetworkHistorySegmentResponse struct { func (x *GetMostRecentNetworkHistorySegmentResponse) Reset() { *x = GetMostRecentNetworkHistorySegmentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[295] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[305] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -17980,7 +18696,7 @@ func (x *GetMostRecentNetworkHistorySegmentResponse) String() string { func (*GetMostRecentNetworkHistorySegmentResponse) ProtoMessage() {} func (x *GetMostRecentNetworkHistorySegmentResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[295] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[305] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -17993,7 +18709,7 @@ func (x *GetMostRecentNetworkHistorySegmentResponse) ProtoReflect() protoreflect // Deprecated: Use GetMostRecentNetworkHistorySegmentResponse.ProtoReflect.Descriptor instead. func (*GetMostRecentNetworkHistorySegmentResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{295} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{305} } func (x *GetMostRecentNetworkHistorySegmentResponse) GetSegment() *HistorySegment { @@ -18020,7 +18736,7 @@ type ListAllNetworkHistorySegmentsRequest struct { func (x *ListAllNetworkHistorySegmentsRequest) Reset() { *x = ListAllNetworkHistorySegmentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[296] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[306] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18033,7 +18749,7 @@ func (x *ListAllNetworkHistorySegmentsRequest) String() string { func (*ListAllNetworkHistorySegmentsRequest) ProtoMessage() {} func (x *ListAllNetworkHistorySegmentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[296] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[306] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18046,7 +18762,7 @@ func (x *ListAllNetworkHistorySegmentsRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use ListAllNetworkHistorySegmentsRequest.ProtoReflect.Descriptor instead. func (*ListAllNetworkHistorySegmentsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{296} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{306} } // Response with a list of all the nodes history segments @@ -18062,7 +18778,7 @@ type ListAllNetworkHistorySegmentsResponse struct { func (x *ListAllNetworkHistorySegmentsResponse) Reset() { *x = ListAllNetworkHistorySegmentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[297] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[307] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18075,7 +18791,7 @@ func (x *ListAllNetworkHistorySegmentsResponse) String() string { func (*ListAllNetworkHistorySegmentsResponse) ProtoMessage() {} func (x *ListAllNetworkHistorySegmentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[297] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[307] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18088,7 +18804,7 @@ func (x *ListAllNetworkHistorySegmentsResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use ListAllNetworkHistorySegmentsResponse.ProtoReflect.Descriptor instead. func (*ListAllNetworkHistorySegmentsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{297} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{307} } func (x *ListAllNetworkHistorySegmentsResponse) GetSegments() []*HistorySegment { @@ -18108,7 +18824,7 @@ type GetActiveNetworkHistoryPeerAddressesRequest struct { func (x *GetActiveNetworkHistoryPeerAddressesRequest) Reset() { *x = GetActiveNetworkHistoryPeerAddressesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[298] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[308] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18121,7 +18837,7 @@ func (x *GetActiveNetworkHistoryPeerAddressesRequest) String() string { func (*GetActiveNetworkHistoryPeerAddressesRequest) ProtoMessage() {} func (x *GetActiveNetworkHistoryPeerAddressesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[298] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[308] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18134,7 +18850,7 @@ func (x *GetActiveNetworkHistoryPeerAddressesRequest) ProtoReflect() protoreflec // Deprecated: Use GetActiveNetworkHistoryPeerAddressesRequest.ProtoReflect.Descriptor instead. func (*GetActiveNetworkHistoryPeerAddressesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{298} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{308} } // Response containing the addresses of active network history peers @@ -18150,7 +18866,7 @@ type GetActiveNetworkHistoryPeerAddressesResponse struct { func (x *GetActiveNetworkHistoryPeerAddressesResponse) Reset() { *x = GetActiveNetworkHistoryPeerAddressesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[299] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[309] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18163,7 +18879,7 @@ func (x *GetActiveNetworkHistoryPeerAddressesResponse) String() string { func (*GetActiveNetworkHistoryPeerAddressesResponse) ProtoMessage() {} func (x *GetActiveNetworkHistoryPeerAddressesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[299] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[309] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18176,7 +18892,7 @@ func (x *GetActiveNetworkHistoryPeerAddressesResponse) ProtoReflect() protorefle // Deprecated: Use GetActiveNetworkHistoryPeerAddressesResponse.ProtoReflect.Descriptor instead. func (*GetActiveNetworkHistoryPeerAddressesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{299} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{309} } func (x *GetActiveNetworkHistoryPeerAddressesResponse) GetIpAddresses() []string { @@ -18196,7 +18912,7 @@ type GetNetworkHistoryStatusRequest struct { func (x *GetNetworkHistoryStatusRequest) Reset() { *x = GetNetworkHistoryStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[300] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[310] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18209,7 +18925,7 @@ func (x *GetNetworkHistoryStatusRequest) String() string { func (*GetNetworkHistoryStatusRequest) ProtoMessage() {} func (x *GetNetworkHistoryStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[300] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[310] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18222,7 +18938,7 @@ func (x *GetNetworkHistoryStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNetworkHistoryStatusRequest.ProtoReflect.Descriptor instead. func (*GetNetworkHistoryStatusRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{300} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{310} } // Response containing the status of network history @@ -18244,7 +18960,7 @@ type GetNetworkHistoryStatusResponse struct { func (x *GetNetworkHistoryStatusResponse) Reset() { *x = GetNetworkHistoryStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[301] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[311] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18257,7 +18973,7 @@ func (x *GetNetworkHistoryStatusResponse) String() string { func (*GetNetworkHistoryStatusResponse) ProtoMessage() {} func (x *GetNetworkHistoryStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[301] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[311] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18270,7 +18986,7 @@ func (x *GetNetworkHistoryStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetNetworkHistoryStatusResponse.ProtoReflect.Descriptor instead. func (*GetNetworkHistoryStatusResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{301} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{311} } func (x *GetNetworkHistoryStatusResponse) GetIpfsAddress() string { @@ -18311,7 +19027,7 @@ type GetNetworkHistoryBootstrapPeersRequest struct { func (x *GetNetworkHistoryBootstrapPeersRequest) Reset() { *x = GetNetworkHistoryBootstrapPeersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[302] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[312] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18324,7 +19040,7 @@ func (x *GetNetworkHistoryBootstrapPeersRequest) String() string { func (*GetNetworkHistoryBootstrapPeersRequest) ProtoMessage() {} func (x *GetNetworkHistoryBootstrapPeersRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[302] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[312] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18337,7 +19053,7 @@ func (x *GetNetworkHistoryBootstrapPeersRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use GetNetworkHistoryBootstrapPeersRequest.ProtoReflect.Descriptor instead. func (*GetNetworkHistoryBootstrapPeersRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{302} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{312} } // Response containing the nodes network history bootstrap peers @@ -18353,7 +19069,7 @@ type GetNetworkHistoryBootstrapPeersResponse struct { func (x *GetNetworkHistoryBootstrapPeersResponse) Reset() { *x = GetNetworkHistoryBootstrapPeersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[303] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[313] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18366,7 +19082,7 @@ func (x *GetNetworkHistoryBootstrapPeersResponse) String() string { func (*GetNetworkHistoryBootstrapPeersResponse) ProtoMessage() {} func (x *GetNetworkHistoryBootstrapPeersResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[303] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[313] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18379,7 +19095,7 @@ func (x *GetNetworkHistoryBootstrapPeersResponse) ProtoReflect() protoreflect.Me // Deprecated: Use GetNetworkHistoryBootstrapPeersResponse.ProtoReflect.Descriptor instead. func (*GetNetworkHistoryBootstrapPeersResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{303} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{313} } func (x *GetNetworkHistoryBootstrapPeersResponse) GetBootstrapPeers() []string { @@ -18410,7 +19126,7 @@ type ExportNetworkHistoryRequest struct { func (x *ExportNetworkHistoryRequest) Reset() { *x = ExportNetworkHistoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[304] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[314] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18423,7 +19139,7 @@ func (x *ExportNetworkHistoryRequest) String() string { func (*ExportNetworkHistoryRequest) ProtoMessage() {} func (x *ExportNetworkHistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[304] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[314] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18436,7 +19152,7 @@ func (x *ExportNetworkHistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportNetworkHistoryRequest.ProtoReflect.Descriptor instead. func (*ExportNetworkHistoryRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{304} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{314} } func (x *ExportNetworkHistoryRequest) GetFromBlock() int64 { @@ -18473,7 +19189,7 @@ type ListEntitiesRequest struct { func (x *ListEntitiesRequest) Reset() { *x = ListEntitiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[305] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[315] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18486,7 +19202,7 @@ func (x *ListEntitiesRequest) String() string { func (*ListEntitiesRequest) ProtoMessage() {} func (x *ListEntitiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[305] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[315] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18499,7 +19215,7 @@ func (x *ListEntitiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEntitiesRequest.ProtoReflect.Descriptor instead. func (*ListEntitiesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{305} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{315} } func (x *ListEntitiesRequest) GetTransactionHash() string { @@ -18548,7 +19264,7 @@ type ListEntitiesResponse struct { func (x *ListEntitiesResponse) Reset() { *x = ListEntitiesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[306] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[316] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18561,7 +19277,7 @@ func (x *ListEntitiesResponse) String() string { func (*ListEntitiesResponse) ProtoMessage() {} func (x *ListEntitiesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[306] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[316] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18574,7 +19290,7 @@ func (x *ListEntitiesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListEntitiesResponse.ProtoReflect.Descriptor instead. func (*ListEntitiesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{306} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{316} } func (x *ListEntitiesResponse) GetAccounts() []*vega.Account { @@ -18788,7 +19504,7 @@ type GetPartyActivityStreakRequest struct { func (x *GetPartyActivityStreakRequest) Reset() { *x = GetPartyActivityStreakRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[307] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[317] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18801,7 +19517,7 @@ func (x *GetPartyActivityStreakRequest) String() string { func (*GetPartyActivityStreakRequest) ProtoMessage() {} func (x *GetPartyActivityStreakRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[307] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[317] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18814,7 +19530,7 @@ func (x *GetPartyActivityStreakRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPartyActivityStreakRequest.ProtoReflect.Descriptor instead. func (*GetPartyActivityStreakRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{307} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{317} } func (x *GetPartyActivityStreakRequest) GetPartyId() string { @@ -18844,7 +19560,7 @@ type GetPartyActivityStreakResponse struct { func (x *GetPartyActivityStreakResponse) Reset() { *x = GetPartyActivityStreakResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[308] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[318] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18857,7 +19573,7 @@ func (x *GetPartyActivityStreakResponse) String() string { func (*GetPartyActivityStreakResponse) ProtoMessage() {} func (x *GetPartyActivityStreakResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[308] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[318] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18870,7 +19586,7 @@ func (x *GetPartyActivityStreakResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetPartyActivityStreakResponse.ProtoReflect.Descriptor instead. func (*GetPartyActivityStreakResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{308} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{318} } func (x *GetPartyActivityStreakResponse) GetActivityStreak() *v1.PartyActivityStreak { @@ -18901,7 +19617,7 @@ type FundingPayment struct { func (x *FundingPayment) Reset() { *x = FundingPayment{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[309] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[319] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18914,7 +19630,7 @@ func (x *FundingPayment) String() string { func (*FundingPayment) ProtoMessage() {} func (x *FundingPayment) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[309] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[319] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -18927,7 +19643,7 @@ func (x *FundingPayment) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPayment.ProtoReflect.Descriptor instead. func (*FundingPayment) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{309} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{319} } func (x *FundingPayment) GetPartyId() string { @@ -18982,7 +19698,7 @@ type ListFundingPaymentsRequest struct { func (x *ListFundingPaymentsRequest) Reset() { *x = ListFundingPaymentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[310] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[320] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -18995,7 +19711,7 @@ func (x *ListFundingPaymentsRequest) String() string { func (*ListFundingPaymentsRequest) ProtoMessage() {} func (x *ListFundingPaymentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[310] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[320] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19008,7 +19724,7 @@ func (x *ListFundingPaymentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFundingPaymentsRequest.ProtoReflect.Descriptor instead. func (*ListFundingPaymentsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{310} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{320} } func (x *ListFundingPaymentsRequest) GetPartyId() string { @@ -19047,7 +19763,7 @@ type FundingPaymentEdge struct { func (x *FundingPaymentEdge) Reset() { *x = FundingPaymentEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[311] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[321] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19060,7 +19776,7 @@ func (x *FundingPaymentEdge) String() string { func (*FundingPaymentEdge) ProtoMessage() {} func (x *FundingPaymentEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[311] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[321] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19073,7 +19789,7 @@ func (x *FundingPaymentEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPaymentEdge.ProtoReflect.Descriptor instead. func (*FundingPaymentEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{311} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{321} } func (x *FundingPaymentEdge) GetNode() *FundingPayment { @@ -19105,7 +19821,7 @@ type FundingPaymentConnection struct { func (x *FundingPaymentConnection) Reset() { *x = FundingPaymentConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[312] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[322] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19118,7 +19834,7 @@ func (x *FundingPaymentConnection) String() string { func (*FundingPaymentConnection) ProtoMessage() {} func (x *FundingPaymentConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[312] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[322] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19131,7 +19847,7 @@ func (x *FundingPaymentConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPaymentConnection.ProtoReflect.Descriptor instead. func (*FundingPaymentConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{312} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{322} } func (x *FundingPaymentConnection) GetEdges() []*FundingPaymentEdge { @@ -19161,7 +19877,7 @@ type ListFundingPaymentsResponse struct { func (x *ListFundingPaymentsResponse) Reset() { *x = ListFundingPaymentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[313] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[323] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19174,7 +19890,7 @@ func (x *ListFundingPaymentsResponse) String() string { func (*ListFundingPaymentsResponse) ProtoMessage() {} func (x *ListFundingPaymentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[313] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[323] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19187,7 +19903,7 @@ func (x *ListFundingPaymentsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFundingPaymentsResponse.ProtoReflect.Descriptor instead. func (*ListFundingPaymentsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{313} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{323} } func (x *ListFundingPaymentsResponse) GetFundingPayments() *FundingPaymentConnection { @@ -19214,7 +19930,7 @@ type ListFundingPeriodsRequest struct { func (x *ListFundingPeriodsRequest) Reset() { *x = ListFundingPeriodsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[314] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[324] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19227,7 +19943,7 @@ func (x *ListFundingPeriodsRequest) String() string { func (*ListFundingPeriodsRequest) ProtoMessage() {} func (x *ListFundingPeriodsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[314] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[324] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19240,7 +19956,7 @@ func (x *ListFundingPeriodsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFundingPeriodsRequest.ProtoReflect.Descriptor instead. func (*ListFundingPeriodsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{314} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{324} } func (x *ListFundingPeriodsRequest) GetMarketId() string { @@ -19279,7 +19995,7 @@ type FundingPeriodEdge struct { func (x *FundingPeriodEdge) Reset() { *x = FundingPeriodEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[315] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[325] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19292,7 +20008,7 @@ func (x *FundingPeriodEdge) String() string { func (*FundingPeriodEdge) ProtoMessage() {} func (x *FundingPeriodEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[315] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[325] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19305,7 +20021,7 @@ func (x *FundingPeriodEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPeriodEdge.ProtoReflect.Descriptor instead. func (*FundingPeriodEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{315} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{325} } func (x *FundingPeriodEdge) GetNode() *v1.FundingPeriod { @@ -19337,7 +20053,7 @@ type FundingPeriodConnection struct { func (x *FundingPeriodConnection) Reset() { *x = FundingPeriodConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[316] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[326] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19350,7 +20066,7 @@ func (x *FundingPeriodConnection) String() string { func (*FundingPeriodConnection) ProtoMessage() {} func (x *FundingPeriodConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[316] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[326] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19363,7 +20079,7 @@ func (x *FundingPeriodConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPeriodConnection.ProtoReflect.Descriptor instead. func (*FundingPeriodConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{316} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{326} } func (x *FundingPeriodConnection) GetEdges() []*FundingPeriodEdge { @@ -19393,7 +20109,7 @@ type ListFundingPeriodsResponse struct { func (x *ListFundingPeriodsResponse) Reset() { *x = ListFundingPeriodsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[317] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[327] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19406,7 +20122,7 @@ func (x *ListFundingPeriodsResponse) String() string { func (*ListFundingPeriodsResponse) ProtoMessage() {} func (x *ListFundingPeriodsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[317] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[327] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19419,7 +20135,7 @@ func (x *ListFundingPeriodsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFundingPeriodsResponse.ProtoReflect.Descriptor instead. func (*ListFundingPeriodsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{317} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{327} } func (x *ListFundingPeriodsResponse) GetFundingPeriods() *FundingPeriodConnection { @@ -19449,7 +20165,7 @@ type ListFundingPeriodDataPointsRequest struct { func (x *ListFundingPeriodDataPointsRequest) Reset() { *x = ListFundingPeriodDataPointsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[318] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[328] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19462,7 +20178,7 @@ func (x *ListFundingPeriodDataPointsRequest) String() string { func (*ListFundingPeriodDataPointsRequest) ProtoMessage() {} func (x *ListFundingPeriodDataPointsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[318] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[328] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19475,7 +20191,7 @@ func (x *ListFundingPeriodDataPointsRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ListFundingPeriodDataPointsRequest.ProtoReflect.Descriptor instead. func (*ListFundingPeriodDataPointsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{318} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{328} } func (x *ListFundingPeriodDataPointsRequest) GetMarketId() string { @@ -19528,7 +20244,7 @@ type FundingPeriodDataPointEdge struct { func (x *FundingPeriodDataPointEdge) Reset() { *x = FundingPeriodDataPointEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[319] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[329] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19541,7 +20257,7 @@ func (x *FundingPeriodDataPointEdge) String() string { func (*FundingPeriodDataPointEdge) ProtoMessage() {} func (x *FundingPeriodDataPointEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[319] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[329] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19554,7 +20270,7 @@ func (x *FundingPeriodDataPointEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPeriodDataPointEdge.ProtoReflect.Descriptor instead. func (*FundingPeriodDataPointEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{319} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{329} } func (x *FundingPeriodDataPointEdge) GetNode() *v1.FundingPeriodDataPoint { @@ -19586,7 +20302,7 @@ type FundingPeriodDataPointConnection struct { func (x *FundingPeriodDataPointConnection) Reset() { *x = FundingPeriodDataPointConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[320] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[330] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19599,7 +20315,7 @@ func (x *FundingPeriodDataPointConnection) String() string { func (*FundingPeriodDataPointConnection) ProtoMessage() {} func (x *FundingPeriodDataPointConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[320] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[330] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19612,7 +20328,7 @@ func (x *FundingPeriodDataPointConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use FundingPeriodDataPointConnection.ProtoReflect.Descriptor instead. func (*FundingPeriodDataPointConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{320} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{330} } func (x *FundingPeriodDataPointConnection) GetEdges() []*FundingPeriodDataPointEdge { @@ -19642,7 +20358,7 @@ type ListFundingPeriodDataPointsResponse struct { func (x *ListFundingPeriodDataPointsResponse) Reset() { *x = ListFundingPeriodDataPointsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[321] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[331] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19655,7 +20371,7 @@ func (x *ListFundingPeriodDataPointsResponse) String() string { func (*ListFundingPeriodDataPointsResponse) ProtoMessage() {} func (x *ListFundingPeriodDataPointsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[321] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[331] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19668,7 +20384,7 @@ func (x *ListFundingPeriodDataPointsResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use ListFundingPeriodDataPointsResponse.ProtoReflect.Descriptor instead. func (*ListFundingPeriodDataPointsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{321} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{331} } func (x *ListFundingPeriodDataPointsResponse) GetFundingPeriodDataPoints() *FundingPeriodDataPointConnection { @@ -19688,7 +20404,7 @@ type PingRequest struct { func (x *PingRequest) Reset() { *x = PingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[322] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[332] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19701,7 +20417,7 @@ func (x *PingRequest) String() string { func (*PingRequest) ProtoMessage() {} func (x *PingRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[322] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[332] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19714,7 +20430,7 @@ func (x *PingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PingRequest.ProtoReflect.Descriptor instead. func (*PingRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{322} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{332} } // Ping response from the data node @@ -19727,7 +20443,7 @@ type PingResponse struct { func (x *PingResponse) Reset() { *x = PingResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[323] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[333] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19740,7 +20456,7 @@ func (x *PingResponse) String() string { func (*PingResponse) ProtoMessage() {} func (x *PingResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[323] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[333] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19753,7 +20469,7 @@ func (x *PingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PingResponse.ProtoReflect.Descriptor instead. func (*PingResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{323} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{333} } // Basic description of an order. @@ -19776,7 +20492,7 @@ type OrderInfo struct { func (x *OrderInfo) Reset() { *x = OrderInfo{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[324] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[334] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19789,7 +20505,7 @@ func (x *OrderInfo) String() string { func (*OrderInfo) ProtoMessage() {} func (x *OrderInfo) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[324] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[334] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19802,7 +20518,7 @@ func (x *OrderInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OrderInfo.ProtoReflect.Descriptor instead. func (*OrderInfo) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{324} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{334} } func (x *OrderInfo) GetSide() vega.Side { @@ -19868,7 +20584,7 @@ type EstimatePositionRequest struct { func (x *EstimatePositionRequest) Reset() { *x = EstimatePositionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[325] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[335] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -19881,7 +20597,7 @@ func (x *EstimatePositionRequest) String() string { func (*EstimatePositionRequest) ProtoMessage() {} func (x *EstimatePositionRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[325] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[335] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -19894,7 +20610,7 @@ func (x *EstimatePositionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimatePositionRequest.ProtoReflect.Descriptor instead. func (*EstimatePositionRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{325} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{335} } func (x *EstimatePositionRequest) GetMarketId() string { @@ -19991,7 +20707,7 @@ type EstimatePositionResponse struct { func (x *EstimatePositionResponse) Reset() { *x = EstimatePositionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[326] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[336] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20004,7 +20720,7 @@ func (x *EstimatePositionResponse) String() string { func (*EstimatePositionResponse) ProtoMessage() {} func (x *EstimatePositionResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[326] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[336] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20017,7 +20733,7 @@ func (x *EstimatePositionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimatePositionResponse.ProtoReflect.Descriptor instead. func (*EstimatePositionResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{326} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{336} } func (x *EstimatePositionResponse) GetMargin() *MarginEstimate { @@ -20056,7 +20772,7 @@ type CollateralIncreaseEstimate struct { func (x *CollateralIncreaseEstimate) Reset() { *x = CollateralIncreaseEstimate{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[327] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[337] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20069,7 +20785,7 @@ func (x *CollateralIncreaseEstimate) String() string { func (*CollateralIncreaseEstimate) ProtoMessage() {} func (x *CollateralIncreaseEstimate) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[327] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[337] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20082,7 +20798,7 @@ func (x *CollateralIncreaseEstimate) ProtoReflect() protoreflect.Message { // Deprecated: Use CollateralIncreaseEstimate.ProtoReflect.Descriptor instead. func (*CollateralIncreaseEstimate) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{327} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{337} } func (x *CollateralIncreaseEstimate) GetWorstCase() string { @@ -20114,7 +20830,7 @@ type MarginEstimate struct { func (x *MarginEstimate) Reset() { *x = MarginEstimate{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[328] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[338] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20127,7 +20843,7 @@ func (x *MarginEstimate) String() string { func (*MarginEstimate) ProtoMessage() {} func (x *MarginEstimate) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[328] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[338] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20140,7 +20856,7 @@ func (x *MarginEstimate) ProtoReflect() protoreflect.Message { // Deprecated: Use MarginEstimate.ProtoReflect.Descriptor instead. func (*MarginEstimate) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{328} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{338} } func (x *MarginEstimate) GetWorstCase() *vega.MarginLevels { @@ -20172,7 +20888,7 @@ type LiquidationEstimate struct { func (x *LiquidationEstimate) Reset() { *x = LiquidationEstimate{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[329] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[339] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20185,7 +20901,7 @@ func (x *LiquidationEstimate) String() string { func (*LiquidationEstimate) ProtoMessage() {} func (x *LiquidationEstimate) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[329] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[339] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20198,7 +20914,7 @@ func (x *LiquidationEstimate) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidationEstimate.ProtoReflect.Descriptor instead. func (*LiquidationEstimate) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{329} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{339} } func (x *LiquidationEstimate) GetWorstCase() *LiquidationPrice { @@ -20232,7 +20948,7 @@ type LiquidationPrice struct { func (x *LiquidationPrice) Reset() { *x = LiquidationPrice{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[330] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[340] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20245,7 +20961,7 @@ func (x *LiquidationPrice) String() string { func (*LiquidationPrice) ProtoMessage() {} func (x *LiquidationPrice) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[330] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[340] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20258,7 +20974,7 @@ func (x *LiquidationPrice) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidationPrice.ProtoReflect.Descriptor instead. func (*LiquidationPrice) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{330} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{340} } func (x *LiquidationPrice) GetOpenVolumeOnly() string { @@ -20292,7 +21008,7 @@ type GetCurrentReferralProgramRequest struct { func (x *GetCurrentReferralProgramRequest) Reset() { *x = GetCurrentReferralProgramRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[331] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[341] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20305,7 +21021,7 @@ func (x *GetCurrentReferralProgramRequest) String() string { func (*GetCurrentReferralProgramRequest) ProtoMessage() {} func (x *GetCurrentReferralProgramRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[331] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[341] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20318,7 +21034,7 @@ func (x *GetCurrentReferralProgramRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCurrentReferralProgramRequest.ProtoReflect.Descriptor instead. func (*GetCurrentReferralProgramRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{331} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{341} } // Response containing the current referral program @@ -20334,7 +21050,7 @@ type GetCurrentReferralProgramResponse struct { func (x *GetCurrentReferralProgramResponse) Reset() { *x = GetCurrentReferralProgramResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[332] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[342] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20347,7 +21063,7 @@ func (x *GetCurrentReferralProgramResponse) String() string { func (*GetCurrentReferralProgramResponse) ProtoMessage() {} func (x *GetCurrentReferralProgramResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[332] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[342] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20360,7 +21076,7 @@ func (x *GetCurrentReferralProgramResponse) ProtoReflect() protoreflect.Message // Deprecated: Use GetCurrentReferralProgramResponse.ProtoReflect.Descriptor instead. func (*GetCurrentReferralProgramResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{332} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{342} } func (x *GetCurrentReferralProgramResponse) GetCurrentReferralProgram() *ReferralProgram { @@ -20399,7 +21115,7 @@ type ReferralProgram struct { func (x *ReferralProgram) Reset() { *x = ReferralProgram{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[333] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[343] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20412,7 +21128,7 @@ func (x *ReferralProgram) String() string { func (*ReferralProgram) ProtoMessage() {} func (x *ReferralProgram) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[333] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[343] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20425,7 +21141,7 @@ func (x *ReferralProgram) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralProgram.ProtoReflect.Descriptor instead. func (*ReferralProgram) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{333} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{343} } func (x *ReferralProgram) GetVersion() uint64 { @@ -20498,7 +21214,7 @@ type ReferralSet struct { func (x *ReferralSet) Reset() { *x = ReferralSet{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[334] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[344] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20511,7 +21227,7 @@ func (x *ReferralSet) String() string { func (*ReferralSet) ProtoMessage() {} func (x *ReferralSet) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[334] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[344] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20524,7 +21240,7 @@ func (x *ReferralSet) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSet.ProtoReflect.Descriptor instead. func (*ReferralSet) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{334} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{344} } func (x *ReferralSet) GetId() string { @@ -20577,7 +21293,7 @@ type ReferralSetEdge struct { func (x *ReferralSetEdge) Reset() { *x = ReferralSetEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[335] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[345] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20590,7 +21306,7 @@ func (x *ReferralSetEdge) String() string { func (*ReferralSetEdge) ProtoMessage() {} func (x *ReferralSetEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[335] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[345] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20603,7 +21319,7 @@ func (x *ReferralSetEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetEdge.ProtoReflect.Descriptor instead. func (*ReferralSetEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{335} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{345} } func (x *ReferralSetEdge) GetNode() *ReferralSet { @@ -20635,7 +21351,7 @@ type ReferralSetConnection struct { func (x *ReferralSetConnection) Reset() { *x = ReferralSetConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[336] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[346] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20648,7 +21364,7 @@ func (x *ReferralSetConnection) String() string { func (*ReferralSetConnection) ProtoMessage() {} func (x *ReferralSetConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[336] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[346] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20661,7 +21377,7 @@ func (x *ReferralSetConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetConnection.ProtoReflect.Descriptor instead. func (*ReferralSetConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{336} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{346} } func (x *ReferralSetConnection) GetEdges() []*ReferralSetEdge { @@ -20697,7 +21413,7 @@ type ListReferralSetsRequest struct { func (x *ListReferralSetsRequest) Reset() { *x = ListReferralSetsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[337] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[347] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20710,7 +21426,7 @@ func (x *ListReferralSetsRequest) String() string { func (*ListReferralSetsRequest) ProtoMessage() {} func (x *ListReferralSetsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[337] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[347] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20723,7 +21439,7 @@ func (x *ListReferralSetsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReferralSetsRequest.ProtoReflect.Descriptor instead. func (*ListReferralSetsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{337} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{347} } func (x *ListReferralSetsRequest) GetReferralSetId() string { @@ -20767,7 +21483,7 @@ type ListReferralSetsResponse struct { func (x *ListReferralSetsResponse) Reset() { *x = ListReferralSetsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[338] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[348] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20780,7 +21496,7 @@ func (x *ListReferralSetsResponse) String() string { func (*ListReferralSetsResponse) ProtoMessage() {} func (x *ListReferralSetsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[338] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[348] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20793,7 +21509,7 @@ func (x *ListReferralSetsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReferralSetsResponse.ProtoReflect.Descriptor instead. func (*ListReferralSetsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{338} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{348} } func (x *ListReferralSetsResponse) GetReferralSets() *ReferralSetConnection { @@ -20826,7 +21542,7 @@ type ReferralSetReferee struct { func (x *ReferralSetReferee) Reset() { *x = ReferralSetReferee{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[339] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[349] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20839,7 +21555,7 @@ func (x *ReferralSetReferee) String() string { func (*ReferralSetReferee) ProtoMessage() {} func (x *ReferralSetReferee) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[339] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[349] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20852,7 +21568,7 @@ func (x *ReferralSetReferee) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetReferee.ProtoReflect.Descriptor instead. func (*ReferralSetReferee) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{339} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{349} } func (x *ReferralSetReferee) GetReferralSetId() string { @@ -20912,7 +21628,7 @@ type ReferralSetRefereeEdge struct { func (x *ReferralSetRefereeEdge) Reset() { *x = ReferralSetRefereeEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[340] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[350] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20925,7 +21641,7 @@ func (x *ReferralSetRefereeEdge) String() string { func (*ReferralSetRefereeEdge) ProtoMessage() {} func (x *ReferralSetRefereeEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[340] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[350] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20938,7 +21654,7 @@ func (x *ReferralSetRefereeEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetRefereeEdge.ProtoReflect.Descriptor instead. func (*ReferralSetRefereeEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{340} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{350} } func (x *ReferralSetRefereeEdge) GetNode() *ReferralSetReferee { @@ -20970,7 +21686,7 @@ type ReferralSetRefereeConnection struct { func (x *ReferralSetRefereeConnection) Reset() { *x = ReferralSetRefereeConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[341] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[351] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -20983,7 +21699,7 @@ func (x *ReferralSetRefereeConnection) String() string { func (*ReferralSetRefereeConnection) ProtoMessage() {} func (x *ReferralSetRefereeConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[341] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[351] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -20996,7 +21712,7 @@ func (x *ReferralSetRefereeConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetRefereeConnection.ProtoReflect.Descriptor instead. func (*ReferralSetRefereeConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{341} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{351} } func (x *ReferralSetRefereeConnection) GetEdges() []*ReferralSetRefereeEdge { @@ -21034,7 +21750,7 @@ type ListReferralSetRefereesRequest struct { func (x *ListReferralSetRefereesRequest) Reset() { *x = ListReferralSetRefereesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[342] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[352] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21047,7 +21763,7 @@ func (x *ListReferralSetRefereesRequest) String() string { func (*ListReferralSetRefereesRequest) ProtoMessage() {} func (x *ListReferralSetRefereesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[342] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[352] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21060,7 +21776,7 @@ func (x *ListReferralSetRefereesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReferralSetRefereesRequest.ProtoReflect.Descriptor instead. func (*ListReferralSetRefereesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{342} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{352} } func (x *ListReferralSetRefereesRequest) GetReferralSetId() string { @@ -21111,7 +21827,7 @@ type ListReferralSetRefereesResponse struct { func (x *ListReferralSetRefereesResponse) Reset() { *x = ListReferralSetRefereesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[343] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[353] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21124,7 +21840,7 @@ func (x *ListReferralSetRefereesResponse) String() string { func (*ListReferralSetRefereesResponse) ProtoMessage() {} func (x *ListReferralSetRefereesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[343] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[353] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21137,7 +21853,7 @@ func (x *ListReferralSetRefereesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReferralSetRefereesResponse.ProtoReflect.Descriptor instead. func (*ListReferralSetRefereesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{343} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{353} } func (x *ListReferralSetRefereesResponse) GetReferralSetReferees() *ReferralSetRefereeConnection { @@ -21166,7 +21882,7 @@ type GetReferralSetStatsRequest struct { func (x *GetReferralSetStatsRequest) Reset() { *x = GetReferralSetStatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[344] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[354] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21179,7 +21895,7 @@ func (x *GetReferralSetStatsRequest) String() string { func (*GetReferralSetStatsRequest) ProtoMessage() {} func (x *GetReferralSetStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[344] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[354] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21192,7 +21908,7 @@ func (x *GetReferralSetStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetReferralSetStatsRequest.ProtoReflect.Descriptor instead. func (*GetReferralSetStatsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{344} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{354} } func (x *GetReferralSetStatsRequest) GetReferralSetId() string { @@ -21236,7 +21952,7 @@ type GetReferralSetStatsResponse struct { func (x *GetReferralSetStatsResponse) Reset() { *x = GetReferralSetStatsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[345] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[355] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21249,7 +21965,7 @@ func (x *GetReferralSetStatsResponse) String() string { func (*GetReferralSetStatsResponse) ProtoMessage() {} func (x *GetReferralSetStatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[345] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[355] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21262,7 +21978,7 @@ func (x *GetReferralSetStatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetReferralSetStatsResponse.ProtoReflect.Descriptor instead. func (*GetReferralSetStatsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{345} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{355} } func (x *GetReferralSetStatsResponse) GetStats() *ReferralSetStatsConnection { @@ -21287,7 +22003,7 @@ type ReferralSetStatsConnection struct { func (x *ReferralSetStatsConnection) Reset() { *x = ReferralSetStatsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[346] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[356] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21300,7 +22016,7 @@ func (x *ReferralSetStatsConnection) String() string { func (*ReferralSetStatsConnection) ProtoMessage() {} func (x *ReferralSetStatsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[346] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[356] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21313,7 +22029,7 @@ func (x *ReferralSetStatsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetStatsConnection.ProtoReflect.Descriptor instead. func (*ReferralSetStatsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{346} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{356} } func (x *ReferralSetStatsConnection) GetEdges() []*ReferralSetStatsEdge { @@ -21345,7 +22061,7 @@ type ReferralSetStatsEdge struct { func (x *ReferralSetStatsEdge) Reset() { *x = ReferralSetStatsEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[347] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[357] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21358,7 +22074,7 @@ func (x *ReferralSetStatsEdge) String() string { func (*ReferralSetStatsEdge) ProtoMessage() {} func (x *ReferralSetStatsEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[347] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[357] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21371,7 +22087,7 @@ func (x *ReferralSetStatsEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetStatsEdge.ProtoReflect.Descriptor instead. func (*ReferralSetStatsEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{347} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{357} } func (x *ReferralSetStatsEdge) GetNode() *ReferralSetStats { @@ -21420,7 +22136,7 @@ type ReferralSetStats struct { func (x *ReferralSetStats) Reset() { *x = ReferralSetStats{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[348] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[358] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21433,7 +22149,7 @@ func (x *ReferralSetStats) String() string { func (*ReferralSetStats) ProtoMessage() {} func (x *ReferralSetStats) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[348] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[358] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21446,7 +22162,7 @@ func (x *ReferralSetStats) ProtoReflect() protoreflect.Message { // Deprecated: Use ReferralSetStats.ProtoReflect.Descriptor instead. func (*ReferralSetStats) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{348} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{358} } func (x *ReferralSetStats) GetAtEpoch() uint64 { @@ -21552,7 +22268,7 @@ type Team struct { func (x *Team) Reset() { *x = Team{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[349] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[359] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21565,7 +22281,7 @@ func (x *Team) String() string { func (*Team) ProtoMessage() {} func (x *Team) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[349] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[359] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21578,7 +22294,7 @@ func (x *Team) ProtoReflect() protoreflect.Message { // Deprecated: Use Team.ProtoReflect.Descriptor instead. func (*Team) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{349} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{359} } func (x *Team) GetTeamId() string { @@ -21666,7 +22382,7 @@ type TeamEdge struct { func (x *TeamEdge) Reset() { *x = TeamEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[350] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[360] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21679,7 +22395,7 @@ func (x *TeamEdge) String() string { func (*TeamEdge) ProtoMessage() {} func (x *TeamEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[350] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[360] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21692,7 +22408,7 @@ func (x *TeamEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamEdge.ProtoReflect.Descriptor instead. func (*TeamEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{350} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{360} } func (x *TeamEdge) GetNode() *Team { @@ -21724,7 +22440,7 @@ type TeamConnection struct { func (x *TeamConnection) Reset() { *x = TeamConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[351] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[361] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21737,7 +22453,7 @@ func (x *TeamConnection) String() string { func (*TeamConnection) ProtoMessage() {} func (x *TeamConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[351] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[361] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21750,7 +22466,7 @@ func (x *TeamConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamConnection.ProtoReflect.Descriptor instead. func (*TeamConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{351} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{361} } func (x *TeamConnection) GetEdges() []*TeamEdge { @@ -21784,7 +22500,7 @@ type ListTeamsRequest struct { func (x *ListTeamsRequest) Reset() { *x = ListTeamsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[352] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[362] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21797,7 +22513,7 @@ func (x *ListTeamsRequest) String() string { func (*ListTeamsRequest) ProtoMessage() {} func (x *ListTeamsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[352] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[362] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21810,7 +22526,7 @@ func (x *ListTeamsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamsRequest.ProtoReflect.Descriptor instead. func (*ListTeamsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{352} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{362} } func (x *ListTeamsRequest) GetTeamId() string { @@ -21847,7 +22563,7 @@ type ListTeamsResponse struct { func (x *ListTeamsResponse) Reset() { *x = ListTeamsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[353] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[363] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21860,7 +22576,7 @@ func (x *ListTeamsResponse) String() string { func (*ListTeamsResponse) ProtoMessage() {} func (x *ListTeamsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[353] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[363] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21873,7 +22589,7 @@ func (x *ListTeamsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamsResponse.ProtoReflect.Descriptor instead. func (*ListTeamsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{353} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{363} } func (x *ListTeamsResponse) GetTeams() *TeamConnection { @@ -21901,7 +22617,7 @@ type ListTeamsStatisticsRequest struct { func (x *ListTeamsStatisticsRequest) Reset() { *x = ListTeamsStatisticsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[354] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[364] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21914,7 +22630,7 @@ func (x *ListTeamsStatisticsRequest) String() string { func (*ListTeamsStatisticsRequest) ProtoMessage() {} func (x *ListTeamsStatisticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[354] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[364] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21927,7 +22643,7 @@ func (x *ListTeamsStatisticsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamsStatisticsRequest.ProtoReflect.Descriptor instead. func (*ListTeamsStatisticsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{354} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{364} } func (x *ListTeamsStatisticsRequest) GetTeamId() string { @@ -21964,7 +22680,7 @@ type ListTeamsStatisticsResponse struct { func (x *ListTeamsStatisticsResponse) Reset() { *x = ListTeamsStatisticsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[355] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[365] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -21977,7 +22693,7 @@ func (x *ListTeamsStatisticsResponse) String() string { func (*ListTeamsStatisticsResponse) ProtoMessage() {} func (x *ListTeamsStatisticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[355] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[365] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -21990,7 +22706,7 @@ func (x *ListTeamsStatisticsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamsStatisticsResponse.ProtoReflect.Descriptor instead. func (*ListTeamsStatisticsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{355} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{365} } func (x *ListTeamsStatisticsResponse) GetStatistics() *TeamsStatisticsConnection { @@ -22015,7 +22731,7 @@ type TeamsStatisticsConnection struct { func (x *TeamsStatisticsConnection) Reset() { *x = TeamsStatisticsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[356] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[366] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22028,7 +22744,7 @@ func (x *TeamsStatisticsConnection) String() string { func (*TeamsStatisticsConnection) ProtoMessage() {} func (x *TeamsStatisticsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[356] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[366] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22041,7 +22757,7 @@ func (x *TeamsStatisticsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamsStatisticsConnection.ProtoReflect.Descriptor instead. func (*TeamsStatisticsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{356} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{366} } func (x *TeamsStatisticsConnection) GetEdges() []*TeamStatisticsEdge { @@ -22073,7 +22789,7 @@ type TeamStatisticsEdge struct { func (x *TeamStatisticsEdge) Reset() { *x = TeamStatisticsEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[357] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[367] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22086,7 +22802,7 @@ func (x *TeamStatisticsEdge) String() string { func (*TeamStatisticsEdge) ProtoMessage() {} func (x *TeamStatisticsEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[357] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[367] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22099,7 +22815,7 @@ func (x *TeamStatisticsEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamStatisticsEdge.ProtoReflect.Descriptor instead. func (*TeamStatisticsEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{357} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{367} } func (x *TeamStatisticsEdge) GetNode() *TeamStatistics { @@ -22145,7 +22861,7 @@ type TeamStatistics struct { func (x *TeamStatistics) Reset() { *x = TeamStatistics{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[358] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[368] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22158,7 +22874,7 @@ func (x *TeamStatistics) String() string { func (*TeamStatistics) ProtoMessage() {} func (x *TeamStatistics) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[358] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[368] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22171,7 +22887,7 @@ func (x *TeamStatistics) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamStatistics.ProtoReflect.Descriptor instead. func (*TeamStatistics) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{358} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{368} } func (x *TeamStatistics) GetTeamId() string { @@ -22237,7 +22953,7 @@ type QuantumRewardsPerEpoch struct { func (x *QuantumRewardsPerEpoch) Reset() { *x = QuantumRewardsPerEpoch{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[359] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[369] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22250,7 +22966,7 @@ func (x *QuantumRewardsPerEpoch) String() string { func (*QuantumRewardsPerEpoch) ProtoMessage() {} func (x *QuantumRewardsPerEpoch) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[359] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[369] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22263,7 +22979,7 @@ func (x *QuantumRewardsPerEpoch) ProtoReflect() protoreflect.Message { // Deprecated: Use QuantumRewardsPerEpoch.ProtoReflect.Descriptor instead. func (*QuantumRewardsPerEpoch) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{359} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{369} } func (x *QuantumRewardsPerEpoch) GetEpoch() uint64 { @@ -22294,7 +23010,7 @@ type QuantumVolumesPerEpoch struct { func (x *QuantumVolumesPerEpoch) Reset() { *x = QuantumVolumesPerEpoch{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[360] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[370] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22307,7 +23023,7 @@ func (x *QuantumVolumesPerEpoch) String() string { func (*QuantumVolumesPerEpoch) ProtoMessage() {} func (x *QuantumVolumesPerEpoch) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[360] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[370] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22320,7 +23036,7 @@ func (x *QuantumVolumesPerEpoch) ProtoReflect() protoreflect.Message { // Deprecated: Use QuantumVolumesPerEpoch.ProtoReflect.Descriptor instead. func (*QuantumVolumesPerEpoch) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{360} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{370} } func (x *QuantumVolumesPerEpoch) GetEpoch() uint64 { @@ -22357,7 +23073,7 @@ type ListTeamMembersStatisticsRequest struct { func (x *ListTeamMembersStatisticsRequest) Reset() { *x = ListTeamMembersStatisticsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[361] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[371] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22370,7 +23086,7 @@ func (x *ListTeamMembersStatisticsRequest) String() string { func (*ListTeamMembersStatisticsRequest) ProtoMessage() {} func (x *ListTeamMembersStatisticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[361] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[371] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22383,7 +23099,7 @@ func (x *ListTeamMembersStatisticsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamMembersStatisticsRequest.ProtoReflect.Descriptor instead. func (*ListTeamMembersStatisticsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{361} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{371} } func (x *ListTeamMembersStatisticsRequest) GetTeamId() string { @@ -22427,7 +23143,7 @@ type ListTeamMembersStatisticsResponse struct { func (x *ListTeamMembersStatisticsResponse) Reset() { *x = ListTeamMembersStatisticsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[362] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[372] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22440,7 +23156,7 @@ func (x *ListTeamMembersStatisticsResponse) String() string { func (*ListTeamMembersStatisticsResponse) ProtoMessage() {} func (x *ListTeamMembersStatisticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[362] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[372] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22453,7 +23169,7 @@ func (x *ListTeamMembersStatisticsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ListTeamMembersStatisticsResponse.ProtoReflect.Descriptor instead. func (*ListTeamMembersStatisticsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{362} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{372} } func (x *ListTeamMembersStatisticsResponse) GetStatistics() *TeamMembersStatisticsConnection { @@ -22478,7 +23194,7 @@ type TeamMembersStatisticsConnection struct { func (x *TeamMembersStatisticsConnection) Reset() { *x = TeamMembersStatisticsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[363] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[373] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22491,7 +23207,7 @@ func (x *TeamMembersStatisticsConnection) String() string { func (*TeamMembersStatisticsConnection) ProtoMessage() {} func (x *TeamMembersStatisticsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[363] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[373] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22504,7 +23220,7 @@ func (x *TeamMembersStatisticsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamMembersStatisticsConnection.ProtoReflect.Descriptor instead. func (*TeamMembersStatisticsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{363} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{373} } func (x *TeamMembersStatisticsConnection) GetEdges() []*TeamMemberStatisticsEdge { @@ -22536,7 +23252,7 @@ type TeamMemberStatisticsEdge struct { func (x *TeamMemberStatisticsEdge) Reset() { *x = TeamMemberStatisticsEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[364] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[374] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22549,7 +23265,7 @@ func (x *TeamMemberStatisticsEdge) String() string { func (*TeamMemberStatisticsEdge) ProtoMessage() {} func (x *TeamMemberStatisticsEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[364] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[374] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22562,7 +23278,7 @@ func (x *TeamMemberStatisticsEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamMemberStatisticsEdge.ProtoReflect.Descriptor instead. func (*TeamMemberStatisticsEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{364} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{374} } func (x *TeamMemberStatisticsEdge) GetNode() *TeamMemberStatistics { @@ -22608,7 +23324,7 @@ type TeamMemberStatistics struct { func (x *TeamMemberStatistics) Reset() { *x = TeamMemberStatistics{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[365] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[375] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22621,7 +23337,7 @@ func (x *TeamMemberStatistics) String() string { func (*TeamMemberStatistics) ProtoMessage() {} func (x *TeamMemberStatistics) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[365] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[375] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22634,7 +23350,7 @@ func (x *TeamMemberStatistics) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamMemberStatistics.ProtoReflect.Descriptor instead. func (*TeamMemberStatistics) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{365} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{375} } func (x *TeamMemberStatistics) GetPartyId() string { @@ -22701,7 +23417,7 @@ type ListTeamRefereesRequest struct { func (x *ListTeamRefereesRequest) Reset() { *x = ListTeamRefereesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[366] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[376] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22714,7 +23430,7 @@ func (x *ListTeamRefereesRequest) String() string { func (*ListTeamRefereesRequest) ProtoMessage() {} func (x *ListTeamRefereesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[366] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[376] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22727,7 +23443,7 @@ func (x *ListTeamRefereesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamRefereesRequest.ProtoReflect.Descriptor instead. func (*ListTeamRefereesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{366} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{376} } func (x *ListTeamRefereesRequest) GetTeamId() string { @@ -22763,7 +23479,7 @@ type TeamReferee struct { func (x *TeamReferee) Reset() { *x = TeamReferee{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[367] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[377] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22776,7 +23492,7 @@ func (x *TeamReferee) String() string { func (*TeamReferee) ProtoMessage() {} func (x *TeamReferee) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[367] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[377] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22789,7 +23505,7 @@ func (x *TeamReferee) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamReferee.ProtoReflect.Descriptor instead. func (*TeamReferee) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{367} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{377} } func (x *TeamReferee) GetTeamId() string { @@ -22835,7 +23551,7 @@ type TeamRefereeEdge struct { func (x *TeamRefereeEdge) Reset() { *x = TeamRefereeEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[368] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[378] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22848,7 +23564,7 @@ func (x *TeamRefereeEdge) String() string { func (*TeamRefereeEdge) ProtoMessage() {} func (x *TeamRefereeEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[368] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[378] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22861,7 +23577,7 @@ func (x *TeamRefereeEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeEdge.ProtoReflect.Descriptor instead. func (*TeamRefereeEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{368} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{378} } func (x *TeamRefereeEdge) GetNode() *TeamReferee { @@ -22893,7 +23609,7 @@ type TeamRefereeConnection struct { func (x *TeamRefereeConnection) Reset() { *x = TeamRefereeConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[369] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[379] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22906,7 +23622,7 @@ func (x *TeamRefereeConnection) String() string { func (*TeamRefereeConnection) ProtoMessage() {} func (x *TeamRefereeConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[369] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[379] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22919,7 +23635,7 @@ func (x *TeamRefereeConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeConnection.ProtoReflect.Descriptor instead. func (*TeamRefereeConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{369} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{379} } func (x *TeamRefereeConnection) GetEdges() []*TeamRefereeEdge { @@ -22949,7 +23665,7 @@ type ListTeamRefereesResponse struct { func (x *ListTeamRefereesResponse) Reset() { *x = ListTeamRefereesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[370] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[380] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -22962,7 +23678,7 @@ func (x *ListTeamRefereesResponse) String() string { func (*ListTeamRefereesResponse) ProtoMessage() {} func (x *ListTeamRefereesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[370] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[380] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -22975,7 +23691,7 @@ func (x *ListTeamRefereesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamRefereesResponse.ProtoReflect.Descriptor instead. func (*ListTeamRefereesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{370} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{380} } func (x *ListTeamRefereesResponse) GetTeamReferees() *TeamRefereeConnection { @@ -23002,7 +23718,7 @@ type TeamRefereeHistory struct { func (x *TeamRefereeHistory) Reset() { *x = TeamRefereeHistory{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[371] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[381] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23015,7 +23731,7 @@ func (x *TeamRefereeHistory) String() string { func (*TeamRefereeHistory) ProtoMessage() {} func (x *TeamRefereeHistory) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[371] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[381] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23028,7 +23744,7 @@ func (x *TeamRefereeHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeHistory.ProtoReflect.Descriptor instead. func (*TeamRefereeHistory) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{371} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{381} } func (x *TeamRefereeHistory) GetTeamId() string { @@ -23067,7 +23783,7 @@ type TeamRefereeHistoryEdge struct { func (x *TeamRefereeHistoryEdge) Reset() { *x = TeamRefereeHistoryEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[372] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[382] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23080,7 +23796,7 @@ func (x *TeamRefereeHistoryEdge) String() string { func (*TeamRefereeHistoryEdge) ProtoMessage() {} func (x *TeamRefereeHistoryEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[372] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[382] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23093,7 +23809,7 @@ func (x *TeamRefereeHistoryEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeHistoryEdge.ProtoReflect.Descriptor instead. func (*TeamRefereeHistoryEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{372} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{382} } func (x *TeamRefereeHistoryEdge) GetNode() *TeamRefereeHistory { @@ -23125,7 +23841,7 @@ type TeamRefereeHistoryConnection struct { func (x *TeamRefereeHistoryConnection) Reset() { *x = TeamRefereeHistoryConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[373] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[383] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23138,7 +23854,7 @@ func (x *TeamRefereeHistoryConnection) String() string { func (*TeamRefereeHistoryConnection) ProtoMessage() {} func (x *TeamRefereeHistoryConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[373] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[383] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23151,7 +23867,7 @@ func (x *TeamRefereeHistoryConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamRefereeHistoryConnection.ProtoReflect.Descriptor instead. func (*TeamRefereeHistoryConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{373} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{383} } func (x *TeamRefereeHistoryConnection) GetEdges() []*TeamRefereeHistoryEdge { @@ -23183,7 +23899,7 @@ type ListTeamRefereeHistoryRequest struct { func (x *ListTeamRefereeHistoryRequest) Reset() { *x = ListTeamRefereeHistoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[374] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[384] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23196,7 +23912,7 @@ func (x *ListTeamRefereeHistoryRequest) String() string { func (*ListTeamRefereeHistoryRequest) ProtoMessage() {} func (x *ListTeamRefereeHistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[374] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[384] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23209,7 +23925,7 @@ func (x *ListTeamRefereeHistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamRefereeHistoryRequest.ProtoReflect.Descriptor instead. func (*ListTeamRefereeHistoryRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{374} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{384} } func (x *ListTeamRefereeHistoryRequest) GetReferee() string { @@ -23239,7 +23955,7 @@ type ListTeamRefereeHistoryResponse struct { func (x *ListTeamRefereeHistoryResponse) Reset() { *x = ListTeamRefereeHistoryResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[375] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[385] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23252,7 +23968,7 @@ func (x *ListTeamRefereeHistoryResponse) String() string { func (*ListTeamRefereeHistoryResponse) ProtoMessage() {} func (x *ListTeamRefereeHistoryResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[375] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[385] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23265,7 +23981,7 @@ func (x *ListTeamRefereeHistoryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListTeamRefereeHistoryResponse.ProtoReflect.Descriptor instead. func (*ListTeamRefereeHistoryResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{375} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{385} } func (x *ListTeamRefereeHistoryResponse) GetTeamRefereeHistory() *TeamRefereeHistoryConnection { @@ -23289,12 +24005,16 @@ type GetFeesStatsRequest struct { EpochSeq *uint64 `protobuf:"varint,3,opt,name=epoch_seq,json=epochSeq,proto3,oneof" json:"epoch_seq,omitempty"` // Restrict fee statistics to those for the given party. PartyId *string `protobuf:"bytes,4,opt,name=party_id,json=partyId,proto3,oneof" json:"party_id,omitempty"` + // Restrict fee statistics to epoch range starting with epoch from. + EpochFrom *uint64 `protobuf:"varint,5,opt,name=epoch_from,json=epochFrom,proto3,oneof" json:"epoch_from,omitempty"` + // Restrict fee statistics to epoch range ending with epoch to. + EpochTo *uint64 `protobuf:"varint,6,opt,name=epoch_to,json=epochTo,proto3,oneof" json:"epoch_to,omitempty"` } func (x *GetFeesStatsRequest) Reset() { *x = GetFeesStatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[376] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[386] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23307,7 +24027,7 @@ func (x *GetFeesStatsRequest) String() string { func (*GetFeesStatsRequest) ProtoMessage() {} func (x *GetFeesStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[376] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[386] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23320,7 +24040,7 @@ func (x *GetFeesStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeesStatsRequest.ProtoReflect.Descriptor instead. func (*GetFeesStatsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{376} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{386} } func (x *GetFeesStatsRequest) GetMarketId() string { @@ -23351,6 +24071,20 @@ func (x *GetFeesStatsRequest) GetPartyId() string { return "" } +func (x *GetFeesStatsRequest) GetEpochFrom() uint64 { + if x != nil && x.EpochFrom != nil { + return *x.EpochFrom + } + return 0 +} + +func (x *GetFeesStatsRequest) GetEpochTo() uint64 { + if x != nil && x.EpochTo != nil { + return *x.EpochTo + } + return 0 +} + // Response that is sent when requesting fees statistics. type GetFeesStatsResponse struct { state protoimpl.MessageState @@ -23364,7 +24098,7 @@ type GetFeesStatsResponse struct { func (x *GetFeesStatsResponse) Reset() { *x = GetFeesStatsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[377] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[387] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23377,7 +24111,7 @@ func (x *GetFeesStatsResponse) String() string { func (*GetFeesStatsResponse) ProtoMessage() {} func (x *GetFeesStatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[377] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[387] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23390,7 +24124,7 @@ func (x *GetFeesStatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeesStatsResponse.ProtoReflect.Descriptor instead. func (*GetFeesStatsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{377} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{387} } func (x *GetFeesStatsResponse) GetFeesStats() *v1.FeesStats { @@ -23419,7 +24153,7 @@ type GetFeesStatsForPartyRequest struct { func (x *GetFeesStatsForPartyRequest) Reset() { *x = GetFeesStatsForPartyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[378] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[388] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23432,7 +24166,7 @@ func (x *GetFeesStatsForPartyRequest) String() string { func (*GetFeesStatsForPartyRequest) ProtoMessage() {} func (x *GetFeesStatsForPartyRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[378] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[388] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23445,7 +24179,7 @@ func (x *GetFeesStatsForPartyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeesStatsForPartyRequest.ProtoReflect.Descriptor instead. func (*GetFeesStatsForPartyRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{378} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{388} } func (x *GetFeesStatsForPartyRequest) GetPartyId() string { @@ -23489,7 +24223,7 @@ type GetFeesStatsForPartyResponse struct { func (x *GetFeesStatsForPartyResponse) Reset() { *x = GetFeesStatsForPartyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[379] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[389] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23502,7 +24236,7 @@ func (x *GetFeesStatsForPartyResponse) String() string { func (*GetFeesStatsForPartyResponse) ProtoMessage() {} func (x *GetFeesStatsForPartyResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[379] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[389] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23515,7 +24249,7 @@ func (x *GetFeesStatsForPartyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFeesStatsForPartyResponse.ProtoReflect.Descriptor instead. func (*GetFeesStatsForPartyResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{379} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{389} } func (x *GetFeesStatsForPartyResponse) GetFeesStatsForParty() []*FeesStatsForParty { @@ -23535,7 +24269,7 @@ type GetCurrentVolumeDiscountProgramRequest struct { func (x *GetCurrentVolumeDiscountProgramRequest) Reset() { *x = GetCurrentVolumeDiscountProgramRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[380] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[390] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23548,7 +24282,7 @@ func (x *GetCurrentVolumeDiscountProgramRequest) String() string { func (*GetCurrentVolumeDiscountProgramRequest) ProtoMessage() {} func (x *GetCurrentVolumeDiscountProgramRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[380] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[390] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23561,7 +24295,7 @@ func (x *GetCurrentVolumeDiscountProgramRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use GetCurrentVolumeDiscountProgramRequest.ProtoReflect.Descriptor instead. func (*GetCurrentVolumeDiscountProgramRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{380} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{390} } // Response containing the current referral program @@ -23577,7 +24311,7 @@ type GetCurrentVolumeDiscountProgramResponse struct { func (x *GetCurrentVolumeDiscountProgramResponse) Reset() { *x = GetCurrentVolumeDiscountProgramResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[381] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[391] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23590,7 +24324,7 @@ func (x *GetCurrentVolumeDiscountProgramResponse) String() string { func (*GetCurrentVolumeDiscountProgramResponse) ProtoMessage() {} func (x *GetCurrentVolumeDiscountProgramResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[381] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[391] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23603,7 +24337,7 @@ func (x *GetCurrentVolumeDiscountProgramResponse) ProtoReflect() protoreflect.Me // Deprecated: Use GetCurrentVolumeDiscountProgramResponse.ProtoReflect.Descriptor instead. func (*GetCurrentVolumeDiscountProgramResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{381} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{391} } func (x *GetCurrentVolumeDiscountProgramResponse) GetCurrentVolumeDiscountProgram() *VolumeDiscountProgram { @@ -23630,7 +24364,7 @@ type GetVolumeDiscountStatsRequest struct { func (x *GetVolumeDiscountStatsRequest) Reset() { *x = GetVolumeDiscountStatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[382] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[392] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23643,7 +24377,7 @@ func (x *GetVolumeDiscountStatsRequest) String() string { func (*GetVolumeDiscountStatsRequest) ProtoMessage() {} func (x *GetVolumeDiscountStatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[382] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[392] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23656,7 +24390,7 @@ func (x *GetVolumeDiscountStatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVolumeDiscountStatsRequest.ProtoReflect.Descriptor instead. func (*GetVolumeDiscountStatsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{382} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{392} } func (x *GetVolumeDiscountStatsRequest) GetAtEpoch() uint64 { @@ -23693,7 +24427,7 @@ type GetVolumeDiscountStatsResponse struct { func (x *GetVolumeDiscountStatsResponse) Reset() { *x = GetVolumeDiscountStatsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[383] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[393] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23706,7 +24440,7 @@ func (x *GetVolumeDiscountStatsResponse) String() string { func (*GetVolumeDiscountStatsResponse) ProtoMessage() {} func (x *GetVolumeDiscountStatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[383] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[393] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23719,7 +24453,7 @@ func (x *GetVolumeDiscountStatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVolumeDiscountStatsResponse.ProtoReflect.Descriptor instead. func (*GetVolumeDiscountStatsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{383} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{393} } func (x *GetVolumeDiscountStatsResponse) GetStats() *VolumeDiscountStatsConnection { @@ -23744,7 +24478,7 @@ type VolumeDiscountStatsConnection struct { func (x *VolumeDiscountStatsConnection) Reset() { *x = VolumeDiscountStatsConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[384] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[394] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23757,7 +24491,7 @@ func (x *VolumeDiscountStatsConnection) String() string { func (*VolumeDiscountStatsConnection) ProtoMessage() {} func (x *VolumeDiscountStatsConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[384] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[394] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23770,7 +24504,7 @@ func (x *VolumeDiscountStatsConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountStatsConnection.ProtoReflect.Descriptor instead. func (*VolumeDiscountStatsConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{384} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{394} } func (x *VolumeDiscountStatsConnection) GetEdges() []*VolumeDiscountStatsEdge { @@ -23802,7 +24536,7 @@ type VolumeDiscountStatsEdge struct { func (x *VolumeDiscountStatsEdge) Reset() { *x = VolumeDiscountStatsEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[385] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[395] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23815,7 +24549,7 @@ func (x *VolumeDiscountStatsEdge) String() string { func (*VolumeDiscountStatsEdge) ProtoMessage() {} func (x *VolumeDiscountStatsEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[385] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[395] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23828,7 +24562,7 @@ func (x *VolumeDiscountStatsEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountStatsEdge.ProtoReflect.Descriptor instead. func (*VolumeDiscountStatsEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{385} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{395} } func (x *VolumeDiscountStatsEdge) GetNode() *VolumeDiscountStats { @@ -23864,7 +24598,7 @@ type VolumeDiscountStats struct { func (x *VolumeDiscountStats) Reset() { *x = VolumeDiscountStats{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[386] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[396] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23877,7 +24611,7 @@ func (x *VolumeDiscountStats) String() string { func (*VolumeDiscountStats) ProtoMessage() {} func (x *VolumeDiscountStats) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[386] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[396] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23890,7 +24624,7 @@ func (x *VolumeDiscountStats) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountStats.ProtoReflect.Descriptor instead. func (*VolumeDiscountStats) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{386} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{396} } func (x *VolumeDiscountStats) GetAtEpoch() uint64 { @@ -23947,7 +24681,7 @@ type VolumeDiscountProgram struct { func (x *VolumeDiscountProgram) Reset() { *x = VolumeDiscountProgram{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[387] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[397] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -23960,7 +24694,7 @@ func (x *VolumeDiscountProgram) String() string { func (*VolumeDiscountProgram) ProtoMessage() {} func (x *VolumeDiscountProgram) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[387] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[397] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -23973,7 +24707,7 @@ func (x *VolumeDiscountProgram) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeDiscountProgram.ProtoReflect.Descriptor instead. func (*VolumeDiscountProgram) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{387} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{397} } func (x *VolumeDiscountProgram) GetVersion() uint64 { @@ -24038,7 +24772,7 @@ type FeesStatsForParty struct { func (x *FeesStatsForParty) Reset() { *x = FeesStatsForParty{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[388] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[398] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24051,7 +24785,7 @@ func (x *FeesStatsForParty) String() string { func (*FeesStatsForParty) ProtoMessage() {} func (x *FeesStatsForParty) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[388] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[398] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24064,7 +24798,7 @@ func (x *FeesStatsForParty) ProtoReflect() protoreflect.Message { // Deprecated: Use FeesStatsForParty.ProtoReflect.Descriptor instead. func (*FeesStatsForParty) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{388} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{398} } func (x *FeesStatsForParty) GetAssetId() string { @@ -24119,7 +24853,7 @@ type ObserveTransactionResultsRequest struct { func (x *ObserveTransactionResultsRequest) Reset() { *x = ObserveTransactionResultsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[389] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[399] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24132,7 +24866,7 @@ func (x *ObserveTransactionResultsRequest) String() string { func (*ObserveTransactionResultsRequest) ProtoMessage() {} func (x *ObserveTransactionResultsRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[389] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[399] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24145,7 +24879,7 @@ func (x *ObserveTransactionResultsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ObserveTransactionResultsRequest.ProtoReflect.Descriptor instead. func (*ObserveTransactionResultsRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{389} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{399} } func (x *ObserveTransactionResultsRequest) GetPartyIds() []string { @@ -24182,7 +24916,7 @@ type ObserveTransactionResultsResponse struct { func (x *ObserveTransactionResultsResponse) Reset() { *x = ObserveTransactionResultsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[390] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[400] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24195,7 +24929,7 @@ func (x *ObserveTransactionResultsResponse) String() string { func (*ObserveTransactionResultsResponse) ProtoMessage() {} func (x *ObserveTransactionResultsResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[390] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[400] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24208,7 +24942,7 @@ func (x *ObserveTransactionResultsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ObserveTransactionResultsResponse.ProtoReflect.Descriptor instead. func (*ObserveTransactionResultsResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{390} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{400} } func (x *ObserveTransactionResultsResponse) GetTransactionResults() []*v1.TransactionResult { @@ -24234,12 +24968,15 @@ type EstimateTransferFeeRequest struct { Amount string `protobuf:"bytes,4,opt,name=amount,proto3" json:"amount,omitempty"` // Asset ID for the asset associated with the transaction. AssetId string `protobuf:"bytes,5,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"` + // AMM public key, if assets are being transferred from an AMM key to the AMM owner's public key. + // The `from_account` must be the owner of this AMM key. + FromAmmKey *string `protobuf:"bytes,6,opt,name=from_amm_key,json=fromAmmKey,proto3,oneof" json:"from_amm_key,omitempty"` } func (x *EstimateTransferFeeRequest) Reset() { *x = EstimateTransferFeeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[391] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[401] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24252,7 +24989,7 @@ func (x *EstimateTransferFeeRequest) String() string { func (*EstimateTransferFeeRequest) ProtoMessage() {} func (x *EstimateTransferFeeRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[391] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[401] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24265,7 +25002,7 @@ func (x *EstimateTransferFeeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateTransferFeeRequest.ProtoReflect.Descriptor instead. func (*EstimateTransferFeeRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{391} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{401} } func (x *EstimateTransferFeeRequest) GetFromAccount() string { @@ -24303,6 +25040,13 @@ func (x *EstimateTransferFeeRequest) GetAssetId() string { return "" } +func (x *EstimateTransferFeeRequest) GetFromAmmKey() string { + if x != nil && x.FromAmmKey != nil { + return *x.FromAmmKey + } + return "" +} + // Results of estimation of transfer fee and the fee discount type EstimateTransferFeeResponse struct { state protoimpl.MessageState @@ -24318,7 +25062,7 @@ type EstimateTransferFeeResponse struct { func (x *EstimateTransferFeeResponse) Reset() { *x = EstimateTransferFeeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[392] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[402] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24331,7 +25075,7 @@ func (x *EstimateTransferFeeResponse) String() string { func (*EstimateTransferFeeResponse) ProtoMessage() {} func (x *EstimateTransferFeeResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[392] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[402] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24344,7 +25088,7 @@ func (x *EstimateTransferFeeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateTransferFeeResponse.ProtoReflect.Descriptor instead. func (*EstimateTransferFeeResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{392} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{402} } func (x *EstimateTransferFeeResponse) GetFee() string { @@ -24376,7 +25120,7 @@ type GetTotalTransferFeeDiscountRequest struct { func (x *GetTotalTransferFeeDiscountRequest) Reset() { *x = GetTotalTransferFeeDiscountRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[393] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[403] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24389,7 +25133,7 @@ func (x *GetTotalTransferFeeDiscountRequest) String() string { func (*GetTotalTransferFeeDiscountRequest) ProtoMessage() {} func (x *GetTotalTransferFeeDiscountRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[393] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[403] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24402,7 +25146,7 @@ func (x *GetTotalTransferFeeDiscountRequest) ProtoReflect() protoreflect.Message // Deprecated: Use GetTotalTransferFeeDiscountRequest.ProtoReflect.Descriptor instead. func (*GetTotalTransferFeeDiscountRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{393} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{403} } func (x *GetTotalTransferFeeDiscountRequest) GetPartyId() string { @@ -24432,7 +25176,7 @@ type GetTotalTransferFeeDiscountResponse struct { func (x *GetTotalTransferFeeDiscountResponse) Reset() { *x = GetTotalTransferFeeDiscountResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[394] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[404] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24445,7 +25189,7 @@ func (x *GetTotalTransferFeeDiscountResponse) String() string { func (*GetTotalTransferFeeDiscountResponse) ProtoMessage() {} func (x *GetTotalTransferFeeDiscountResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[394] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[404] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24458,7 +25202,7 @@ func (x *GetTotalTransferFeeDiscountResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use GetTotalTransferFeeDiscountResponse.ProtoReflect.Descriptor instead. func (*GetTotalTransferFeeDiscountResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{394} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{404} } func (x *GetTotalTransferFeeDiscountResponse) GetTotalDiscount() string { @@ -24499,7 +25243,7 @@ type ListGamesRequest struct { func (x *ListGamesRequest) Reset() { *x = ListGamesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[395] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[405] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24512,7 +25256,7 @@ func (x *ListGamesRequest) String() string { func (*ListGamesRequest) ProtoMessage() {} func (x *ListGamesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[395] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[405] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24525,7 +25269,7 @@ func (x *ListGamesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListGamesRequest.ProtoReflect.Descriptor instead. func (*ListGamesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{395} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{405} } func (x *ListGamesRequest) GetGameId() string { @@ -24590,7 +25334,7 @@ type ListGamesResponse struct { func (x *ListGamesResponse) Reset() { *x = ListGamesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[396] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[406] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24603,7 +25347,7 @@ func (x *ListGamesResponse) String() string { func (*ListGamesResponse) ProtoMessage() {} func (x *ListGamesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[396] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[406] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24616,7 +25360,7 @@ func (x *ListGamesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListGamesResponse.ProtoReflect.Descriptor instead. func (*ListGamesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{396} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{406} } func (x *ListGamesResponse) GetGames() *GamesConnection { @@ -24641,7 +25385,7 @@ type GamesConnection struct { func (x *GamesConnection) Reset() { *x = GamesConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[397] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[407] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24654,7 +25398,7 @@ func (x *GamesConnection) String() string { func (*GamesConnection) ProtoMessage() {} func (x *GamesConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[397] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[407] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24667,7 +25411,7 @@ func (x *GamesConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use GamesConnection.ProtoReflect.Descriptor instead. func (*GamesConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{397} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{407} } func (x *GamesConnection) GetEdges() []*GameEdge { @@ -24699,7 +25443,7 @@ type GameEdge struct { func (x *GameEdge) Reset() { *x = GameEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[398] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[408] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24712,7 +25456,7 @@ func (x *GameEdge) String() string { func (*GameEdge) ProtoMessage() {} func (x *GameEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[398] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[408] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24725,7 +25469,7 @@ func (x *GameEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use GameEdge.ProtoReflect.Descriptor instead. func (*GameEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{398} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{408} } func (x *GameEdge) GetNode() *Game { @@ -24768,7 +25512,7 @@ type Game struct { func (x *Game) Reset() { *x = Game{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[399] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[409] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24781,7 +25525,7 @@ func (x *Game) String() string { func (*Game) ProtoMessage() {} func (x *Game) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[399] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[409] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24794,7 +25538,7 @@ func (x *Game) ProtoReflect() protoreflect.Message { // Deprecated: Use Game.ProtoReflect.Descriptor instead. func (*Game) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{399} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{409} } func (x *Game) GetId() string { @@ -24877,7 +25621,7 @@ type TeamGameEntities struct { func (x *TeamGameEntities) Reset() { *x = TeamGameEntities{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[400] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[410] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24890,7 +25634,7 @@ func (x *TeamGameEntities) String() string { func (*TeamGameEntities) ProtoMessage() {} func (x *TeamGameEntities) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[400] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[410] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24903,7 +25647,7 @@ func (x *TeamGameEntities) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamGameEntities.ProtoReflect.Descriptor instead. func (*TeamGameEntities) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{400} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{410} } func (x *TeamGameEntities) GetTeam() []*TeamGameEntity { @@ -24926,7 +25670,7 @@ type IndividualGameEntities struct { func (x *IndividualGameEntities) Reset() { *x = IndividualGameEntities{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[401] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[411] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -24939,7 +25683,7 @@ func (x *IndividualGameEntities) String() string { func (*IndividualGameEntities) ProtoMessage() {} func (x *IndividualGameEntities) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[401] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[411] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -24952,7 +25696,7 @@ func (x *IndividualGameEntities) ProtoReflect() protoreflect.Message { // Deprecated: Use IndividualGameEntities.ProtoReflect.Descriptor instead. func (*IndividualGameEntities) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{401} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{411} } func (x *IndividualGameEntities) GetIndividual() []*IndividualGameEntity { @@ -24989,7 +25733,7 @@ type TeamGameEntity struct { func (x *TeamGameEntity) Reset() { *x = TeamGameEntity{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[402] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[412] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25002,7 +25746,7 @@ func (x *TeamGameEntity) String() string { func (*TeamGameEntity) ProtoMessage() {} func (x *TeamGameEntity) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[402] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[412] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25015,7 +25759,7 @@ func (x *TeamGameEntity) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamGameEntity.ProtoReflect.Descriptor instead. func (*TeamGameEntity) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{402} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{412} } func (x *TeamGameEntity) GetTeam() *TeamGameParticipation { @@ -25089,7 +25833,7 @@ type TeamGameParticipation struct { func (x *TeamGameParticipation) Reset() { *x = TeamGameParticipation{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[403] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[413] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25102,7 +25846,7 @@ func (x *TeamGameParticipation) String() string { func (*TeamGameParticipation) ProtoMessage() {} func (x *TeamGameParticipation) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[403] + 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 { @@ -25115,7 +25859,7 @@ func (x *TeamGameParticipation) ProtoReflect() protoreflect.Message { // Deprecated: Use TeamGameParticipation.ProtoReflect.Descriptor instead. func (*TeamGameParticipation) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{403} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{413} } func (x *TeamGameParticipation) GetTeamId() string { @@ -25161,7 +25905,7 @@ type IndividualGameEntity struct { func (x *IndividualGameEntity) Reset() { *x = IndividualGameEntity{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[404] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[414] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25174,7 +25918,7 @@ func (x *IndividualGameEntity) String() string { func (*IndividualGameEntity) ProtoMessage() {} func (x *IndividualGameEntity) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[404] + 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 { @@ -25187,7 +25931,7 @@ func (x *IndividualGameEntity) ProtoReflect() protoreflect.Message { // Deprecated: Use IndividualGameEntity.ProtoReflect.Descriptor instead. func (*IndividualGameEntity) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{404} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{414} } func (x *IndividualGameEntity) GetIndividual() string { @@ -25263,7 +26007,7 @@ type ListPartyMarginModesRequest struct { func (x *ListPartyMarginModesRequest) Reset() { *x = ListPartyMarginModesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[405] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[415] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25276,7 +26020,7 @@ func (x *ListPartyMarginModesRequest) String() string { func (*ListPartyMarginModesRequest) ProtoMessage() {} func (x *ListPartyMarginModesRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[405] + 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 { @@ -25289,7 +26033,7 @@ func (x *ListPartyMarginModesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartyMarginModesRequest.ProtoReflect.Descriptor instead. func (*ListPartyMarginModesRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{405} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{415} } func (x *ListPartyMarginModesRequest) GetMarketId() string { @@ -25326,7 +26070,7 @@ type ListPartyMarginModesResponse struct { func (x *ListPartyMarginModesResponse) Reset() { *x = ListPartyMarginModesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[406] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[416] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25339,7 +26083,7 @@ func (x *ListPartyMarginModesResponse) String() string { func (*ListPartyMarginModesResponse) ProtoMessage() {} func (x *ListPartyMarginModesResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[406] + 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 { @@ -25352,7 +26096,7 @@ func (x *ListPartyMarginModesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPartyMarginModesResponse.ProtoReflect.Descriptor instead. func (*ListPartyMarginModesResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{406} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{416} } func (x *ListPartyMarginModesResponse) GetPartyMarginModes() *PartyMarginModesConnection { @@ -25377,7 +26121,7 @@ type PartyMarginModesConnection struct { func (x *PartyMarginModesConnection) Reset() { *x = PartyMarginModesConnection{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[407] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[417] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25390,7 +26134,7 @@ func (x *PartyMarginModesConnection) String() string { func (*PartyMarginModesConnection) ProtoMessage() {} func (x *PartyMarginModesConnection) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[407] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[417] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25403,7 +26147,7 @@ func (x *PartyMarginModesConnection) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyMarginModesConnection.ProtoReflect.Descriptor instead. func (*PartyMarginModesConnection) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{407} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{417} } func (x *PartyMarginModesConnection) GetEdges() []*PartyMarginModeEdge { @@ -25435,7 +26179,7 @@ type PartyMarginModeEdge struct { func (x *PartyMarginModeEdge) Reset() { *x = PartyMarginModeEdge{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[408] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[418] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25448,7 +26192,7 @@ func (x *PartyMarginModeEdge) String() string { func (*PartyMarginModeEdge) ProtoMessage() {} func (x *PartyMarginModeEdge) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[408] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[418] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25461,7 +26205,7 @@ func (x *PartyMarginModeEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyMarginModeEdge.ProtoReflect.Descriptor instead. func (*PartyMarginModeEdge) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{408} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{418} } func (x *PartyMarginModeEdge) GetNode() *PartyMarginMode { @@ -25503,7 +26247,7 @@ type PartyMarginMode struct { func (x *PartyMarginMode) Reset() { *x = PartyMarginMode{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[409] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[419] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25516,7 +26260,7 @@ func (x *PartyMarginMode) String() string { func (*PartyMarginMode) ProtoMessage() {} func (x *PartyMarginMode) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[409] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[419] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25529,7 +26273,7 @@ func (x *PartyMarginMode) ProtoReflect() protoreflect.Message { // Deprecated: Use PartyMarginMode.ProtoReflect.Descriptor instead. func (*PartyMarginMode) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{409} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{419} } func (x *PartyMarginMode) GetMarketId() string { @@ -25605,7 +26349,7 @@ type TimeWeightedNotionalPosition struct { func (x *TimeWeightedNotionalPosition) Reset() { *x = TimeWeightedNotionalPosition{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[410] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[420] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25618,7 +26362,7 @@ func (x *TimeWeightedNotionalPosition) String() string { func (*TimeWeightedNotionalPosition) ProtoMessage() {} func (x *TimeWeightedNotionalPosition) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[410] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[420] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25631,7 +26375,7 @@ func (x *TimeWeightedNotionalPosition) ProtoReflect() protoreflect.Message { // Deprecated: Use TimeWeightedNotionalPosition.ProtoReflect.Descriptor instead. func (*TimeWeightedNotionalPosition) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{410} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{420} } func (x *TimeWeightedNotionalPosition) GetAssetId() string { @@ -25697,7 +26441,7 @@ type GetTimeWeightedNotionalPositionRequest struct { func (x *GetTimeWeightedNotionalPositionRequest) Reset() { *x = GetTimeWeightedNotionalPositionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[411] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[421] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25710,7 +26454,7 @@ func (x *GetTimeWeightedNotionalPositionRequest) String() string { func (*GetTimeWeightedNotionalPositionRequest) ProtoMessage() {} func (x *GetTimeWeightedNotionalPositionRequest) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[411] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[421] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25723,7 +26467,7 @@ func (x *GetTimeWeightedNotionalPositionRequest) ProtoReflect() protoreflect.Mes // Deprecated: Use GetTimeWeightedNotionalPositionRequest.ProtoReflect.Descriptor instead. func (*GetTimeWeightedNotionalPositionRequest) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{411} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{421} } func (x *GetTimeWeightedNotionalPositionRequest) GetAssetId() string { @@ -25767,7 +26511,7 @@ type GetTimeWeightedNotionalPositionResponse struct { func (x *GetTimeWeightedNotionalPositionResponse) Reset() { *x = GetTimeWeightedNotionalPositionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[412] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[422] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -25780,7 +26524,7 @@ func (x *GetTimeWeightedNotionalPositionResponse) String() string { func (*GetTimeWeightedNotionalPositionResponse) ProtoMessage() {} func (x *GetTimeWeightedNotionalPositionResponse) ProtoReflect() protoreflect.Message { - mi := &file_data_node_api_v2_trading_data_proto_msgTypes[412] + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[422] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -25793,7 +26537,7 @@ func (x *GetTimeWeightedNotionalPositionResponse) ProtoReflect() protoreflect.Me // Deprecated: Use GetTimeWeightedNotionalPositionResponse.ProtoReflect.Descriptor instead. func (*GetTimeWeightedNotionalPositionResponse) Descriptor() ([]byte, []int) { - return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{412} + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{422} } func (x *GetTimeWeightedNotionalPositionResponse) GetTimeWeightedNotionalPosition() *TimeWeightedNotionalPosition { @@ -25803,536 +26547,1111 @@ func (x *GetTimeWeightedNotionalPositionResponse) GetTimeWeightedNotionalPositio return nil } -var File_data_node_api_v2_trading_data_proto protoreflect.FileDescriptor +type ListAMMsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ - 0x0a, 0x23, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x76, 0x32, 0x2f, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, - 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x11, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 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, - 0x1a, 0x1b, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, - 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x76, - 0x65, 0x67, 0x61, 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x6f, - 0x72, 0x61, 0x63, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x76, 0x65, 0x67, - 0x61, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd9, 0x01, 0x0a, - 0x0a, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x66, - 0x69, 0x72, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x05, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, - 0x01, 0x12, 0x17, 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x02, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x62, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x06, 0x62, 0x65, - 0x66, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x65, 0x73, - 0x74, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, - 0x0b, 0x6e, 0x65, 0x77, 0x65, 0x73, 0x74, 0x46, 0x69, 0x72, 0x73, 0x74, 0x88, 0x01, 0x01, 0x42, - 0x08, 0x0a, 0x06, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x66, - 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x77, 0x65, - 0x73, 0x74, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x08, 0x50, 0x61, 0x67, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, - 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, - 0x73, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x68, 0x61, 0x73, - 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x68, 0x61, 0x73, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, - 0x73, 0x50, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, - 0x64, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x3e, 0x0a, 0x1b, 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, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, 0xb7, 0x01, 0x0a, 0x1c, 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, 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, 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, 0x27, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, - 0x74, 0x75, 0x6d, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x22, 0x70, 0x0a, 0x20, 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, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x22, 0x8b, 0x02, 0x0a, 0x21, 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, 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, 0x20, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, - 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x53, 0x65, 0x71, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 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, 0x0e, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x12, 0x4e, 0x0a, 0x10, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x04, 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, 0x0f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, - 0x71, 0x22, 0x9a, 0x01, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 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, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x9e, - 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x40, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, - 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x57, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 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, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x12, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 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, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 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, 0x5a, 0x0a, 0x0b, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 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, 0x22, 0x8d, 0x01, 0x0a, 0x16, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 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, - 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, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x17, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x6f, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x61, 0x67, - 0x65, 0x22, 0x4d, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, - 0x22, 0x0d, 0x0a, 0x0b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x49, 0x0a, 0x0c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0x5d, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x00, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, - 0x08, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, - 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x22, 0xbd, 0x03, 0x0a, 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x12, 0x2e, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, - 0x12, 0x26, 0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x69, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x49, 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x49, - 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, - 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, - 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x48, 0x01, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x6c, 0x69, 0x76, 0x65, 0x4f, 0x6e, - 0x6c, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, - 0x22, 0xaa, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x4e, 0x0a, - 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x8c, 0x01, - 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x6f, 0x72, - 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, - 0x01, 0x02, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x00, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x19, - 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, 0x12, 0x38, 0x0a, 0x06, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x22, 0xa0, 0x01, 0x0a, 0x15, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, - 0x48, 0x00, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x39, 0x0a, 0x07, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x55, 0x0a, 0x11, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x18, 0x01, 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, 0x12, 0x1b, 0x0a, - 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0x33, 0x0a, 0x0c, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x6f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 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, - 0x36, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x22, 0x4c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x34, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 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, 0x05, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xb2, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, - 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x12, 0x3d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x48, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xcd, 0x02, 0x0a, 0x0f, 0x53, - 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x32, - 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x11, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x45, - 0x78, 0x70, 0x69, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x10, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x69, 0x65, 0x73, 0x12, - 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, - 0x00, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 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, 0x20, 0x0a, 0x09, 0x6c, - 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, - 0x52, 0x08, 0x6c, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0x5b, 0x0a, 0x0d, 0x53, 0x74, - 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, 0x64, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x6e, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 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, 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, 0x22, 0x83, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x34, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 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, 0x56, 0x0a, - 0x16, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 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, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x02, 0x18, 0x01, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5e, 0x0a, 0x15, 0x4c, - 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 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, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x4d, 0x0a, 0x0f, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, - 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x17, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x5d, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, - 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x4a, 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x64, 0x67, 0x65, - 0x12, 0x22, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, 0x22, 0x81, 0x01, 0x0a, - 0x12, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, 0x76, 0x0a, 0x17, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 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, 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, 0x22, 0xa9, 0x01, 0x0a, 0x18, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x48, 0x00, - 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, - 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x61, 0x0a, 0x14, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x09, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6c, - 0x61, 0x73, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x09, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4c, 0x65, 0x64, - 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x37, - 0x0a, 0x18, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x15, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x4f, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4e, 0x0a, 0x13, 0x66, 0x72, 0x6f, 0x6d, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x52, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x11, 0x74, 0x6f, 0x5f, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x52, 0x0f, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x24, - 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x22, 0xfa, 0x05, 0x0a, 0x15, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 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, 0x12, 0x1a, 0x0a, 0x08, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x3d, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 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, 0x39, 0x0a, 0x0f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x07, 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, 0x36, 0x0a, 0x15, 0x66, - 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x12, 0x66, 0x72, - 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x13, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x02, 0x52, 0x10, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x66, 0x72, 0x6f, 0x6d, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x13, 0x66, 0x72, 0x6f, 0x6d, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x34, 0x0a, 0x14, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x04, 0x52, 0x11, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x72, 0x6f, 0x6d, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, - 0x16, 0x0a, 0x14, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, - 0x02, 0x22, 0xf6, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, - 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x01, 0x52, 0x09, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x1a, 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, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, - 0x02, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x01, 0x52, 0x09, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x76, 0x0a, 0x19, 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, 0x12, 0x59, 0x0a, 0x0e, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x65, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0d, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x71, - 0x0a, 0x1b, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, - 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x3a, 0x0a, - 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, - 0x74, 0x72, 0x79, 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, 0x22, 0x9f, 0x01, 0x0a, 0x21, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, - 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, - 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 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, 0xf3, 0x01, 0x0a, 0x19, 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, 0x12, 0x36, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, + // AMM ID to filter for. If party ID or market ID is provided, the ID filter is ignored. + Id *string `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` + // Party ID to filter for. + PartyId *string `protobuf:"bytes,2,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,3,opt,name=market_id,json=marketId,proto3,oneof" json:"market_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. + AmmPartyId *string `protobuf:"bytes,4,opt,name=amm_party_id,json=ammPartyId,proto3,oneof" json:"amm_party_id,omitempty"` + // Filter for AMMs with the given status. This filter will be ignored if any of the other + // filters have been set. + Status *v1.AMM_Status `protobuf:"varint,5,opt,name=status,proto3,enum=vega.events.v1.AMM_Status,oneof" json:"status,omitempty"` + // Pagination controls. + Pagination *Pagination `protobuf:"bytes,6,opt,name=pagination,proto3,oneof" json:"pagination,omitempty"` +} + +func (x *ListAMMsRequest) Reset() { + *x = ListAMMsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[423] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListAMMsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAMMsRequest) ProtoMessage() {} + +func (x *ListAMMsRequest) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[423] + 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 ListAMMsRequest.ProtoReflect.Descriptor instead. +func (*ListAMMsRequest) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{423} +} + +func (x *ListAMMsRequest) GetId() string { + if x != nil && x.Id != nil { + return *x.Id + } + return "" +} + +func (x *ListAMMsRequest) GetPartyId() string { + if x != nil && x.PartyId != nil { + return *x.PartyId + } + return "" +} + +func (x *ListAMMsRequest) GetMarketId() string { + if x != nil && x.MarketId != nil { + return *x.MarketId + } + return "" +} + +func (x *ListAMMsRequest) GetAmmPartyId() string { + if x != nil && x.AmmPartyId != nil { + return *x.AmmPartyId + } + return "" +} + +func (x *ListAMMsRequest) GetStatus() v1.AMM_Status { + if x != nil && x.Status != nil { + return *x.Status + } + return v1.AMM_Status(0) +} + +func (x *ListAMMsRequest) GetPagination() *Pagination { + if x != nil { + return x.Pagination + } + return nil +} + +type ListAMMsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of AMM data and corresponding page information. + Amms *AMMConnection `protobuf:"bytes,1,opt,name=amms,proto3" json:"amms,omitempty"` +} + +func (x *ListAMMsResponse) Reset() { + *x = ListAMMsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[424] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListAMMsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAMMsResponse) ProtoMessage() {} + +func (x *ListAMMsResponse) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[424] + 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 ListAMMsResponse.ProtoReflect.Descriptor instead. +func (*ListAMMsResponse) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{424} +} + +func (x *ListAMMsResponse) GetAmms() *AMMConnection { + if x != nil { + return x.Amms + } + return nil +} + +type AMMConnection struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Page of AMM data and the corresponding cursors. + Edges []*AMMEdge `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 *AMMConnection) Reset() { + *x = AMMConnection{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[425] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMMConnection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMMConnection) ProtoMessage() {} + +func (x *AMMConnection) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[425] + 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 AMMConnection.ProtoReflect.Descriptor instead. +func (*AMMConnection) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{425} +} + +func (x *AMMConnection) GetEdges() []*AMMEdge { + if x != nil { + return x.Edges + } + return nil +} + +func (x *AMMConnection) GetPageInfo() *PageInfo { + if x != nil { + return x.PageInfo + } + return nil +} + +type AMMEdge struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // AMM pool data. + Node *v1.AMM `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 *AMMEdge) Reset() { + *x = AMMEdge{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[426] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMMEdge) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMMEdge) ProtoMessage() {} + +func (x *AMMEdge) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[426] + 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 AMMEdge.ProtoReflect.Descriptor instead. +func (*AMMEdge) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{426} +} + +func (x *AMMEdge) GetNode() *v1.AMM { + if x != nil { + return x.Node + } + return nil +} + +func (x *AMMEdge) GetCursor() string { + if x != nil { + return x.Cursor + } + return "" +} + +type EstimateAMMBoundsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Base price of the AMM pool, the price is an integer, for example `123456` is a correctly + // formatted price of `1.23456` assuming market configured to 5 decimal places. + BasePrice string `protobuf:"bytes,1,opt,name=base_price,json=basePrice,proto3" json:"base_price,omitempty"` + // Upper price of the AMM pool, the price is an integer, for example `123456` is a correctly + // formatted price of `1.23456` assuming market configured to 5 decimal places. + UpperPrice *string `protobuf:"bytes,2,opt,name=upper_price,json=upperPrice,proto3,oneof" json:"upper_price,omitempty"` + // Lower price of the AMM pool, the price is an integer, for example `123456` is a correctly + // formatted price of `1.23456` assuming market configured to 5 decimal places. + LowerPrice *string `protobuf:"bytes,3,opt,name=lower_price,json=lowerPrice,proto3,oneof" json:"lower_price,omitempty"` + // Leverage at the upper price of the AMM pool. + LeverageAtUpperPrice *string `protobuf:"bytes,4,opt,name=leverage_at_upper_price,json=leverageAtUpperPrice,proto3,oneof" json:"leverage_at_upper_price,omitempty"` + // Leverage at the lower price of the AMM pool. + LeverageAtLowerPrice *string `protobuf:"bytes,5,opt,name=leverage_at_lower_price,json=leverageAtLowerPrice,proto3,oneof" json:"leverage_at_lower_price,omitempty"` + // Amount of the asset that the party is willing to commit to the AMM pool. + CommitmentAmount string `protobuf:"bytes,6,opt,name=commitment_amount,json=commitmentAmount,proto3" json:"commitment_amount,omitempty"` + // Market ID to estimate the AMM for. + MarketId string `protobuf:"bytes,7,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` +} + +func (x *EstimateAMMBoundsRequest) Reset() { + *x = EstimateAMMBoundsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[427] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EstimateAMMBoundsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EstimateAMMBoundsRequest) ProtoMessage() {} + +func (x *EstimateAMMBoundsRequest) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[427] + 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 EstimateAMMBoundsRequest.ProtoReflect.Descriptor instead. +func (*EstimateAMMBoundsRequest) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{427} +} + +func (x *EstimateAMMBoundsRequest) GetBasePrice() string { + if x != nil { + return x.BasePrice + } + return "" +} + +func (x *EstimateAMMBoundsRequest) GetUpperPrice() string { + if x != nil && x.UpperPrice != nil { + return *x.UpperPrice + } + return "" +} + +func (x *EstimateAMMBoundsRequest) GetLowerPrice() string { + if x != nil && x.LowerPrice != nil { + return *x.LowerPrice + } + return "" +} + +func (x *EstimateAMMBoundsRequest) GetLeverageAtUpperPrice() string { + if x != nil && x.LeverageAtUpperPrice != nil { + return *x.LeverageAtUpperPrice + } + return "" +} + +func (x *EstimateAMMBoundsRequest) GetLeverageAtLowerPrice() string { + if x != nil && x.LeverageAtLowerPrice != nil { + return *x.LeverageAtLowerPrice + } + return "" +} + +func (x *EstimateAMMBoundsRequest) GetCommitmentAmount() string { + if x != nil { + return x.CommitmentAmount + } + return "" +} + +func (x *EstimateAMMBoundsRequest) GetMarketId() string { + if x != nil { + return x.MarketId + } + return "" +} + +type EstimateAMMBoundsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Theoretical volume at the top of the upper bound. + PositionSizeAtUpper string `protobuf:"bytes,1,opt,name=position_size_at_upper,json=positionSizeAtUpper,proto3" json:"position_size_at_upper,omitempty"` + // Theoretical volume at the top of the lower bound. + PositionSizeAtLower string `protobuf:"bytes,2,opt,name=position_size_at_lower,json=positionSizeAtLower,proto3" json:"position_size_at_lower,omitempty"` + // Loss of commitment at the upper bound. + LossOnCommitmentAtUpper string `protobuf:"bytes,3,opt,name=loss_on_commitment_at_upper,json=lossOnCommitmentAtUpper,proto3" json:"loss_on_commitment_at_upper,omitempty"` + // Loss of commitment at the lower bound. + LossOnCommitmentAtLower string `protobuf:"bytes,4,opt,name=loss_on_commitment_at_lower,json=lossOnCommitmentAtLower,proto3" json:"loss_on_commitment_at_lower,omitempty"` + // Estimated price above upper bound at which the commitment will be lost. + LiquidationPriceAtUpper string `protobuf:"bytes,5,opt,name=liquidation_price_at_upper,json=liquidationPriceAtUpper,proto3" json:"liquidation_price_at_upper,omitempty"` + // Estimated price below the lower bound at which the commitment will be lost. + LiquidationPriceAtLower string `protobuf:"bytes,6,opt,name=liquidation_price_at_lower,json=liquidationPriceAtLower,proto3" json:"liquidation_price_at_lower,omitempty"` +} + +func (x *EstimateAMMBoundsResponse) Reset() { + *x = EstimateAMMBoundsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[428] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EstimateAMMBoundsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EstimateAMMBoundsResponse) ProtoMessage() {} + +func (x *EstimateAMMBoundsResponse) ProtoReflect() protoreflect.Message { + mi := &file_data_node_api_v2_trading_data_proto_msgTypes[428] + 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 EstimateAMMBoundsResponse.ProtoReflect.Descriptor instead. +func (*EstimateAMMBoundsResponse) Descriptor() ([]byte, []int) { + return file_data_node_api_v2_trading_data_proto_rawDescGZIP(), []int{428} +} + +func (x *EstimateAMMBoundsResponse) GetPositionSizeAtUpper() string { + if x != nil { + return x.PositionSizeAtUpper + } + return "" +} + +func (x *EstimateAMMBoundsResponse) GetPositionSizeAtLower() string { + if x != nil { + return x.PositionSizeAtLower + } + return "" +} + +func (x *EstimateAMMBoundsResponse) GetLossOnCommitmentAtUpper() string { + if x != nil { + return x.LossOnCommitmentAtUpper + } + return "" +} + +func (x *EstimateAMMBoundsResponse) GetLossOnCommitmentAtLower() string { + if x != nil { + return x.LossOnCommitmentAtLower + } + return "" +} + +func (x *EstimateAMMBoundsResponse) GetLiquidationPriceAtUpper() string { + if x != nil { + return x.LiquidationPriceAtUpper + } + return "" +} + +func (x *EstimateAMMBoundsResponse) GetLiquidationPriceAtLower() string { + if x != nil { + return x.LiquidationPriceAtLower + } + return "" +} + +var File_data_node_api_v2_trading_data_proto protoreflect.FileDescriptor + +var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ + 0x0a, 0x23, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x32, 0x2f, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, + 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x11, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 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, + 0x1a, 0x1b, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, + 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x76, + 0x65, 0x67, 0x61, 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x12, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x76, 0x65, 0x67, + 0x61, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd9, 0x01, 0x0a, + 0x0a, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x05, 0x66, + 0x69, 0x72, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x05, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x61, 0x66, 0x74, 0x65, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x17, 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x02, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x06, 0x62, 0x65, + 0x66, 0x6f, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x65, 0x73, + 0x74, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, + 0x0b, 0x6e, 0x65, 0x77, 0x65, 0x73, 0x74, 0x46, 0x69, 0x72, 0x73, 0x74, 0x88, 0x01, 0x01, 0x42, + 0x08, 0x0a, 0x06, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x6e, 0x65, 0x77, 0x65, + 0x73, 0x74, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x08, 0x50, 0x61, 0x67, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, + 0x73, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x68, 0x61, 0x73, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x68, 0x61, 0x73, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x50, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, + 0x64, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x3e, 0x0a, 0x1b, 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, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x22, 0xb2, 0x02, 0x0a, 0x1c, 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, 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, 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, 0x27, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x75, 0x6d, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x43, 0x0a, 0x1e, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x75, 0x6d, 0x6d, 0x65, + 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, + 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x51, 0x75, + 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x70, 0x0a, 0x20, + 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, + 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, + 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x8b, + 0x02, 0x0a, 0x21, 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, 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, + 0x20, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x88, 0x01, + 0x01, 0x12, 0x4b, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 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, 0x0e, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x4e, + 0x0a, 0x10, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x73, 0x18, 0x04, 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, 0x0f, 0x76, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x22, 0xdb, 0x01, 0x0a, + 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 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, 0x12, + 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x49, 0x64, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x0f, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x22, 0xf7, 0x01, 0x0a, 0x13, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x36, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, + 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x57, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 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, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x80, 0x01, + 0x0a, 0x12, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 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, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 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, 0x5a, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, + 0x33, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 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, 0x22, 0xe6, 0x01, 0x0a, + 0x16, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 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, 0x12, + 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3b, 0x0a, 0x17, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, + 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x17, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x42, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, + 0x0a, 0x13, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, + 0x4d, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x0d, + 0x0a, 0x0b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, + 0x0c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0x5d, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x02, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x35, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xbd, + 0x03, 0x0a, 0x0b, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2e, + 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x26, + 0x0a, 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x10, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, + 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x49, 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x46, + 0x6f, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x73, 0x12, + 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x21, + 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x48, 0x01, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x08, 0x6c, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, + 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x22, 0xaa, + 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x48, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x4e, 0x0a, 0x12, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x38, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x18, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, + 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x19, 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, 0x12, 0x38, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x14, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x49, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x11, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x22, 0xa0, + 0x01, 0x0a, 0x15, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x39, 0x0a, 0x07, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, 0x07, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x55, 0x0a, 0x11, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 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, 0x12, 0x1b, 0x0a, 0x09, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x6c, 0x61, 0x73, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0x33, 0x0a, 0x0c, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x73, 0x18, 0x01, 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, 0x36, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x49, 0x64, 0x22, 0x4c, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x70, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, + 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 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, 0x05, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x22, 0xbb, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, + 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x42, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x01, 0x52, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x22, 0xac, 0x01, 0x0a, 0x14, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x61, + 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x67, 0x61, + 0x6d, 0x65, 0x49, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x73, + 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x46, 0x72, 0x6f, + 0x6d, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x54, + 0x6f, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, + 0x22, 0x68, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, + 0x0a, 0x0b, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, + 0x6f, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x74, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x18, 0x47, + 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, + 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 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, 0x5f, 0x0a, 0x12, 0x47, 0x61, + 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x45, 0x64, 0x67, 0x65, + 0x12, 0x31, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 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, 0x22, 0xbd, 0x01, 0x0a, 0x1a, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, + 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 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, 0x00, 0x52, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x06, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x48, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, + 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xca, 0x01, 0x0a, 0x15, + 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x73, + 0x12, 0x19, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x09, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x46, 0x72, 0x6f, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, + 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x6f, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x22, 0x6c, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, + 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x19, 0x47, 0x61, 0x6d, 0x65, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x73, 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, 0x61, 0x0a, 0x13, 0x47, 0x61, 0x6d, 0x65, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, + 0x32, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 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, 0x22, 0xb2, 0x01, 0x0a, 0x15, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x01, 0x52, 0x06, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x22, 0xcd, 0x02, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, + 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x11, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x52, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x69, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, + 0x64, 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, 0x20, 0x0a, 0x09, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x08, 0x6c, 0x69, 0x76, 0x65, 0x4f, 0x6e, 0x6c, 0x79, + 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, + 0x22, 0x5b, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, 0x64, 0x67, + 0x65, 0x12, 0x32, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 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, + 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, 0x22, 0x83, 0x01, + 0x0a, 0x13, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, + 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, 0x56, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, + 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x14, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 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, + 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, 0x40, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x00, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x3a, 0x02, + 0x18, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x5e, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x02, 0x18, + 0x01, 0x22, 0x4d, 0x0a, 0x0f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, + 0x22, 0xa4, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5d, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x6c, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4a, 0x0a, 0x0c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x64, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 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, 0x22, 0x81, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x05, 0x65, 0x64, 0x67, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 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, 0xcf, 0x01, 0x0a, 0x17, 0x4f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, 0x3b, 0x0a, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, + 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 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, 0x1a, 0x0a, 0x18, + 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x18, 0x4f, 0x62, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x48, 0x00, + 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x48, 0x00, 0x52, + 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x61, 0x0a, 0x14, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x09, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6c, + 0x61, 0x73, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x09, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4c, 0x65, 0x64, + 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x37, + 0x0a, 0x18, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x15, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x4f, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4e, 0x0a, 0x13, 0x66, 0x72, 0x6f, 0x6d, 0x5f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x52, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x11, 0x74, 0x6f, 0x5f, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x52, 0x0f, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x24, + 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x5f, 0x69, 0x64, 0x22, 0xfa, 0x05, 0x0a, 0x15, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 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, 0x12, 0x1a, 0x0a, 0x08, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x3d, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 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, 0x39, 0x0a, 0x0f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x07, 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, 0x36, 0x0a, 0x15, 0x66, + 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x12, 0x66, 0x72, + 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x13, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x02, 0x52, 0x10, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x16, 0x66, 0x72, 0x6f, 0x6d, 0x5f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x13, 0x66, 0x72, 0x6f, 0x6d, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x34, 0x0a, 0x14, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x04, 0x52, 0x11, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x72, 0x6f, 0x6d, 0x5f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x5f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, + 0x16, 0x0a, 0x14, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x19, 0x0a, 0x17, 0x5f, 0x66, 0x72, 0x6f, 0x6d, + 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x4a, 0x04, 0x08, 0x01, 0x10, + 0x02, 0x22, 0xf6, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, + 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x01, 0x52, 0x09, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x1a, 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, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, + 0x02, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x01, 0x52, 0x09, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x76, 0x0a, 0x19, 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, 0x12, 0x59, 0x0a, 0x0e, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x65, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0d, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x22, 0x71, + 0x0a, 0x1b, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, + 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x3a, 0x0a, + 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, + 0x74, 0x72, 0x79, 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, 0x22, 0x9f, 0x01, 0x0a, 0x21, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, + 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x64, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 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, 0xf3, 0x01, 0x0a, 0x19, 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, 0x12, 0x36, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, @@ -27210,7 +28529,7 @@ var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ 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, 0xe1, 0x02, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0xea, 0x03, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x1e, 0x0a, 0x08, 0x61, 0x73, @@ -27227,3325 +28546,3478 @@ var file_data_node_api_v2_trading_data_proto_rawDesc = []byte{ 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x05, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x66, 0x72, 0x6f, - 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x6f, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x53, 0x0a, 0x13, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x22, 0x46, 0x0a, 0x0a, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, - 0x20, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 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, 0x22, 0x7e, 0x0a, 0x11, 0x52, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, - 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x05, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, + 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x08, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x66, 0x72, 0x6f, 0x6d, + 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x53, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, + 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 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, 0xc7, 0x01, 0x0a, 0x1a, 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, 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, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x02, 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, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x50, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x46, 0x0a, 0x0a, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 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, 0x22, 0x7e, 0x0a, 0x11, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 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, 0xa0, 0x02, 0x0a, 0x1a, 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, 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, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 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, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, + 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, + 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x50, 0x0a, 0x1b, 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, 0x12, 0x31, 0x0a, 0x09, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x09, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x66, + 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, + 0x00, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, + 0x1e, 0x0a, 0x08, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x48, 0x01, 0x52, 0x07, 0x74, 0x6f, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0xb0, 0x01, 0x0a, 0x1f, + 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, 0x12, + 0x3c, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x46, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x00, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6f, + 0x0a, 0x20, 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, 0x12, 0x31, 0x0a, 0x09, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x09, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1b, 0x0a, - 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x73, 0x12, 0x22, 0x0a, 0x0a, 0x66, 0x72, 0x6f, - 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, - 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, - 0x08, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, - 0x01, 0x52, 0x07, 0x74, 0x6f, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0xb0, 0x01, 0x0a, 0x1f, 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, 0x12, 0x3c, 0x0a, - 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x09, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, + 0x95, 0x01, 0x0a, 0x1c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x3d, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 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, 0x5e, 0x0a, 0x16, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x64, 0x67, + 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 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, 0x22, 0x71, 0x0a, 0x15, 0x4f, 0x62, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x3e, 0x0a, 0x16, 0x4f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x52, 0x06, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, + 0x02, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x64, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x07, 0x64, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x22, 0xd0, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x01, 0x52, 0x09, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3f, 0x0a, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 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, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, + 0x22, 0x48, 0x0a, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, + 0x21, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 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, 0x22, 0x80, 0x01, 0x0a, 0x12, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 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, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 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, 0x2c, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x02, 0x69, 0x64, 0x22, 0x49, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x22, 0xd3, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 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, 0x40, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3e, + 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x01, + 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x63, 0x0a, 0x17, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x73, 0x22, 0x4e, 0x0a, 0x0e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x45, + 0x64, 0x67, 0x65, 0x12, 0x24, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 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, 0x22, 0x86, 0x01, 0x0a, 0x15, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, + 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x65, + 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 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, 0x32, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x35, + 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6f, 0x0a, 0x20, - 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, - 0x12, 0x4b, 0x0a, 0x09, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x09, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x95, 0x01, - 0x0a, 0x1c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, - 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x32, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x12, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x39, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x44, 0x0a, 0x09, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, + 0x65, 0x74, 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, + 0x22, 0x7c, 0x0a, 0x10, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 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, 0xa1, + 0x02, 0x0a, 0x1e, 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, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6c, + 0x69, 0x76, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x21, 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, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, + 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, + 0x04, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x04, 0x6c, + 0x69, 0x76, 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x84, 0x01, 0x0a, 0x1f, 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, 0x12, 0x61, 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, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 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, 0x92, 0x01, 0x0a, 0x22, 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, 0x12, 0x6c, 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, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 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, 0x8d, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x07, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 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, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x12, 0x37, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 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, 0x48, 0x00, 0x52, 0x07, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x5f, 0x0a, 0x17, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x64, 0x67, 0x65, + 0x12, 0x2c, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 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, 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, 0x22, 0x74, 0x0a, 0x21, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, + 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x6e, + 0x6f, 0x64, 0x65, 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, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 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, 0x22, 0x97, 0x01, 0x0a, + 0x1d, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, + 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 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, 0xac, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, + 0x74, 0x68, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x48, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 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, 0x5e, 0x0a, 0x16, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x64, 0x67, 0x65, 0x12, - 0x2c, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 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, 0x22, 0x71, 0x0a, 0x15, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, - 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x3e, 0x0a, 0x16, 0x4f, 0x62, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x24, 0x0a, 0x06, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x52, 0x06, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, - 0x02, 0x69, 0x64, 0x22, 0x3d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x07, 0x64, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x22, 0xd0, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, - 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x01, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x57, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, - 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 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, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x22, 0x48, - 0x0a, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x21, 0x0a, - 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 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, 0x22, 0x80, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 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, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 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, 0x2c, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x02, 0x69, 0x64, 0x22, 0x49, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x61, 0x6c, 0x22, 0xd3, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 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, 0x40, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x0a, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x01, 0x52, 0x09, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0x63, 0x0a, 0x17, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x22, - 0x4e, 0x0a, 0x0e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x45, 0x64, 0x67, - 0x65, 0x12, 0x24, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 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, 0x22, - 0x86, 0x01, 0x0a, 0x15, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x65, 0x64, 0x67, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x61, 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, 0x32, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, - 0x41, 0x01, 0x02, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x35, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x21, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x01, 0x52, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, - 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x44, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x21, 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, 0x12, 0x20, 0x0a, 0x09, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, + 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x71, 0x0a, 0x22, 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, 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, 0x22, 0xcd, 0x01, 0x0a, 0x1d, + 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, 0x12, 0x20, 0x0a, + 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb7, 0x01, 0x0a, 0x11, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 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, 0x3c, 0x0a, 0x09, 0x66, 0x65, 0x65, + 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x65, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x08, 0x66, + 0x65, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x03, 0x73, 0x6c, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x4c, 0x41, + 0x52, 0x03, 0x73, 0x6c, 0x61, 0x22, 0x67, 0x0a, 0x15, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x45, 0x64, 0x67, 0x65, 0x12, 0x36, + 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 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, 0x22, 0x7c, - 0x0a, 0x10, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x93, + 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, + 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 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, 0x7f, 0x0a, 0x1e, 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, 0x12, 0x5d, 0x0a, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x12, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0xd2, 0x03, 0x0a, 0x1c, 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, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x08, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x73, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x15, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, + 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x48, 0x05, 0x52, 0x09, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x46, 0x72, 0x6f, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x48, 0x06, 0x52, 0x07, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x6f, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, + 0x73, 0x65, 0x71, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, + 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x22, 0x7d, 0x0a, 0x1d, 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, 0x12, 0x5c, 0x0a, 0x13, 0x70, + 0x61, 0x69, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x69, 0x64, 0x4c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x70, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x22, 0x6b, 0x0a, 0x15, 0x50, 0x61, 0x69, + 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x45, 0x64, + 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 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, 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, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x50, 0x61, 0x69, 0x64, 0x4c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 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, 0xa1, 0x02, 0x0a, - 0x1e, 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, 0x12, - 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x76, 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x04, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, - 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6c, 0x69, 0x76, - 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xa4, 0x02, 0x0a, 0x21, 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, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x6c, - 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x76, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 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, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, - 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x84, 0x01, 0x0a, 0x1f, 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, 0x12, 0x61, 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, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 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, 0x92, - 0x01, 0x0a, 0x22, 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, 0x12, 0x6c, 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, - 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 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, 0x8d, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 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, 0x07, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x37, - 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 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, 0x48, 0x00, 0x52, 0x07, 0x70, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x65, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x22, 0x5f, 0x0a, 0x17, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2c, - 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 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, 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, 0x22, 0x74, 0x0a, 0x21, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x50, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x6f, 0x64, - 0x65, 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, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 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, 0x22, 0x97, 0x01, 0x0a, 0x1d, 0x4c, - 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x05, - 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, + 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x81, 0x01, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0b, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x21, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, + 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x22, 0x45, 0x0a, 0x19, 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, 0x12, 0x28, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xcb, 0x06, 0x0a, 0x19, 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, 0x12, 0x40, 0x0a, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, + 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, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x48, + 0x01, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, + 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x03, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x22, 0x88, 0x03, 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, 0x0c, 0x0a, 0x08, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, + 0x45, 0x57, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, + 0x54, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, + 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x53, 0x10, 0x04, + 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x41, 0x53, 0x53, + 0x45, 0x54, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x57, + 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x45, + 0x54, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x57, 0x5f, + 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x08, 0x12, 0x1b, 0x0a, + 0x17, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x50, 0x4f, + 0x54, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x09, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x10, + 0x0a, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, + 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x10, 0x0b, 0x12, 0x1c, 0x0a, 0x18, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, + 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x0c, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, + 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x0d, 0x12, 0x27, 0x0a, 0x23, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 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, 0x10, 0x0e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x67, 0x0a, 0x1a, 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, 0x12, 0x49, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x56, + 0x0a, 0x12, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x64, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 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, 0x22, 0x8d, 0x01, 0x0a, 0x18, 0x47, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, + 0x61, 0x74, 0x61, 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, 0x47, 0x0a, 0x18, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 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, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x22, + 0x45, 0x0a, 0x19, 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, 0x12, 0x28, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xed, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x1c, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x1e, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x03, 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, 0x0a, + 0x0a, 0x08, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x63, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, + 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x4e, 0x0a, 0x0e, 0x44, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x64, 0x67, 0x65, 0x12, 0x24, 0x0a, + 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x22, 0x86, 0x01, 0x0a, 0x15, + 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 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, 0xac, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, - 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x48, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 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, 0x80, 0x01, 0x0a, 0x21, 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, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, - 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x71, 0x0a, 0x22, 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, 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, 0x22, 0xcd, 0x01, 0x0a, 0x1d, 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, 0x12, 0x20, 0x0a, 0x09, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, - 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x02, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, - 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb7, 0x01, 0x0a, 0x11, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 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, 0x3c, 0x0a, 0x09, 0x66, 0x65, 0x65, 0x5f, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x46, 0x65, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x08, 0x66, 0x65, 0x65, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x03, 0x73, 0x6c, 0x61, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x4c, 0x41, 0x52, 0x03, - 0x73, 0x6c, 0x61, 0x22, 0x67, 0x0a, 0x15, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x45, 0x64, 0x67, 0x65, 0x12, 0x36, 0x0a, 0x04, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x04, + 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x72, 0x0a, 0x19, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x44, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x1c, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0a, 0x0a, 0x08, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x4e, 0x0a, 0x1a, 0x4f, 0x62, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x64, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x91, 0x02, 0x0a, 0x09, 0x4e, 0x6f, 0x64, + 0x65, 0x42, 0x61, 0x73, 0x69, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, + 0x1c, 0x0a, 0x0a, 0x74, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, + 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, 0x66, 0x6f, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x66, 0x6f, + 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x22, 0x17, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x45, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x26, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, + 0x00, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x88, 0x01, 0x01, 0x12, 0x40, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, + 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4b, 0x0a, + 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x42, 0x0a, 0x08, 0x4e, 0x6f, + 0x64, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 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, 0x22, 0x7a, + 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 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, 0x82, 0x01, 0x0a, 0x19, 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, 0x12, 0x14, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, + 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x67, 0x0a, 0x1a, 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, 0x12, 0x49, 0x0a, + 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x60, 0x0a, 0x11, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x33, 0x0a, + 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 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, 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, 0x22, 0x8c, 0x01, 0x0a, 0x18, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 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, 0x0f, 0x47, 0x65, 0x74, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x13, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x19, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x48, 0x01, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, + 0x5f, 0x69, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x35, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x22, 0x6d, 0x0a, 0x12, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, + 0x01, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x22, 0x32, 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, + 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x03, 0x66, 0x65, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, + 0x65, 0x65, 0x52, 0x03, 0x66, 0x65, 0x65, 0x22, 0xe7, 0x01, 0x0a, 0x15, 0x45, 0x73, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x21, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x04, 0x73, 0x69, 0x64, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x42, + 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x04, 0x73, 0x69, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x04, 0xe2, 0x41, 0x01, + 0x02, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x12, 0x1a, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x3a, 0x02, 0x18, + 0x01, 0x22, 0x55, 0x0a, 0x16, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x0d, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x6f, 0x0a, 0x1c, 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, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7b, 0x0a, 0x1d, 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, 0x12, 0x5a, 0x0a, 0x12, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x34, 0x0a, 0x1a, 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, 0x12, 0x16, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x62, 0x0a, 0x1b, + 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, 0x12, 0x43, 0x0a, 0x11, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x10, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x22, 0x5a, 0x0a, 0x14, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 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, 0x22, 0x93, 0x01, 0x0a, - 0x1b, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x05, - 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 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, 0x7f, 0x0a, 0x1e, 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, 0x12, 0x5d, 0x0a, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x12, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x1c, 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, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, - 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x08, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x53, 0x65, 0x71, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x49, 0x64, 0x73, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x91, 0x01, 0x0a, + 0x1a, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x05, 0x65, + 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 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, 0x5a, 0x0a, 0x0a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 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, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x69, 0x0a, 0x16, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x63, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x59, 0x0a, 0x0e, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, + 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 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, 0x22, 0x86, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 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, 0x83, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x7d, 0x0a, 0x1d, 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, - 0x12, 0x5c, 0x0a, 0x13, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, - 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x70, 0x61, 0x69, - 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x22, 0x6b, - 0x0a, 0x15, 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, - 0x65, 0x65, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x01, 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, 0x04, 0x6e, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x6c, 0x69, 0x6e, + 0x6b, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, + 0x61, 0x6b, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, + 0x73, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x5c, 0x0a, + 0x10, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x64, 0x67, + 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 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, 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, 0x22, 0x93, 0x01, 0x0a, 0x1b, - 0x50, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, - 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x05, 0x65, - 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x69, - 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x45, 0x64, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x83, 0x01, 0x0a, 0x10, + 0x53, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x37, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 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, 0x81, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, - 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x45, 0x0a, 0x19, 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, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xcb, 0x06, 0x0a, - 0x19, 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, 0x12, 0x40, 0x0a, 0x0e, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x0d, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2f, 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, 0x2e, - 0x54, 0x79, 0x70, 0x65, 0x48, 0x01, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x02, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x50, 0x61, - 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x04, 0x52, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x22, 0x88, - 0x03, 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, 0x0c, 0x0a, - 0x08, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x02, - 0x12, 0x16, 0x0a, 0x12, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, - 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, - 0x45, 0x52, 0x53, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, - 0x57, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x10, - 0x06, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, - 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, - 0x10, 0x08, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, - 0x45, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x09, 0x12, - 0x15, 0x0a, 0x11, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x57, 0x5f, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x10, 0x0a, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, - 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x10, 0x0b, - 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, - 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x0c, 0x12, 0x20, - 0x0a, 0x1c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, - 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x0d, - 0x12, 0x27, 0x0a, 0x23, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 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, 0x10, 0x0e, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x70, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42, 0x10, 0x0a, 0x0e, - 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x67, 0x0a, 0x1a, 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, 0x12, 0x49, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x56, 0x0a, 0x12, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x64, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6e, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, - 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 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, 0x22, 0x8d, 0x01, 0x0a, 0x18, - 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, - 0x61, 0x6e, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 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, 0x47, 0x0a, 0x18, 0x4f, - 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 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, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x5f, 0x69, 0x64, 0x22, 0x45, 0x0a, 0x19, 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, 0x12, 0x28, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, - 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xed, 0x01, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x1c, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 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, 0x03, 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, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x42, - 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x63, 0x0a, 0x17, 0x4c, - 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x4e, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x64, - 0x67, 0x65, 0x12, 0x24, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, + 0x6f, 0x22, 0x3a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0x4b, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0b, 0x72, 0x69, 0x73, 0x6b, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0a, + 0x72, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xa1, 0x01, 0x0a, 0x16, 0x4f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 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, 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, 0x12, + 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x4b, + 0x0a, 0x17, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x73, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x1d, 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, 0x22, 0x5f, 0x0a, 0x1e, + 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, 0x12, 0x3d, + 0x0a, 0x0f, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, + 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0e, 0x6c, + 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x94, 0x01, + 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x60, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x52, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x44, 0x0a, 0x09, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x72, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5a, 0x0a, 0x0f, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6e, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 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, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x05, + 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4b, 0x65, + 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x9c, 0x01, 0x0a, + 0x1f, 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, + 0x12, 0x1c, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, + 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x78, 0x0a, 0x20, 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, 0x12, + 0x54, 0x0a, 0x0d, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x1e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, + 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x6a, 0x0a, 0x17, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x22, 0x14, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x33, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x89, 0x01, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x65, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, + 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0c, 0x65, 0x6e, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, + 0x10, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x21, 0x0a, 0x1f, 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, 0x22, 0x38, 0x0a, 0x20, 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, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x22, 0x83, 0x02, 0x0a, 0x23, 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, 0x12, 0x4a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 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, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x61, 0x70, 0x70, + 0x72, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x79, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x02, 0x52, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x61, 0x70, 0x70, 0x72, + 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x98, 0x01, 0x0a, 0x24, 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, 0x12, + 0x70, 0x0a, 0x1a, 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, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x21, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 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, 0x6f, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x45, 0x64, + 0x67, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 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, 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, 0x22, 0x6b, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x72, 0x65, + 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x6b, 0x0a, 0x19, 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, 0x12, 0x4e, + 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0d, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x22, 0x89, + 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x64, 0x67, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x53, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 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, 0x60, 0x0a, 0x10, 0x43, 0x6f, + 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x34, + 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 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, 0x22, 0x81, 0x02, 0x0a, + 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x6f, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2c, 0x0a, + 0x12, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x1b, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, + 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x18, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, + 0x22, 0x2b, 0x0a, 0x29, 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, 0x22, 0x8d, 0x01, + 0x0a, 0x2a, 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, 0x12, 0x39, 0x0a, 0x07, + 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x07, + 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x77, 0x61, 0x72, 0x6d, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x65, 0x64, 0x22, 0x26, 0x0a, + 0x24, 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, 0x22, 0x64, 0x0a, 0x25, 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, 0x12, 0x3b, + 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x2d, 0x0a, 0x2b, 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, 0x22, 0x51, 0x0a, 0x2c, 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, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x70, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0b, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x20, 0x0a, + 0x1e, 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, 0x22, + 0xb0, 0x01, 0x0a, 0x1f, 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, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x70, 0x66, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x70, 0x66, 0x73, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x77, 0x61, 0x72, 0x6d, + 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x73, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x77, 0x61, + 0x72, 0x6d, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x65, 0x65, + 0x72, 0x73, 0x22, 0x28, 0x0a, 0x26, 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, 0x22, 0x52, 0x0a, 0x27, + 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, 0x12, 0x27, 0x0a, 0x0f, 0x62, 0x6f, 0x6f, 0x74, 0x73, + 0x74, 0x72, 0x61, 0x70, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0e, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x50, 0x65, 0x65, 0x72, 0x73, + 0x22, 0x85, 0x01, 0x0a, 0x1b, 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, + 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x74, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2c, 0x0a, 0x05, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x46, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, + 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2f, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, + 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, + 0x22, 0xad, 0x0d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x73, 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, 0x12, 0x2c, 0x0a, 0x09, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x6c, 0x65, 0x64, 0x67, 0x65, + 0x72, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0d, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0e, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x05, + 0x76, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x24, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 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, 0x52, 0x1f, 0x65, 0x72, 0x63, 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, 0x84, 0x01, 0x0a, 0x26, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, + 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 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, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x21, 0x65, 0x72, 0x63, 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, 0x23, 0x0a, 0x06, + 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x0a, 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, 0x33, 0x0a, 0x0c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, + 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, + 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x12, 0x31, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x07, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x73, 0x12, 0x25, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, + 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x73, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x73, 0x12, 0x26, 0x0a, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x10, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x52, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x08, 0x64, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x0b, 0x77, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 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, 0x14, 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, 0x2c, 0x0a, 0x09, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x09, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, + 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x05, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x48, + 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x18, 0x18, 0x20, 0x03, 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, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x19, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x11, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x40, 0x0a, 0x0d, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x59, 0x0a, 0x16, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1b, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x62, 0x0a, 0x1a, + 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, 0x73, 0x18, 0x1c, 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, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, + 0x22, 0x65, 0x0a, 0x1d, 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, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x49, 0x64, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x48, 0x00, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x6e, 0x0a, 0x1e, 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, 0x12, 0x4c, 0x0a, 0x0f, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x18, 0x01, 0x20, 0x01, + 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, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, + 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x22, 0xac, 0x01, 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, 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, 0x2c, 0x0a, 0x12, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, + 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x65, 0x71, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x16, + 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbe, 0x01, 0x0a, 0x1a, 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, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, 0x0a, 0x12, 0x46, 0x75, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x33, 0x0a, + 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 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, 0x22, 0x8d, 0x01, 0x0a, 0x18, 0x46, + 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 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, 0x73, 0x0a, 0x1b, 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, 0x12, 0x54, 0x0a, 0x10, 0x66, 0x75, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, + 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, + 0xde, 0x01, 0x0a, 0x19, 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, 0x12, 0x21, 0x0a, + 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x48, 0x00, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x5e, 0x0a, 0x11, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 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, 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, - 0x22, 0x86, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x65, 0x64, - 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x72, 0x0a, 0x19, 0x4f, 0x62, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x1c, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, - 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x4e, 0x0a, - 0x1a, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x91, 0x02, - 0x0a, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x61, 0x73, 0x69, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, - 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, - 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x0a, 0x74, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6d, 0x50, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, - 0x08, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x69, 0x6e, 0x66, 0x6f, 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, - 0x6c, 0x22, 0x17, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x45, 0x0a, 0x16, 0x47, 0x65, - 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x22, 0x26, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x02, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x22, 0x93, 0x01, 0x0a, - 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, - 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, - 0x73, 0x65, 0x71, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x4b, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, - 0x42, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x6e, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 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, 0x22, 0x7a, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 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, - 0x82, 0x01, 0x0a, 0x19, 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, 0x12, 0x14, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x67, 0x0a, 0x1a, 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, 0x12, 0x49, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x60, 0x0a, - 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x64, - 0x67, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 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, 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, 0x22, - 0x8c, 0x01, 0x0a, 0x18, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, + 0x22, 0x8b, 0x01, 0x0a, 0x17, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 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, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, - 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x88, 0x01, - 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x22, 0x35, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x6d, 0x0a, 0x12, 0x45, 0x73, 0x74, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x21, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x18, - 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x04, 0xe2, 0x41, - 0x01, 0x02, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x32, 0x0a, 0x13, 0x45, 0x73, 0x74, 0x69, - 0x6d, 0x61, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1b, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x03, 0x66, 0x65, 0x65, 0x22, 0xe7, 0x01, 0x0a, - 0x15, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x6f, + 0x0a, 0x1a, 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, 0x12, 0x51, 0x0a, 0x0f, + 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0e, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x73, 0x22, + 0xdd, 0x02, 0x0a, 0x22, 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, 0x12, 0x21, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, - 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, - 0x02, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x04, 0x73, 0x69, - 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x53, 0x69, 0x64, 0x65, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x04, 0x73, 0x69, 0x64, 0x65, - 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, - 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, - 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1a, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x55, 0x0a, 0x16, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, - 0x74, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x37, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x0c, 0x6d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x6f, 0x0a, - 0x1c, 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, 0x12, 0x40, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 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, 0x00, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7b, - 0x0a, 0x1d, 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, 0x12, - 0x5a, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x34, 0x0a, 0x1a, 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, 0x12, 0x16, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x22, 0x62, 0x0a, 0x1b, 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, - 0x12, 0x43, 0x0a, 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0x5a, 0x0a, 0x14, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2a, 0x0a, - 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 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, 0x22, 0x91, 0x01, 0x0a, 0x1a, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x3b, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 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, 0x5a, 0x0a, 0x0a, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 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, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x22, 0x69, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 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, 0x00, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x63, 0x0a, 0x17, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x22, 0x59, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x45, - 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 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, 0x22, 0x86, 0x01, 0x0a, - 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 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, 0x83, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x6b, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, - 0x02, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x94, 0x01, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x36, 0x0a, 0x17, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x6b, - 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x41, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x48, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x6b, - 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, - 0x67, 0x73, 0x22, 0x5c, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, - 0x6e, 0x67, 0x45, 0x64, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 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, 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, - 0x22, 0x83, 0x01, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, - 0x69, 0x6e, 0x67, 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, 0x3a, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x69, 0x73, - 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x21, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x0b, - 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x0a, 0x72, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, - 0xa1, 0x01, 0x0a, 0x16, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x42, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x73, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 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, 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, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x61, 0x74, 0x63, 0x68, 0x53, - 0x69, 0x7a, 0x65, 0x22, 0x4b, 0x0a, 0x17, 0x4f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x42, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, - 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x42, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x22, 0x1f, 0x0a, 0x1d, 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, 0x22, 0x5f, 0x0a, 0x1e, 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, 0x12, 0x3d, 0x0a, 0x0f, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x6d, 0x6f, - 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0e, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0x94, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x09, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x06, 0x73, 0x6f, 0x75, + 0x72, 0x63, 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, 0x48, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x48, 0x02, 0x52, 0x03, 0x73, 0x65, 0x71, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x01, 0x52, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, - 0x0a, 0x08, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x60, 0x0a, 0x18, 0x4c, 0x69, 0x73, - 0x74, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x09, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x5a, 0x0a, 0x0f, 0x4b, - 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, - 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, - 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x52, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x64, + 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x03, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x09, 0x0a, + 0x07, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x73, 0x65, 0x71, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x70, 0x0a, 0x1a, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x3a, 0x0a, + 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 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, 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, 0x22, 0x9d, 0x01, 0x0a, 0x20, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 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, 0x9c, 0x01, 0x0a, 0x1f, 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, 0x12, 0x1c, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, - 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x78, 0x0a, 0x20, 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, 0x12, 0x54, 0x0a, 0x0d, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6b, 0x65, - 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x98, 0x01, 0x0a, 0x1e, 0x45, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, - 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x45, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 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, 0x6a, 0x0a, 0x17, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x64, 0x67, 0x65, - 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 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, 0x22, 0x14, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x33, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x67, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x89, 0x01, 0x0a, - 0x09, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x0f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x65, 0x6e, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, - 0x01, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x88, - 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x21, 0x0a, 0x1f, 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, 0x22, 0x38, 0x0a, 0x20, 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, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x72, 0x65, 0x61, 0x64, 0x79, 0x22, 0x83, 0x02, 0x0a, 0x23, 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, 0x12, 0x4a, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 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, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x61, 0x70, 0x70, - 0x72, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x0a, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x42, 0x79, 0x88, 0x01, 0x01, 0x12, - 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x0e, 0x0a, 0x0c, - 0x5f, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x98, 0x01, 0x0a, 0x24, - 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, 0x12, 0x70, 0x0a, 0x1a, 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, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x21, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x05, - 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 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, 0x6f, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x45, 0x64, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 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, 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, 0x22, 0x6b, 0x0a, 0x18, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6b, 0x0a, 0x19, 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, 0x12, 0x4e, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, - 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x16, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, - 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6f, 0x22, 0x95, 0x01, 0x0a, 0x23, 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, 0x12, 0x6e, 0x0a, 0x1a, 0x66, 0x75, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 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, - 0x60, 0x0a, 0x10, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x45, - 0x64, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, - 0x61, 0x74, 0x61, 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, 0x22, 0x81, 0x02, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x5f, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x6f, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x65, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x68, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x29, 0x0a, 0x10, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x2b, 0x0a, 0x29, 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, 0x22, 0x8d, 0x01, 0x0a, 0x2a, 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, 0x12, 0x39, 0x0a, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x07, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, - 0x73, 0x77, 0x61, 0x72, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x4b, 0x65, 0x79, 0x53, 0x65, - 0x65, 0x64, 0x22, 0x26, 0x0a, 0x24, 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, 0x22, 0x64, 0x0a, 0x25, 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, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x22, 0x2d, 0x0a, 0x2b, 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, 0x22, - 0x51, 0x0a, 0x2c, 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, 0x12, - 0x21, 0x0a, 0x0c, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x22, 0x20, 0x0a, 0x1e, 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, 0x22, 0xb0, 0x01, 0x0a, 0x1f, 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, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x70, 0x66, 0x73, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x69, 0x70, 0x66, 0x73, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x73, - 0x77, 0x61, 0x72, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x73, 0x77, 0x61, 0x72, 0x6d, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x73, 0x77, 0x61, 0x72, - 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x73, 0x77, 0x61, 0x72, 0x6d, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x65, 0x64, 0x12, 0x27, - 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x65, 0x72, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x50, 0x65, 0x65, 0x72, 0x73, 0x22, 0x28, 0x0a, 0x26, 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, 0x22, 0x52, 0x0a, 0x27, 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, 0x12, 0x27, 0x0a, 0x0f, - 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, - 0x50, 0x65, 0x65, 0x72, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x1b, 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, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x6f, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x2c, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, + 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, + 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x17, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x0d, 0x0a, 0x0b, 0x50, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0e, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9f, 0x01, 0x0a, 0x09, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x0a, 0x04, 0x73, 0x69, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x64, 0x65, + 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x04, 0x73, 0x69, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x05, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, + 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x09, 0x72, 0x65, 0x6d, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x04, 0xe2, 0x41, 0x01, + 0x02, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x0f, + 0x69, 0x73, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0d, 0x69, 0x73, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xca, 0x06, 0x0a, 0x17, 0x45, + 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, + 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x6f, 0x70, 0x65, + 0x6e, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x04, + 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x34, 0x0a, 0x13, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, + 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, + 0x41, 0x01, 0x02, 0x52, 0x11, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x3a, 0x0a, 0x16, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, + 0x52, 0x14, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x17, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x15, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x1c, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, + 0x52, 0x19, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, + 0x64, 0x65, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0a, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x79, + 0x0a, 0x38, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x01, 0x52, 0x32, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x49, 0x6e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x5e, 0x0a, 0x2a, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x64, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, + 0x25, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x6f, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x3b, 0x0a, 0x39, 0x5f, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x5f, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, + 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x42, 0x2d, 0x0a, 0x2b, 0x5f, 0x73, 0x63, 0x61, + 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x64, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x22, 0x8a, 0x02, 0x0a, 0x18, 0x45, 0x73, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x45, 0x73, 0x74, + 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x6d, 0x0a, + 0x1c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x63, 0x72, + 0x65, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x52, 0x1a, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x61, 0x73, 0x65, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x0b, + 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x58, 0x0a, 0x1a, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, + 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x73, 0x74, 0x43, 0x61, 0x73, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x22, 0x74, + 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x12, 0x31, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x73, 0x74, 0x43, + 0x61, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x08, 0x62, 0x65, 0x73, 0x74, + 0x43, 0x61, 0x73, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0a, + 0x77, 0x6f, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x3e, + 0x0a, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x52, 0x08, 0x62, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x22, 0xa2, + 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, + 0x70, 0x65, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x30, 0x0a, + 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x75, 0x79, 0x5f, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x75, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x6c, + 0x6c, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x22, 0x22, 0x0a, 0x20, 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, 0x22, 0x7f, 0x0a, 0x21, 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, 0x12, 0x5a, 0x0a, 0x18, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x46, 0x0a, - 0x13, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, - 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x61, 0x73, 0x68, 0x22, 0xad, 0x0d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, - 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 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, 0x12, 0x2c, - 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x09, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0e, - 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x65, 0x64, 0x67, - 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x52, 0x0e, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x12, 0x36, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x09, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x76, 0x6f, 0x74, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, - 0x6f, 0x74, 0x65, 0x52, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x73, 0x12, 0x7e, 0x0a, 0x24, 0x65, 0x72, - 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x69, - 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x6e, 0x64, 0x6c, - 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 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, 0x52, 0x1f, 0x65, 0x72, 0x63, 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, 0x84, 0x01, 0x0a, 0x26, 0x65, - 0x72, 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x5f, 0x73, 0x69, 0x67, 0x5f, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x62, 0x75, - 0x6e, 0x64, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 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, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x52, 0x21, - 0x65, 0x72, 0x63, 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, 0x23, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x0a, 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, 0x33, 0x0a, 0x0c, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, - 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x73, 0x12, 0x31, 0x0a, 0x0b, 0x6f, - 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x26, - 0x0a, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x37, 0x0a, - 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x0f, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x52, 0x07, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x29, - 0x0a, 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, - 0x08, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x0b, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x18, 0x12, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, - 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x23, 0x0a, - 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, - 0x74, 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, 0x14, 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, - 0x2c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x15, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, - 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x16, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x30, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x42, 0x61, 0x73, 0x69, 0x63, 0x52, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x18, 0x20, 0x03, 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, 0x52, 0x0e, 0x6e, - 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x45, 0x0a, - 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x52, 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, - 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x59, 0x0a, 0x16, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x65, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x62, 0x0a, 0x1a, 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, 0x73, 0x18, - 0x1c, 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, 0x18, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x22, 0x65, 0x0a, 0x1d, 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, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x88, - 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x6e, 0x0a, 0x1e, - 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, 0x12, 0x4c, - 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6b, 0x18, 0x01, 0x20, 0x01, 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, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x0e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x22, 0xac, 0x01, 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, 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, 0x2c, 0x0a, 0x12, 0x66, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x10, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x53, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xbe, 0x01, 0x0a, 0x1a, - 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, 0x12, 0x1f, 0x0a, 0x08, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, - 0x01, 0x02, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x01, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, - 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x61, 0x0a, 0x12, - 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x64, - 0x67, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 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, 0x22, - 0x8d, 0x01, 0x0a, 0x18, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x05, - 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x64, 0x67, 0x65, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0xb6, 0x02, 0x0a, 0x0f, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, + 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, + 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, + 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, + 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x0d, + 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, + 0x6e, 0x67, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x54, + 0x69, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, + 0x74, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x22, 0x9c, 0x01, 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, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x22, 0x5b, 0x0a, 0x0f, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x45, + 0x64, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 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, 0x22, 0x87, 0x01, + 0x0a, 0x15, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x53, 0x65, 0x74, 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, 0x84, 0x02, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x22, 0x67, + 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0d, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x22, 0xa3, 0x02, 0x0a, 0x12, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x26, + 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x4c, 0x0a, 0x23, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x1f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x69, 0x0a, + 0x16, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 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, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 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, 0x22, 0x95, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x05, 0x65, 0x64, 0x67, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 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, 0xd6, 0x02, 0x0a, 0x1e, 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, 0x12, 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, + 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x73, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x1f, 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, 0x12, 0x61, 0x0a, + 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, + 0x22, 0x86, 0x02, 0x0a, 0x1a, 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, 0x12, + 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, + 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, + 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, + 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x03, 0x52, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, + 0x10, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x60, 0x0a, 0x1b, 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, 0x12, 0x41, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x91, 0x01, 0x0a, 0x1a, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x05, 0x65, 0x64, + 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 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, - 0x73, 0x0a, 0x1b, 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, 0x12, 0x54, - 0x0a, 0x10, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0xde, 0x01, 0x0a, 0x19, 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, 0x12, 0x21, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5e, 0x0a, 0x11, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x04, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 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, 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, 0x22, 0x8b, 0x01, 0x0a, 0x17, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 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, 0x6f, 0x0a, 0x1a, 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, 0x12, 0x51, 0x0a, 0x0f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x73, 0x22, 0xdd, 0x02, 0x0a, 0x22, 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, 0x12, 0x21, 0x0a, 0x09, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, - 0xe2, 0x41, 0x01, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x3e, - 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x48, 0x00, - 0x52, 0x09, 0x64, 0x61, 0x74, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4a, - 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 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, 0x48, 0x01, 0x52, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x73, 0x65, - 0x71, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x03, 0x73, 0x65, 0x71, 0x88, 0x01, - 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 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, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x06, 0x0a, - 0x04, 0x5f, 0x73, 0x65, 0x71, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x1a, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x45, 0x64, - 0x67, 0x65, 0x12, 0x3a, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 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, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, + 0x65, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 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, 0x22, 0x9d, 0x01, 0x0a, 0x20, 0x46, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x05, 0x65, - 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x12, 0x36, + 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xf2, 0x03, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 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, 0x59, 0x0a, 0x2a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6e, + 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x25, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4e, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 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, 0x12, 0x27, 0x0a, 0x0f, + 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3d, 0x0a, 0x1b, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x6b, + 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x18, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, + 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x19, 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, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x61, 0x73, 0x5f, 0x65, 0x6c, 0x69, 0x67, + 0x69, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x61, 0x73, 0x45, + 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, + 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0xd4, 0x02, 0x0a, 0x04, + 0x54, 0x65, 0x61, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, + 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, + 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 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, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x75, 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, + 0x72, 0x6c, 0x22, 0x4d, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x6d, 0x45, 0x64, 0x67, 0x65, 0x12, 0x29, + 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, + 0x65, 0x61, 0x6d, 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, 0x22, 0x79, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 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, 0xba, 0x01, 0x0a, + 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x11, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, + 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x54, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, + 0x74, 0x65, 0x61, 0x6d, 0x73, 0x22, 0xe2, 0x01, 0x0a, 0x1a, 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, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, + 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x1b, 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, 0x12, 0x4a, 0x0a, 0x0a, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x19, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 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, 0x95, 0x01, 0x0a, 0x23, 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, 0x12, 0x6e, - 0x0a, 0x1a, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x0d, - 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x0e, 0x0a, - 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9f, 0x01, - 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x0a, 0x04, 0x73, - 0x69, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x53, 0x69, 0x64, 0x65, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x04, 0x73, 0x69, 0x64, - 0x65, 0x12, 0x1a, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x22, 0x0a, - 0x09, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x12, 0x2c, 0x0a, 0x0f, 0x69, 0x73, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, - 0x52, 0x0d, 0x69, 0x73, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, - 0xca, 0x06, 0x0a, 0x17, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, - 0xe2, 0x41, 0x01, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, - 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x13, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, - 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x11, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x3a, 0x0a, 0x16, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x14, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x41, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x3c, 0x0a, 0x17, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, - 0x01, 0x02, 0x52, 0x15, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x45, 0x0a, 0x1c, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x19, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x37, 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x0a, 0x6d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x6d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x79, 0x0a, 0x38, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x72, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x32, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x49, 0x6e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x5e, - 0x0a, 0x2a, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x02, 0x52, 0x25, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x6f, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, - 0x42, 0x3b, 0x0a, 0x39, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x42, 0x2d, 0x0a, - 0x2b, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x22, 0x8a, 0x02, 0x0a, - 0x18, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x6d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x12, 0x6d, 0x0a, 0x1c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, - 0x5f, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, - 0x74, 0x65, 0x72, 0x61, 0x6c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x45, 0x73, 0x74, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x1a, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, - 0x6c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x12, 0x46, 0x0a, 0x0b, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x6c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x58, 0x0a, 0x1a, 0x43, 0x6f, 0x6c, - 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x45, - 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x73, 0x74, - 0x5f, 0x63, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x6f, 0x72, - 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x63, - 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x73, 0x74, 0x43, - 0x61, 0x73, 0x65, 0x22, 0x74, 0x0a, 0x0e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x45, 0x73, 0x74, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x73, 0x74, 0x5f, 0x63, - 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, 0x09, 0x77, - 0x6f, 0x72, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x62, 0x65, 0x73, 0x74, - 0x5f, 0x63, 0x61, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x52, - 0x08, 0x62, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x13, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x73, 0x74, 0x43, - 0x61, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x08, 0x62, 0x65, 0x73, 0x74, 0x43, - 0x61, 0x73, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x6e, - 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4f, 0x6e, - 0x6c, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x62, 0x75, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x75, 0x79, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x73, 0x65, 0x6c, 0x6c, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x13, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x65, - 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x22, 0x22, 0x0a, 0x20, 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, 0x22, 0x7f, 0x0a, 0x21, - 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, 0x12, 0x5a, 0x0a, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x22, 0xb6, 0x02, - 0x0a, 0x0f, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0d, 0x62, - 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, - 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, - 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, - 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x12, 0x36, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x65, - 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x73, 0x74, 0x61, - 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x07, 0x65, - 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, - 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x9c, 0x01, 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, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x03, 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, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x5b, 0x0a, 0x0f, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x53, 0x65, 0x74, 0x45, 0x64, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, + 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x61, 0x0a, 0x12, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x04, + 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, + 0x6d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 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, 0x22, 0x84, 0x03, 0x0a, 0x0e, 0x54, 0x65, + 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, + 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, + 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x50, 0x0a, 0x0f, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x0e, 0x71, + 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x6c, 0x61, + 0x79, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x47, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x67, + 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x12, 0x50, + 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, + 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, + 0x22, 0x62, 0x0a, 0x16, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, + 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x22, 0x62, 0x0a, 0x16, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, + 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x84, 0x02, 0x0a, 0x20, 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, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, + 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x48, 0x01, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x02, 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, 0x15, 0x0a, 0x13, 0x5f, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x75, 0x0a, 0x21, 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, 0x12, 0x50, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, + 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x1f, 0x54, 0x65, 0x61, 0x6d, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x05, 0x65, 0x64, + 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 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, 0x6d, 0x0a, 0x18, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, + 0x39, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 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, 0x22, 0x8c, 0x03, 0x0a, 0x14, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 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, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, 0x6e, 0x74, + 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, + 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x50, 0x0a, 0x0f, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x0e, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2c, + 0x0a, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x6c, + 0x61, 0x79, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x67, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x12, + 0x50, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x61, 0x6e, 0x74, + 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x73, 0x22, 0x89, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, + 0xe2, 0x41, 0x01, 0x02, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x00, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x85, 0x01, + 0x0a, 0x0b, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x17, 0x0a, + 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, + 0x0f, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x5b, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x53, 0x65, 0x74, 0x52, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x65, 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, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x05, + 0x6f, 0x72, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, + 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 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, 0x84, 0x02, 0x0a, - 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, - 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x65, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x22, 0x67, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4b, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x73, 0x22, 0xa3, 0x02, 0x0a, - 0x12, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x4c, 0x0a, - 0x23, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x6e, - 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1f, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x1f, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x73, 0x22, 0x69, 0x0a, 0x16, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x04, - 0x6e, 0x6f, 0x64, 0x65, 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, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 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, 0x22, 0x95, 0x01, - 0x0a, 0x1c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, - 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x67, 0x0a, 0x18, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0d, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x65, 0x73, 0x22, 0x72, 0x0a, 0x12, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, + 0x61, 0x6d, 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, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6a, 0x6f, 0x69, 0x6e, + 0x65, 0x64, 0x41, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x69, 0x0a, 0x16, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x45, + 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 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, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 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, 0x22, 0x95, 0x01, 0x0a, 0x1c, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 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, 0x90, 0x01, 0x0a, + 0x1d, 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, 0x12, 0x1e, + 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x40, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, + 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x81, 0x01, 0x0a, 0x1e, 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, 0x12, 0x5f, 0x0a, 0x14, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x65, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x12, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x22, 0xaf, 0x02, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, + 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, + 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x48, 0x02, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, 0x71, 0x88, 0x01, 0x01, 0x12, + 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x03, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x22, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x46, 0x72, 0x6f, 0x6d, + 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x04, 0x48, 0x05, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x6f, + 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, + 0x0a, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, 0x66, 0x65, + 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0xc5, 0x01, 0x0a, 0x1b, 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, 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, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x07, 0x74, 0x6f, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, + 0x73, 0x0a, 0x1c, 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, 0x12, + 0x53, 0x0a, 0x14, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x66, 0x6f, + 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 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, 0xd6, 0x02, 0x0a, 0x1e, 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, 0x12, 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, - 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 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, 0x01, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x65, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x61, 0x67, 0x67, 0x72, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x22, 0x84, - 0x01, 0x0a, 0x1f, 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, 0x12, 0x61, 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, - 0x65, 0x74, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x65, 0x73, 0x22, 0x86, 0x02, 0x0a, 0x1a, 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, 0x12, 0x2b, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, - 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, - 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x02, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 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, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x60, - 0x0a, 0x1b, 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, 0x12, 0x41, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x22, 0x91, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3b, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x73, 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, 0x65, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, - 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x04, - 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 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, 0x22, 0xf2, 0x03, 0x0a, 0x10, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, - 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, 0x59, 0x0a, 0x2a, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x6b, - 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x25, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 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, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x3d, 0x0a, 0x1b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4e, 0x6f, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2d, - 0x0a, 0x12, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x69, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3a, 0x0a, - 0x19, 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, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x17, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x61, 0x73, - 0x5f, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x77, 0x61, 0x73, 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x72, 0x65, 0x72, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x22, 0xd4, 0x02, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x88, - 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, - 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 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, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x28, 0x0a, - 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 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, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x76, 0x61, - 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x4d, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x6d, 0x45, - 0x64, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 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, 0x22, 0x79, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 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, 0xba, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 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, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, - 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, - 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x22, 0xe2, 0x01, 0x0a, 0x1a, 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, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x61, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, + 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x52, 0x11, 0x66, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x22, 0x28, 0x0a, 0x26, 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, 0x22, 0x98, + 0x01, 0x0a, 0x27, 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, 0x12, 0x6d, 0x0a, 0x1f, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x52, 0x1c, 0x63, 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, 0x22, 0xca, 0x01, 0x0a, 0x1d, 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, 0x12, 0x1e, 0x0a, 0x08, 0x61, + 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, + 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 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, 0x02, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, - 0x08, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x61, 0x67, - 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x69, 0x0a, 0x1b, 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, 0x12, 0x4a, - 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x19, 0x54, - 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, - 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 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, 0x61, 0x0a, 0x12, 0x54, - 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x45, 0x64, 0x67, - 0x65, 0x12, 0x33, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 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, 0x22, 0x84, - 0x03, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, - 0x73, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, - 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, - 0x12, 0x50, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x61, 0x6e, - 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x61, 0x6d, 0x65, - 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x6c, 0x61, - 0x79, 0x65, 0x64, 0x12, 0x50, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x51, - 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x62, 0x0a, 0x16, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, 0x6e, 0x74, - 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x62, 0x0a, 0x16, 0x51, 0x75, 0x61, - 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x32, 0x0a, 0x15, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x51, - 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x84, 0x02, - 0x0a, 0x20, 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, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x61, - 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x11, 0x61, 0x67, 0x67, 0x72, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x02, 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, 0x15, - 0x0a, 0x13, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x21, 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, 0x12, 0x50, 0x0a, 0x0a, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x1f, - 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x69, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, - 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x69, - 0x73, 0x74, 0x69, 0x63, 0x73, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x66, 0x0a, 0x1e, 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, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x97, + 0x01, 0x0a, 0x1d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x3e, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x73, 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, 0x6d, 0x0a, 0x18, 0x54, 0x65, 0x61, 0x6d, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, - 0x45, 0x64, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 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, 0x22, 0x8c, 0x03, 0x0a, 0x14, 0x54, 0x65, 0x61, 0x6d, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 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, 0x30, 0x0a, 0x14, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x32, 0x0a, - 0x15, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x12, 0x50, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x51, 0x75, 0x61, - 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x61, 0x6d, - 0x65, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x6c, 0x61, 0x79, 0x65, - 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x70, 0x6c, 0x61, 0x79, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x6c, - 0x61, 0x79, 0x65, 0x64, 0x12, 0x50, 0x0a, 0x0f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x6b, 0x0a, 0x17, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, + 0x64, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 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, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 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, 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, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 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, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x22, 0x8a, 0x02, 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, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, + 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x65, 0x6e, 0x65, + 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, + 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, + 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, + 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x22, 0x93, 0x02, 0x0a, 0x11, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, + 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x34, 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, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x3a, 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, 0x03, 0x20, 0x01, 0x28, 0x09, 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, 0x36, 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, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x12, 0x39, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x7f, 0x0a, 0x20, 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, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 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, 0x12, + 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x77, 0x0a, 0x21, 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, 0x12, 0x52, 0x0a, 0x13, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x12, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x22, 0x88, 0x02, 0x0a, 0x1a, 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, 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, 0x3d, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 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, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 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, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x6d, 0x6d, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x72, 0x6f, + 0x6d, 0x41, 0x6d, 0x6d, 0x4b, 0x65, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x6d, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x4b, 0x0a, 0x1b, 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, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x5a, 0x0a, 0x22, 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, 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, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x49, 0x64, 0x22, 0x4c, 0x0a, 0x23, 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, 0x12, 0x25, 0x0a, 0x0e, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x22, 0x90, 0x03, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x09, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x46, 0x72, 0x6f, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x07, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x54, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0c, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, + 0x70, 0x65, 0x48, 0x03, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 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, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, + 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x4b, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x67, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, + 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x67, 0x61, 0x6d, + 0x65, 0x73, 0x22, 0x7a, 0x0a, 0x0f, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 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, 0x4d, + 0x0a, 0x08, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 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, 0x22, 0x88, 0x02, + 0x0a, 0x04, 0x47, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x22, 0x0a, 0x0c, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, + 0x12, 0x37, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, + 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x49, 0x0a, 0x0a, 0x69, 0x6e, 0x64, + 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x50, 0x65, - 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x22, 0x89, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x0b, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6a, 0x6f, 0x69, - 0x6e, 0x65, 0x64, 0x41, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x5b, 0x0a, 0x0f, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x30, 0x0a, - 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 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, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x54, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x36, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 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, 0x67, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, - 0x0d, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x74, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x22, 0x72, 0x0a, 0x12, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 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, 0x26, 0x0a, 0x0f, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0d, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x69, - 0x0a, 0x16, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x45, 0x64, 0x67, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, - 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, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 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, 0x22, 0x95, 0x01, 0x0a, 0x1c, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x05, 0x65, 0x64, - 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, 0x61, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 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, 0x90, 0x01, 0x0a, 0x1d, 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, 0x12, 0x1e, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x04, 0xe2, 0x41, 0x01, 0x02, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 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, 0x00, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x01, 0x0a, 0x1e, 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, 0x12, 0x5f, 0x0a, 0x14, 0x74, 0x65, 0x61, 0x6d, 0x5f, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x74, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x65, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xcf, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, - 0x71, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, - 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, 0x71, 0x42, 0x0b, 0x0a, - 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x22, 0x50, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x38, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x09, 0x66, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0xc5, 0x01, 0x0a, - 0x1b, 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, 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, 0x1e, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x09, 0x66, - 0x72, 0x6f, 0x6d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x74, - 0x6f, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, - 0x07, 0x74, 0x6f, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x66, 0x72, 0x6f, - 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x6f, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x22, 0x73, 0x0a, 0x1c, 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, 0x12, 0x53, 0x0a, 0x14, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x46, 0x6f, - 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x52, 0x11, 0x66, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x22, 0x28, 0x0a, 0x26, 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, 0x22, 0x98, 0x01, 0x0a, 0x27, 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, 0x12, - 0x6d, 0x0a, 0x1f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x52, 0x1c, 0x63, 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, 0x22, 0xca, - 0x01, 0x0a, 0x1d, 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, - 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x48, 0x00, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, - 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 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, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, - 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x66, 0x0a, 0x1e, 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, 0x12, 0x44, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x1d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 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, 0x6b, 0x0a, - 0x17, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x45, 0x64, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 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, 0x22, 0x9b, 0x01, 0x0a, 0x13, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x73, 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, 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, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x8a, 0x02, 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, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0d, - 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x65, - 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x6e, - 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x6e, - 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x65, 0x6e, 0x64, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x93, 0x02, 0x0a, 0x11, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x34, 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, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x12, 0x3a, 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, 0x03, 0x20, 0x01, 0x28, 0x09, 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, 0x36, 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, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, - 0x12, 0x39, 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, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x16, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x61, 0x6b, 0x65, 0x72, 0x46, - 0x65, 0x65, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x22, 0x7f, 0x0a, 0x20, 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, 0x12, - 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 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, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, - 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x77, 0x0a, 0x21, - 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, 0x12, 0x52, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 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, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xd0, 0x01, 0x0a, 0x1a, 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, 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, 0x3d, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 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, 0x1d, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 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, 0x19, 0x0a, - 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0x4b, 0x0a, 0x1b, 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, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x5a, 0x0a, 0x22, 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, 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, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, - 0x64, 0x22, 0x4c, 0x0a, 0x23, 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, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x90, 0x03, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x46, - 0x72, 0x6f, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, - 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x54, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x48, - 0x03, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x88, 0x01, + 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, + 0x64, 0x75, 0x61, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x42, 0x0a, 0x0a, 0x08, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x47, 0x0a, 0x10, 0x54, 0x65, 0x61, 0x6d, + 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x04, + 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, + 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, 0x74, 0x65, 0x61, + 0x6d, 0x22, 0x5f, 0x0a, 0x16, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, + 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x69, + 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, + 0x61, 0x6c, 0x22, 0xff, 0x02, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x74, 0x65, 0x61, + 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x39, 0x0a, + 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x30, 0x0a, + 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x65, + 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, + 0x32, 0x0a, 0x15, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, + 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x51, 0x75, 0x61, 0x6e, + 0x74, 0x75, 0x6d, 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x51, 0x75, 0x61, + 0x6e, 0x74, 0x75, 0x6d, 0x22, 0x8c, 0x01, 0x0a, 0x15, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, + 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, + 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x14, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, + 0x69, 0x6e, 0x67, 0x22, 0xe9, 0x02, 0x0a, 0x14, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, + 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, + 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, + 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x65, 0x61, + 0x72, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x61, 0x6e, + 0x74, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x12, 0x3f, + 0x0a, 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, + 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x22, + 0xcb, 0x01, 0x0a, 0x1b, 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, 0x12, + 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, 0x04, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x69, 0x64, 0x22, 0x4b, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x67, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x22, - 0x7a, 0x0a, 0x0f, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x64, 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, + 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x79, 0x0a, + 0x1c, 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, 0x12, 0x59, 0x0a, + 0x12, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x1a, 0x50, 0x61, 0x72, + 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 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, 0x4d, 0x0a, 0x08, 0x47, - 0x61, 0x6d, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x61, 0x6d, 0x65, 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, 0x22, 0x88, 0x02, 0x0a, 0x04, 0x47, - 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x37, 0x0a, - 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x61, - 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, - 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x48, 0x00, - 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x49, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, - 0x64, 0x75, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x64, - 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, - 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x47, 0x0a, 0x10, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x04, 0x74, 0x65, 0x61, - 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, - 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x5f, - 0x0a, 0x16, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x69, - 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, - 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x22, - 0xff, 0x02, 0x0a, 0x0e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x32, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x12, 0x12, - 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, - 0x6e, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, - 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x61, 0x72, 0x6e, - 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, - 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, - 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, - 0x6d, 0x22, 0x8c, 0x01, 0x0a, 0x15, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x15, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, - 0x47, 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x14, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6e, 0x67, - 0x22, 0xe9, 0x02, 0x0a, 0x14, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x47, - 0x61, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x64, - 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, - 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, - 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x16, 0x0a, - 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, - 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x45, - 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x45, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x5f, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x45, 0x61, - 0x72, 0x6e, 0x65, 0x64, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x12, 0x3f, 0x0a, 0x1c, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x61, 0x72, - 0x6e, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x19, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x45, - 0x61, 0x72, 0x6e, 0x65, 0x64, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x22, 0xcb, 0x01, 0x0a, - 0x1b, 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, 0x12, 0x20, 0x0a, 0x09, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1e, - 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x01, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x40, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 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, - 0x02, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, - 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x79, 0x0a, 0x1c, 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, 0x12, 0x59, 0x0a, 0x12, 0x70, 0x61, - 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x1a, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x4d, 0x6f, 0x64, 0x65, 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, 0x63, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, - 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, - 0x34, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x63, 0x0a, 0x13, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x45, 0x64, + 0x67, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x32, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, + 0x64, 0x65, 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, + 0x22, 0x99, 0x03, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x4d, 0x6f, 0x64, 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, 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, 0x12, 0x31, 0x0a, 0x0b, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, + 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x28, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x1d, 0x6d, 0x69, 0x6e, + 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x1a, 0x6d, 0x69, 0x6e, 0x54, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, + 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x54, 0x68, 0x65, 0x6f, 0x72, 0x65, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x4c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x20, 0x0a, + 0x1e, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, + 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, + 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0xf2, 0x01, 0x0a, + 0x1c, 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, 0x19, 0x0a, + 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 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, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x45, 0x0a, 0x1f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x77, 0x65, 0x69, 0x67, 0x68, 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, 0x12, 0x21, + 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x22, 0xa4, 0x01, 0x0a, 0x26, 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, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 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, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x61, + 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, + 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x9f, 0x01, 0x0a, 0x27, 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, 0x12, 0x74, 0x0a, 0x1f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 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, 0x22, 0x99, 0x03, - 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, - 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, 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, 0x12, 0x31, 0x0a, 0x0b, 0x6d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, - 0x52, 0x0a, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x0d, - 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x1d, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x68, - 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, - 0x1a, 0x6d, 0x69, 0x6e, 0x54, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x4d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3d, - 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, - 0x6c, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x02, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x54, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, - 0x61, 0x6c, 0x4c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, - 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x6d, - 0x69, 0x6e, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x1b, 0x0a, 0x19, - 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0xf2, 0x01, 0x0a, 0x1c, 0x54, 0x69, + 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, 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, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x49, 0x64, 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, - 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x12, 0x45, 0x0a, 0x1f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, - 0x67, 0x68, 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, 0x12, 0x21, 0x0a, 0x0c, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0xa4, - 0x01, 0x0a, 0x26, 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, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x49, 0x64, 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, 0x12, - 0x17, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x07, 0x61, 0x74, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x74, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x9f, 0x01, 0x0a, 0x27, 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, 0x12, 0x74, 0x0a, 0x1f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x64, 0x61, 0x74, - 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 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, 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, + 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd7, 0x02, 0x0a, 0x0f, 0x4c, + 0x69, 0x73, 0x74, 0x41, 0x4d, 0x4d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x13, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 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, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0c, 0x61, 0x6d, 0x6d, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0a, 0x61, + 0x6d, 0x6d, 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x37, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, + 0x4d, 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, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 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, 0x0f, 0x0a, 0x0d, 0x5f, 0x61, 0x6d, + 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 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, 0x46, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x4d, 0x4d, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x61, 0x6d, 0x6d, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x4d, 0x4d, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x61, 0x6d, 0x6d, 0x73, 0x22, 0x77, 0x0a, 0x0d, + 0x41, 0x4d, 0x4d, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, + 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, + 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x41, + 0x4d, 0x4d, 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, 0x4a, 0x0a, 0x07, 0x41, 0x4d, 0x4d, 0x45, 0x64, 0x67, 0x65, + 0x12, 0x27, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x4d, 0x4d, 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, 0x22, 0x9f, 0x03, 0x0a, 0x18, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x41, 0x4d, + 0x4d, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x73, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, + 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, + 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x6c, 0x65, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x14, 0x6c, 0x65, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x41, 0x74, 0x55, 0x70, 0x70, 0x65, 0x72, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x14, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x41, 0x74, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x65, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x19, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, + 0x41, 0x4d, 0x4d, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x33, 0x0a, 0x16, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x41, + 0x74, 0x55, 0x70, 0x70, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x16, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x69, 0x7a, 0x65, 0x41, 0x74, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x1b, 0x6c, + 0x6f, 0x73, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x17, 0x6c, 0x6f, 0x73, 0x73, 0x4f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x41, 0x74, 0x55, 0x70, 0x70, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x1b, 0x6c, 0x6f, 0x73, + 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, + 0x6c, 0x6f, 0x73, 0x73, 0x4f, 0x6e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x74, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x1a, 0x6c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x74, 0x5f, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x41, 0x74, 0x55, + 0x70, 0x70, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x1a, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, + 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x41, 0x74, 0x4c, 0x6f, 0x77, 0x65, + 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, 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, + 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, 0x9e, 0x7b, 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, - 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, + 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, 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, + 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, - 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, + 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, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 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, 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, - 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, 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, 0x79, 0x0a, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, 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, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, + 0x6d, 0x53, 0x63, 0x6f, 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, 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, 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, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, + 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, + 0x0a, 0x05, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x7c, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x47, + 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 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, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, + 0x6f, 0x72, 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, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0a, 0x92, 0x41, 0x07, 0x0a, 0x05, + 0x47, 0x61, 0x6d, 0x65, 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, 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, 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, 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, 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, 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, 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, + 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, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, 0x6f, 0x64, + 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, 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, - 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, - 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, + 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, 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, - 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, + 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, 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, 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, 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, + 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, 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, + 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, 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, + 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, - 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, - 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, 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, - 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, + 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, 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, 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, + 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, 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, 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, - 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, + 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, 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, 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, + 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, 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, - 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, + 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, - 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, + 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, 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, 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, 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, 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, + 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, 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, + 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, 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, - 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, + 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, 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, 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, + 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, - 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, + 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, 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, + 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, 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, + 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, 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, 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, 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, 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, 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, + 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, 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, - 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, + 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, 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, 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, + 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, 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, + 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, 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, + 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, - 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, + 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, 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, 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, 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, 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, + 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, 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, 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, - 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, 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, + 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, 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, + 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, 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, 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, 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, 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, + 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, 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, + 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, 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, 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, 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, + 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, 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, + 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, 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, + 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, 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, + 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, 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, + 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, 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, 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, + 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, 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, 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, + 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, 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, + 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, 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, 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, - 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, + 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, 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, 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, + 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, 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, - 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, + 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, 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, + 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, 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, + 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, 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, + 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, 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, 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, 0xc6, 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, 0x8f, 0x01, 0x12, 0x1e, 0x0a, 0x13, 0x56, 0x65, 0x67, 0x61, 0x20, - 0x64, 0x61, 0x74, 0x61, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x32, 0x07, - 0x76, 0x30, 0x2e, 0x37, 0x36, 0x2e, 0x31, 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, + 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, 0x5a, 0x0a, 0x08, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x4d, 0x4d, 0x73, 0x12, 0x20, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x4d, 0x4d, 0x73, 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, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x4d, 0x4d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, 0x92, + 0x41, 0x06, 0x0a, 0x04, 0x41, 0x4d, 0x4d, 0x73, 0x12, 0x75, 0x0a, 0x11, 0x45, 0x73, 0x74, 0x69, + 0x6d, 0x61, 0x74, 0x65, 0x41, 0x4d, 0x4d, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 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, 0x41, 0x4d, 0x4d, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 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, 0x45, 0x73, 0x74, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x41, 0x4d, 0x4d, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x09, 0x92, 0x41, 0x06, 0x0a, 0x04, 0x41, 0x4d, 0x4d, 0x73, 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, 0xc6, 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, 0x8f, 0x01, 0x12, 0x1e, 0x0a, + 0x13, 0x56, 0x65, 0x67, 0x61, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x20, + 0x41, 0x50, 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x37, 0x2e, 0x30, 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 ( @@ -30561,7 +32033,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, 429) 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 @@ -30599,1169 +32071,1215 @@ var file_data_node_api_v2_trading_data_proto_goTypes = []interface{}{ (*OrderUpdates)(nil), // 33: datanode.api.v2.OrderUpdates (*GetStopOrderRequest)(nil), // 34: datanode.api.v2.GetStopOrderRequest (*GetStopOrderResponse)(nil), // 35: datanode.api.v2.GetStopOrderResponse - (*ListStopOrdersRequest)(nil), // 36: datanode.api.v2.ListStopOrdersRequest - (*StopOrderFilter)(nil), // 37: datanode.api.v2.StopOrderFilter - (*StopOrderEdge)(nil), // 38: datanode.api.v2.StopOrderEdge - (*StopOrderConnection)(nil), // 39: datanode.api.v2.StopOrderConnection - (*ListStopOrdersResponse)(nil), // 40: datanode.api.v2.ListStopOrdersResponse - (*ListPositionsRequest)(nil), // 41: datanode.api.v2.ListPositionsRequest - (*ListPositionsResponse)(nil), // 42: datanode.api.v2.ListPositionsResponse - (*PositionsFilter)(nil), // 43: datanode.api.v2.PositionsFilter - (*ListAllPositionsRequest)(nil), // 44: datanode.api.v2.ListAllPositionsRequest - (*ListAllPositionsResponse)(nil), // 45: datanode.api.v2.ListAllPositionsResponse - (*PositionEdge)(nil), // 46: datanode.api.v2.PositionEdge - (*PositionConnection)(nil), // 47: datanode.api.v2.PositionConnection - (*ObservePositionsRequest)(nil), // 48: datanode.api.v2.ObservePositionsRequest - (*ObservePositionsResponse)(nil), // 49: datanode.api.v2.ObservePositionsResponse - (*PositionSnapshotPage)(nil), // 50: datanode.api.v2.PositionSnapshotPage - (*PositionUpdates)(nil), // 51: datanode.api.v2.PositionUpdates - (*LedgerEntryFilter)(nil), // 52: datanode.api.v2.LedgerEntryFilter - (*AggregatedLedgerEntry)(nil), // 53: datanode.api.v2.AggregatedLedgerEntry - (*ListLedgerEntriesRequest)(nil), // 54: datanode.api.v2.ListLedgerEntriesRequest - (*ExportLedgerEntriesRequest)(nil), // 55: datanode.api.v2.ExportLedgerEntriesRequest - (*ListLedgerEntriesResponse)(nil), // 56: datanode.api.v2.ListLedgerEntriesResponse - (*AggregatedLedgerEntriesEdge)(nil), // 57: datanode.api.v2.AggregatedLedgerEntriesEdge - (*AggregatedLedgerEntriesConnection)(nil), // 58: datanode.api.v2.AggregatedLedgerEntriesConnection - (*ListBalanceChangesRequest)(nil), // 59: datanode.api.v2.ListBalanceChangesRequest - (*ListBalanceChangesResponse)(nil), // 60: datanode.api.v2.ListBalanceChangesResponse - (*GetBalanceHistoryRequest)(nil), // 61: datanode.api.v2.GetBalanceHistoryRequest - (*GetBalanceHistoryResponse)(nil), // 62: datanode.api.v2.GetBalanceHistoryResponse - (*AggregatedBalanceEdge)(nil), // 63: datanode.api.v2.AggregatedBalanceEdge - (*AggregatedBalanceConnection)(nil), // 64: datanode.api.v2.AggregatedBalanceConnection - (*AccountFilter)(nil), // 65: datanode.api.v2.AccountFilter - (*AggregatedBalance)(nil), // 66: datanode.api.v2.AggregatedBalance - (*ObserveMarketsDepthRequest)(nil), // 67: datanode.api.v2.ObserveMarketsDepthRequest - (*ObserveMarketsDepthResponse)(nil), // 68: datanode.api.v2.ObserveMarketsDepthResponse - (*ObserveMarketsDepthUpdatesRequest)(nil), // 69: datanode.api.v2.ObserveMarketsDepthUpdatesRequest - (*ObserveMarketsDepthUpdatesResponse)(nil), // 70: datanode.api.v2.ObserveMarketsDepthUpdatesResponse - (*ObserveMarketsDataRequest)(nil), // 71: datanode.api.v2.ObserveMarketsDataRequest - (*ObserveMarketsDataResponse)(nil), // 72: datanode.api.v2.ObserveMarketsDataResponse - (*GetLatestMarketDepthRequest)(nil), // 73: datanode.api.v2.GetLatestMarketDepthRequest - (*GetLatestMarketDepthResponse)(nil), // 74: datanode.api.v2.GetLatestMarketDepthResponse - (*ListLatestMarketDataRequest)(nil), // 75: datanode.api.v2.ListLatestMarketDataRequest - (*ListLatestMarketDataResponse)(nil), // 76: datanode.api.v2.ListLatestMarketDataResponse - (*GetLatestMarketDataRequest)(nil), // 77: datanode.api.v2.GetLatestMarketDataRequest - (*GetLatestMarketDataResponse)(nil), // 78: datanode.api.v2.GetLatestMarketDataResponse - (*GetMarketDataHistoryByIDRequest)(nil), // 79: datanode.api.v2.GetMarketDataHistoryByIDRequest - (*GetMarketDataHistoryByIDResponse)(nil), // 80: datanode.api.v2.GetMarketDataHistoryByIDResponse - (*MarketDataEdge)(nil), // 81: datanode.api.v2.MarketDataEdge - (*MarketDataConnection)(nil), // 82: datanode.api.v2.MarketDataConnection - (*ListTransfersRequest)(nil), // 83: datanode.api.v2.ListTransfersRequest - (*ListTransfersResponse)(nil), // 84: datanode.api.v2.ListTransfersResponse - (*TransferNode)(nil), // 85: datanode.api.v2.TransferNode - (*TransferEdge)(nil), // 86: datanode.api.v2.TransferEdge - (*TransferConnection)(nil), // 87: datanode.api.v2.TransferConnection - (*GetTransferRequest)(nil), // 88: datanode.api.v2.GetTransferRequest - (*GetTransferResponse)(nil), // 89: datanode.api.v2.GetTransferResponse - (*GetNetworkLimitsRequest)(nil), // 90: datanode.api.v2.GetNetworkLimitsRequest - (*GetNetworkLimitsResponse)(nil), // 91: datanode.api.v2.GetNetworkLimitsResponse - (*ListCandleIntervalsRequest)(nil), // 92: datanode.api.v2.ListCandleIntervalsRequest - (*IntervalToCandleId)(nil), // 93: datanode.api.v2.IntervalToCandleId - (*ListCandleIntervalsResponse)(nil), // 94: datanode.api.v2.ListCandleIntervalsResponse - (*Candle)(nil), // 95: datanode.api.v2.Candle - (*ObserveCandleDataRequest)(nil), // 96: datanode.api.v2.ObserveCandleDataRequest - (*ObserveCandleDataResponse)(nil), // 97: datanode.api.v2.ObserveCandleDataResponse - (*ListCandleDataRequest)(nil), // 98: datanode.api.v2.ListCandleDataRequest - (*ListCandleDataResponse)(nil), // 99: datanode.api.v2.ListCandleDataResponse - (*CandleEdge)(nil), // 100: datanode.api.v2.CandleEdge - (*CandleDataConnection)(nil), // 101: datanode.api.v2.CandleDataConnection - (*ListVotesRequest)(nil), // 102: datanode.api.v2.ListVotesRequest - (*ListVotesResponse)(nil), // 103: datanode.api.v2.ListVotesResponse - (*VoteEdge)(nil), // 104: datanode.api.v2.VoteEdge - (*VoteConnection)(nil), // 105: datanode.api.v2.VoteConnection - (*ObserveVotesRequest)(nil), // 106: datanode.api.v2.ObserveVotesRequest - (*ObserveVotesResponse)(nil), // 107: datanode.api.v2.ObserveVotesResponse - (*ListERC20MultiSigSignerAddedBundlesRequest)(nil), // 108: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest - (*ListERC20MultiSigSignerAddedBundlesResponse)(nil), // 109: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse - (*ERC20MultiSigSignerAddedEdge)(nil), // 110: datanode.api.v2.ERC20MultiSigSignerAddedEdge - (*ERC20MultiSigSignerAddedBundleEdge)(nil), // 111: datanode.api.v2.ERC20MultiSigSignerAddedBundleEdge - (*ERC20MultiSigSignerAddedConnection)(nil), // 112: datanode.api.v2.ERC20MultiSigSignerAddedConnection - (*ERC20MultiSigSignerAddedBundle)(nil), // 113: datanode.api.v2.ERC20MultiSigSignerAddedBundle - (*ListERC20MultiSigSignerRemovedBundlesRequest)(nil), // 114: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest - (*ListERC20MultiSigSignerRemovedBundlesResponse)(nil), // 115: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse - (*ERC20MultiSigSignerRemovedEdge)(nil), // 116: datanode.api.v2.ERC20MultiSigSignerRemovedEdge - (*ERC20MultiSigSignerRemovedBundleEdge)(nil), // 117: datanode.api.v2.ERC20MultiSigSignerRemovedBundleEdge - (*ERC20MultiSigSignerRemovedConnection)(nil), // 118: datanode.api.v2.ERC20MultiSigSignerRemovedConnection - (*ERC20MultiSigSignerRemovedBundle)(nil), // 119: datanode.api.v2.ERC20MultiSigSignerRemovedBundle - (*GetERC20ListAssetBundleRequest)(nil), // 120: datanode.api.v2.GetERC20ListAssetBundleRequest - (*GetERC20ListAssetBundleResponse)(nil), // 121: datanode.api.v2.GetERC20ListAssetBundleResponse - (*GetERC20SetAssetLimitsBundleRequest)(nil), // 122: datanode.api.v2.GetERC20SetAssetLimitsBundleRequest - (*GetERC20SetAssetLimitsBundleResponse)(nil), // 123: datanode.api.v2.GetERC20SetAssetLimitsBundleResponse - (*GetERC20WithdrawalApprovalRequest)(nil), // 124: datanode.api.v2.GetERC20WithdrawalApprovalRequest - (*GetERC20WithdrawalApprovalResponse)(nil), // 125: datanode.api.v2.GetERC20WithdrawalApprovalResponse - (*GetLastTradeRequest)(nil), // 126: datanode.api.v2.GetLastTradeRequest - (*GetLastTradeResponse)(nil), // 127: datanode.api.v2.GetLastTradeResponse - (*ListTradesRequest)(nil), // 128: datanode.api.v2.ListTradesRequest - (*ListTradesResponse)(nil), // 129: datanode.api.v2.ListTradesResponse - (*TradeConnection)(nil), // 130: datanode.api.v2.TradeConnection - (*TradeEdge)(nil), // 131: datanode.api.v2.TradeEdge - (*ObserveTradesRequest)(nil), // 132: datanode.api.v2.ObserveTradesRequest - (*ObserveTradesResponse)(nil), // 133: datanode.api.v2.ObserveTradesResponse - (*GetOracleSpecRequest)(nil), // 134: datanode.api.v2.GetOracleSpecRequest - (*GetOracleSpecResponse)(nil), // 135: datanode.api.v2.GetOracleSpecResponse - (*ListOracleSpecsRequest)(nil), // 136: datanode.api.v2.ListOracleSpecsRequest - (*ListOracleSpecsResponse)(nil), // 137: datanode.api.v2.ListOracleSpecsResponse - (*ListOracleDataRequest)(nil), // 138: datanode.api.v2.ListOracleDataRequest - (*ListOracleDataResponse)(nil), // 139: datanode.api.v2.ListOracleDataResponse - (*OracleSpecEdge)(nil), // 140: datanode.api.v2.OracleSpecEdge - (*OracleSpecsConnection)(nil), // 141: datanode.api.v2.OracleSpecsConnection - (*OracleDataEdge)(nil), // 142: datanode.api.v2.OracleDataEdge - (*OracleDataConnection)(nil), // 143: datanode.api.v2.OracleDataConnection - (*GetMarketRequest)(nil), // 144: datanode.api.v2.GetMarketRequest - (*GetMarketResponse)(nil), // 145: datanode.api.v2.GetMarketResponse - (*ListMarketsRequest)(nil), // 146: datanode.api.v2.ListMarketsRequest - (*ListMarketsResponse)(nil), // 147: datanode.api.v2.ListMarketsResponse - (*MarketEdge)(nil), // 148: datanode.api.v2.MarketEdge - (*MarketConnection)(nil), // 149: datanode.api.v2.MarketConnection - (*ListSuccessorMarketsRequest)(nil), // 150: datanode.api.v2.ListSuccessorMarketsRequest - (*SuccessorMarket)(nil), // 151: datanode.api.v2.SuccessorMarket - (*SuccessorMarketEdge)(nil), // 152: datanode.api.v2.SuccessorMarketEdge - (*SuccessorMarketConnection)(nil), // 153: datanode.api.v2.SuccessorMarketConnection - (*ListSuccessorMarketsResponse)(nil), // 154: datanode.api.v2.ListSuccessorMarketsResponse - (*GetPartyRequest)(nil), // 155: datanode.api.v2.GetPartyRequest - (*GetPartyResponse)(nil), // 156: datanode.api.v2.GetPartyResponse - (*ListPartiesRequest)(nil), // 157: datanode.api.v2.ListPartiesRequest - (*ListPartiesResponse)(nil), // 158: datanode.api.v2.ListPartiesResponse - (*PartyEdge)(nil), // 159: datanode.api.v2.PartyEdge - (*PartyConnection)(nil), // 160: datanode.api.v2.PartyConnection - (*ListPartiesProfilesRequest)(nil), // 161: datanode.api.v2.ListPartiesProfilesRequest - (*ListPartiesProfilesResponse)(nil), // 162: datanode.api.v2.ListPartiesProfilesResponse - (*PartyProfileEdge)(nil), // 163: datanode.api.v2.PartyProfileEdge - (*PartiesProfilesConnection)(nil), // 164: datanode.api.v2.PartiesProfilesConnection - (*OrderEdge)(nil), // 165: datanode.api.v2.OrderEdge - (*ListMarginLevelsRequest)(nil), // 166: datanode.api.v2.ListMarginLevelsRequest - (*ListMarginLevelsResponse)(nil), // 167: datanode.api.v2.ListMarginLevelsResponse - (*ObserveMarginLevelsRequest)(nil), // 168: datanode.api.v2.ObserveMarginLevelsRequest - (*ObserveMarginLevelsResponse)(nil), // 169: datanode.api.v2.ObserveMarginLevelsResponse - (*OrderConnection)(nil), // 170: datanode.api.v2.OrderConnection - (*MarginEdge)(nil), // 171: datanode.api.v2.MarginEdge - (*MarginConnection)(nil), // 172: datanode.api.v2.MarginConnection - (*ListRewardsRequest)(nil), // 173: datanode.api.v2.ListRewardsRequest - (*ListRewardsResponse)(nil), // 174: datanode.api.v2.ListRewardsResponse - (*RewardEdge)(nil), // 175: datanode.api.v2.RewardEdge - (*RewardsConnection)(nil), // 176: datanode.api.v2.RewardsConnection - (*ListRewardSummariesRequest)(nil), // 177: datanode.api.v2.ListRewardSummariesRequest - (*ListRewardSummariesResponse)(nil), // 178: datanode.api.v2.ListRewardSummariesResponse - (*RewardSummaryFilter)(nil), // 179: datanode.api.v2.RewardSummaryFilter - (*ListEpochRewardSummariesRequest)(nil), // 180: datanode.api.v2.ListEpochRewardSummariesRequest - (*ListEpochRewardSummariesResponse)(nil), // 181: datanode.api.v2.ListEpochRewardSummariesResponse - (*EpochRewardSummaryConnection)(nil), // 182: datanode.api.v2.EpochRewardSummaryConnection - (*EpochRewardSummaryEdge)(nil), // 183: datanode.api.v2.EpochRewardSummaryEdge - (*ObserveRewardsRequest)(nil), // 184: datanode.api.v2.ObserveRewardsRequest - (*ObserveRewardsResponse)(nil), // 185: datanode.api.v2.ObserveRewardsResponse - (*GetDepositRequest)(nil), // 186: datanode.api.v2.GetDepositRequest - (*GetDepositResponse)(nil), // 187: datanode.api.v2.GetDepositResponse - (*ListDepositsRequest)(nil), // 188: datanode.api.v2.ListDepositsRequest - (*ListDepositsResponse)(nil), // 189: datanode.api.v2.ListDepositsResponse - (*DepositEdge)(nil), // 190: datanode.api.v2.DepositEdge - (*DepositsConnection)(nil), // 191: datanode.api.v2.DepositsConnection - (*GetWithdrawalRequest)(nil), // 192: datanode.api.v2.GetWithdrawalRequest - (*GetWithdrawalResponse)(nil), // 193: datanode.api.v2.GetWithdrawalResponse - (*ListWithdrawalsRequest)(nil), // 194: datanode.api.v2.ListWithdrawalsRequest - (*ListWithdrawalsResponse)(nil), // 195: datanode.api.v2.ListWithdrawalsResponse - (*WithdrawalEdge)(nil), // 196: datanode.api.v2.WithdrawalEdge - (*WithdrawalsConnection)(nil), // 197: datanode.api.v2.WithdrawalsConnection - (*GetAssetRequest)(nil), // 198: datanode.api.v2.GetAssetRequest - (*GetAssetResponse)(nil), // 199: datanode.api.v2.GetAssetResponse - (*ListAssetsRequest)(nil), // 200: datanode.api.v2.ListAssetsRequest - (*ListAssetsResponse)(nil), // 201: datanode.api.v2.ListAssetsResponse - (*AssetEdge)(nil), // 202: datanode.api.v2.AssetEdge - (*AssetsConnection)(nil), // 203: datanode.api.v2.AssetsConnection - (*ListLiquidityProvisionsRequest)(nil), // 204: datanode.api.v2.ListLiquidityProvisionsRequest - (*ListAllLiquidityProvisionsRequest)(nil), // 205: datanode.api.v2.ListAllLiquidityProvisionsRequest - (*ListLiquidityProvisionsResponse)(nil), // 206: datanode.api.v2.ListLiquidityProvisionsResponse - (*ListAllLiquidityProvisionsResponse)(nil), // 207: datanode.api.v2.ListAllLiquidityProvisionsResponse - (*LiquidityProvision)(nil), // 208: datanode.api.v2.LiquidityProvision - (*LiquidityProvisionsEdge)(nil), // 209: datanode.api.v2.LiquidityProvisionsEdge - (*LiquidityProvisionWithPendingEdge)(nil), // 210: datanode.api.v2.LiquidityProvisionWithPendingEdge - (*LiquidityProvisionsConnection)(nil), // 211: datanode.api.v2.LiquidityProvisionsConnection - (*LiquidityProvisionsWithPendingConnection)(nil), // 212: datanode.api.v2.LiquidityProvisionsWithPendingConnection - (*ObserveLiquidityProvisionsRequest)(nil), // 213: datanode.api.v2.ObserveLiquidityProvisionsRequest - (*ObserveLiquidityProvisionsResponse)(nil), // 214: datanode.api.v2.ObserveLiquidityProvisionsResponse - (*ListLiquidityProvidersRequest)(nil), // 215: datanode.api.v2.ListLiquidityProvidersRequest - (*LiquidityProvider)(nil), // 216: datanode.api.v2.LiquidityProvider - (*LiquidityProviderEdge)(nil), // 217: datanode.api.v2.LiquidityProviderEdge - (*LiquidityProviderConnection)(nil), // 218: datanode.api.v2.LiquidityProviderConnection - (*ListLiquidityProvidersResponse)(nil), // 219: datanode.api.v2.ListLiquidityProvidersResponse - (*ListPaidLiquidityFeesRequest)(nil), // 220: datanode.api.v2.ListPaidLiquidityFeesRequest - (*ListPaidLiquidityFeesResponse)(nil), // 221: datanode.api.v2.ListPaidLiquidityFeesResponse - (*PaidLiquidityFeesEdge)(nil), // 222: datanode.api.v2.PaidLiquidityFeesEdge - (*PaidLiquidityFeesConnection)(nil), // 223: datanode.api.v2.PaidLiquidityFeesConnection - (*GetGovernanceDataRequest)(nil), // 224: datanode.api.v2.GetGovernanceDataRequest - (*GetGovernanceDataResponse)(nil), // 225: datanode.api.v2.GetGovernanceDataResponse - (*ListGovernanceDataRequest)(nil), // 226: datanode.api.v2.ListGovernanceDataRequest - (*ListGovernanceDataResponse)(nil), // 227: datanode.api.v2.ListGovernanceDataResponse - (*GovernanceDataEdge)(nil), // 228: datanode.api.v2.GovernanceDataEdge - (*GovernanceDataConnection)(nil), // 229: datanode.api.v2.GovernanceDataConnection - (*ObserveGovernanceRequest)(nil), // 230: datanode.api.v2.ObserveGovernanceRequest - (*ObserveGovernanceResponse)(nil), // 231: datanode.api.v2.ObserveGovernanceResponse - (*ListDelegationsRequest)(nil), // 232: datanode.api.v2.ListDelegationsRequest - (*ListDelegationsResponse)(nil), // 233: datanode.api.v2.ListDelegationsResponse - (*DelegationEdge)(nil), // 234: datanode.api.v2.DelegationEdge - (*DelegationsConnection)(nil), // 235: datanode.api.v2.DelegationsConnection - (*ObserveDelegationsRequest)(nil), // 236: datanode.api.v2.ObserveDelegationsRequest - (*ObserveDelegationsResponse)(nil), // 237: datanode.api.v2.ObserveDelegationsResponse - (*NodeBasic)(nil), // 238: datanode.api.v2.NodeBasic - (*GetNetworkDataRequest)(nil), // 239: datanode.api.v2.GetNetworkDataRequest - (*GetNetworkDataResponse)(nil), // 240: datanode.api.v2.GetNetworkDataResponse - (*GetNodeRequest)(nil), // 241: datanode.api.v2.GetNodeRequest - (*GetNodeResponse)(nil), // 242: datanode.api.v2.GetNodeResponse - (*ListNodesRequest)(nil), // 243: datanode.api.v2.ListNodesRequest - (*ListNodesResponse)(nil), // 244: datanode.api.v2.ListNodesResponse - (*NodeEdge)(nil), // 245: datanode.api.v2.NodeEdge - (*NodesConnection)(nil), // 246: datanode.api.v2.NodesConnection - (*ListNodeSignaturesRequest)(nil), // 247: datanode.api.v2.ListNodeSignaturesRequest - (*ListNodeSignaturesResponse)(nil), // 248: datanode.api.v2.ListNodeSignaturesResponse - (*NodeSignatureEdge)(nil), // 249: datanode.api.v2.NodeSignatureEdge - (*NodeSignaturesConnection)(nil), // 250: datanode.api.v2.NodeSignaturesConnection - (*GetEpochRequest)(nil), // 251: datanode.api.v2.GetEpochRequest - (*GetEpochResponse)(nil), // 252: datanode.api.v2.GetEpochResponse - (*EstimateFeeRequest)(nil), // 253: datanode.api.v2.EstimateFeeRequest - (*EstimateFeeResponse)(nil), // 254: datanode.api.v2.EstimateFeeResponse - (*EstimateMarginRequest)(nil), // 255: datanode.api.v2.EstimateMarginRequest - (*EstimateMarginResponse)(nil), // 256: datanode.api.v2.EstimateMarginResponse - (*ListNetworkParametersRequest)(nil), // 257: datanode.api.v2.ListNetworkParametersRequest - (*ListNetworkParametersResponse)(nil), // 258: datanode.api.v2.ListNetworkParametersResponse - (*GetNetworkParameterRequest)(nil), // 259: datanode.api.v2.GetNetworkParameterRequest - (*GetNetworkParameterResponse)(nil), // 260: datanode.api.v2.GetNetworkParameterResponse - (*NetworkParameterEdge)(nil), // 261: datanode.api.v2.NetworkParameterEdge - (*NetworkParameterConnection)(nil), // 262: datanode.api.v2.NetworkParameterConnection - (*Checkpoint)(nil), // 263: datanode.api.v2.Checkpoint - (*ListCheckpointsRequest)(nil), // 264: datanode.api.v2.ListCheckpointsRequest - (*ListCheckpointsResponse)(nil), // 265: datanode.api.v2.ListCheckpointsResponse - (*CheckpointEdge)(nil), // 266: datanode.api.v2.CheckpointEdge - (*CheckpointsConnection)(nil), // 267: datanode.api.v2.CheckpointsConnection - (*GetStakeRequest)(nil), // 268: datanode.api.v2.GetStakeRequest - (*GetStakeResponse)(nil), // 269: datanode.api.v2.GetStakeResponse - (*StakeLinkingEdge)(nil), // 270: datanode.api.v2.StakeLinkingEdge - (*StakesConnection)(nil), // 271: datanode.api.v2.StakesConnection - (*GetRiskFactorsRequest)(nil), // 272: datanode.api.v2.GetRiskFactorsRequest - (*GetRiskFactorsResponse)(nil), // 273: datanode.api.v2.GetRiskFactorsResponse - (*ObserveEventBusRequest)(nil), // 274: datanode.api.v2.ObserveEventBusRequest - (*ObserveEventBusResponse)(nil), // 275: datanode.api.v2.ObserveEventBusResponse - (*ObserveLedgerMovementsRequest)(nil), // 276: datanode.api.v2.ObserveLedgerMovementsRequest - (*ObserveLedgerMovementsResponse)(nil), // 277: datanode.api.v2.ObserveLedgerMovementsResponse - (*ListKeyRotationsRequest)(nil), // 278: datanode.api.v2.ListKeyRotationsRequest - (*ListKeyRotationsResponse)(nil), // 279: datanode.api.v2.ListKeyRotationsResponse - (*KeyRotationEdge)(nil), // 280: datanode.api.v2.KeyRotationEdge - (*KeyRotationConnection)(nil), // 281: datanode.api.v2.KeyRotationConnection - (*ListEthereumKeyRotationsRequest)(nil), // 282: datanode.api.v2.ListEthereumKeyRotationsRequest - (*ListEthereumKeyRotationsResponse)(nil), // 283: datanode.api.v2.ListEthereumKeyRotationsResponse - (*EthereumKeyRotationsConnection)(nil), // 284: datanode.api.v2.EthereumKeyRotationsConnection - (*EthereumKeyRotationEdge)(nil), // 285: datanode.api.v2.EthereumKeyRotationEdge - (*GetVegaTimeRequest)(nil), // 286: datanode.api.v2.GetVegaTimeRequest - (*GetVegaTimeResponse)(nil), // 287: datanode.api.v2.GetVegaTimeResponse - (*DateRange)(nil), // 288: datanode.api.v2.DateRange - (*GetProtocolUpgradeStatusRequest)(nil), // 289: datanode.api.v2.GetProtocolUpgradeStatusRequest - (*GetProtocolUpgradeStatusResponse)(nil), // 290: datanode.api.v2.GetProtocolUpgradeStatusResponse - (*ListProtocolUpgradeProposalsRequest)(nil), // 291: datanode.api.v2.ListProtocolUpgradeProposalsRequest - (*ListProtocolUpgradeProposalsResponse)(nil), // 292: datanode.api.v2.ListProtocolUpgradeProposalsResponse - (*ProtocolUpgradeProposalConnection)(nil), // 293: datanode.api.v2.ProtocolUpgradeProposalConnection - (*ProtocolUpgradeProposalEdge)(nil), // 294: datanode.api.v2.ProtocolUpgradeProposalEdge - (*ListCoreSnapshotsRequest)(nil), // 295: datanode.api.v2.ListCoreSnapshotsRequest - (*ListCoreSnapshotsResponse)(nil), // 296: datanode.api.v2.ListCoreSnapshotsResponse - (*CoreSnapshotConnection)(nil), // 297: datanode.api.v2.CoreSnapshotConnection - (*CoreSnapshotEdge)(nil), // 298: datanode.api.v2.CoreSnapshotEdge - (*HistorySegment)(nil), // 299: datanode.api.v2.HistorySegment - (*GetMostRecentNetworkHistorySegmentRequest)(nil), // 300: datanode.api.v2.GetMostRecentNetworkHistorySegmentRequest - (*GetMostRecentNetworkHistorySegmentResponse)(nil), // 301: datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse - (*ListAllNetworkHistorySegmentsRequest)(nil), // 302: datanode.api.v2.ListAllNetworkHistorySegmentsRequest - (*ListAllNetworkHistorySegmentsResponse)(nil), // 303: datanode.api.v2.ListAllNetworkHistorySegmentsResponse - (*GetActiveNetworkHistoryPeerAddressesRequest)(nil), // 304: datanode.api.v2.GetActiveNetworkHistoryPeerAddressesRequest - (*GetActiveNetworkHistoryPeerAddressesResponse)(nil), // 305: datanode.api.v2.GetActiveNetworkHistoryPeerAddressesResponse - (*GetNetworkHistoryStatusRequest)(nil), // 306: datanode.api.v2.GetNetworkHistoryStatusRequest - (*GetNetworkHistoryStatusResponse)(nil), // 307: datanode.api.v2.GetNetworkHistoryStatusResponse - (*GetNetworkHistoryBootstrapPeersRequest)(nil), // 308: datanode.api.v2.GetNetworkHistoryBootstrapPeersRequest - (*GetNetworkHistoryBootstrapPeersResponse)(nil), // 309: datanode.api.v2.GetNetworkHistoryBootstrapPeersResponse - (*ExportNetworkHistoryRequest)(nil), // 310: datanode.api.v2.ExportNetworkHistoryRequest - (*ListEntitiesRequest)(nil), // 311: datanode.api.v2.ListEntitiesRequest - (*ListEntitiesResponse)(nil), // 312: datanode.api.v2.ListEntitiesResponse - (*GetPartyActivityStreakRequest)(nil), // 313: datanode.api.v2.GetPartyActivityStreakRequest - (*GetPartyActivityStreakResponse)(nil), // 314: datanode.api.v2.GetPartyActivityStreakResponse - (*FundingPayment)(nil), // 315: datanode.api.v2.FundingPayment - (*ListFundingPaymentsRequest)(nil), // 316: datanode.api.v2.ListFundingPaymentsRequest - (*FundingPaymentEdge)(nil), // 317: datanode.api.v2.FundingPaymentEdge - (*FundingPaymentConnection)(nil), // 318: datanode.api.v2.FundingPaymentConnection - (*ListFundingPaymentsResponse)(nil), // 319: datanode.api.v2.ListFundingPaymentsResponse - (*ListFundingPeriodsRequest)(nil), // 320: datanode.api.v2.ListFundingPeriodsRequest - (*FundingPeriodEdge)(nil), // 321: datanode.api.v2.FundingPeriodEdge - (*FundingPeriodConnection)(nil), // 322: datanode.api.v2.FundingPeriodConnection - (*ListFundingPeriodsResponse)(nil), // 323: datanode.api.v2.ListFundingPeriodsResponse - (*ListFundingPeriodDataPointsRequest)(nil), // 324: datanode.api.v2.ListFundingPeriodDataPointsRequest - (*FundingPeriodDataPointEdge)(nil), // 325: datanode.api.v2.FundingPeriodDataPointEdge - (*FundingPeriodDataPointConnection)(nil), // 326: datanode.api.v2.FundingPeriodDataPointConnection - (*ListFundingPeriodDataPointsResponse)(nil), // 327: datanode.api.v2.ListFundingPeriodDataPointsResponse - (*PingRequest)(nil), // 328: datanode.api.v2.PingRequest - (*PingResponse)(nil), // 329: datanode.api.v2.PingResponse - (*OrderInfo)(nil), // 330: datanode.api.v2.OrderInfo - (*EstimatePositionRequest)(nil), // 331: datanode.api.v2.EstimatePositionRequest - (*EstimatePositionResponse)(nil), // 332: datanode.api.v2.EstimatePositionResponse - (*CollateralIncreaseEstimate)(nil), // 333: datanode.api.v2.CollateralIncreaseEstimate - (*MarginEstimate)(nil), // 334: datanode.api.v2.MarginEstimate - (*LiquidationEstimate)(nil), // 335: datanode.api.v2.LiquidationEstimate - (*LiquidationPrice)(nil), // 336: datanode.api.v2.LiquidationPrice - (*GetCurrentReferralProgramRequest)(nil), // 337: datanode.api.v2.GetCurrentReferralProgramRequest - (*GetCurrentReferralProgramResponse)(nil), // 338: datanode.api.v2.GetCurrentReferralProgramResponse - (*ReferralProgram)(nil), // 339: datanode.api.v2.ReferralProgram - (*ReferralSet)(nil), // 340: datanode.api.v2.ReferralSet - (*ReferralSetEdge)(nil), // 341: datanode.api.v2.ReferralSetEdge - (*ReferralSetConnection)(nil), // 342: datanode.api.v2.ReferralSetConnection - (*ListReferralSetsRequest)(nil), // 343: datanode.api.v2.ListReferralSetsRequest - (*ListReferralSetsResponse)(nil), // 344: datanode.api.v2.ListReferralSetsResponse - (*ReferralSetReferee)(nil), // 345: datanode.api.v2.ReferralSetReferee - (*ReferralSetRefereeEdge)(nil), // 346: datanode.api.v2.ReferralSetRefereeEdge - (*ReferralSetRefereeConnection)(nil), // 347: datanode.api.v2.ReferralSetRefereeConnection - (*ListReferralSetRefereesRequest)(nil), // 348: datanode.api.v2.ListReferralSetRefereesRequest - (*ListReferralSetRefereesResponse)(nil), // 349: datanode.api.v2.ListReferralSetRefereesResponse - (*GetReferralSetStatsRequest)(nil), // 350: datanode.api.v2.GetReferralSetStatsRequest - (*GetReferralSetStatsResponse)(nil), // 351: datanode.api.v2.GetReferralSetStatsResponse - (*ReferralSetStatsConnection)(nil), // 352: datanode.api.v2.ReferralSetStatsConnection - (*ReferralSetStatsEdge)(nil), // 353: datanode.api.v2.ReferralSetStatsEdge - (*ReferralSetStats)(nil), // 354: datanode.api.v2.ReferralSetStats - (*Team)(nil), // 355: datanode.api.v2.Team - (*TeamEdge)(nil), // 356: datanode.api.v2.TeamEdge - (*TeamConnection)(nil), // 357: datanode.api.v2.TeamConnection - (*ListTeamsRequest)(nil), // 358: datanode.api.v2.ListTeamsRequest - (*ListTeamsResponse)(nil), // 359: datanode.api.v2.ListTeamsResponse - (*ListTeamsStatisticsRequest)(nil), // 360: datanode.api.v2.ListTeamsStatisticsRequest - (*ListTeamsStatisticsResponse)(nil), // 361: datanode.api.v2.ListTeamsStatisticsResponse - (*TeamsStatisticsConnection)(nil), // 362: datanode.api.v2.TeamsStatisticsConnection - (*TeamStatisticsEdge)(nil), // 363: datanode.api.v2.TeamStatisticsEdge - (*TeamStatistics)(nil), // 364: datanode.api.v2.TeamStatistics - (*QuantumRewardsPerEpoch)(nil), // 365: datanode.api.v2.QuantumRewardsPerEpoch - (*QuantumVolumesPerEpoch)(nil), // 366: datanode.api.v2.QuantumVolumesPerEpoch - (*ListTeamMembersStatisticsRequest)(nil), // 367: datanode.api.v2.ListTeamMembersStatisticsRequest - (*ListTeamMembersStatisticsResponse)(nil), // 368: datanode.api.v2.ListTeamMembersStatisticsResponse - (*TeamMembersStatisticsConnection)(nil), // 369: datanode.api.v2.TeamMembersStatisticsConnection - (*TeamMemberStatisticsEdge)(nil), // 370: datanode.api.v2.TeamMemberStatisticsEdge - (*TeamMemberStatistics)(nil), // 371: datanode.api.v2.TeamMemberStatistics - (*ListTeamRefereesRequest)(nil), // 372: datanode.api.v2.ListTeamRefereesRequest - (*TeamReferee)(nil), // 373: datanode.api.v2.TeamReferee - (*TeamRefereeEdge)(nil), // 374: datanode.api.v2.TeamRefereeEdge - (*TeamRefereeConnection)(nil), // 375: datanode.api.v2.TeamRefereeConnection - (*ListTeamRefereesResponse)(nil), // 376: datanode.api.v2.ListTeamRefereesResponse - (*TeamRefereeHistory)(nil), // 377: datanode.api.v2.TeamRefereeHistory - (*TeamRefereeHistoryEdge)(nil), // 378: datanode.api.v2.TeamRefereeHistoryEdge - (*TeamRefereeHistoryConnection)(nil), // 379: datanode.api.v2.TeamRefereeHistoryConnection - (*ListTeamRefereeHistoryRequest)(nil), // 380: datanode.api.v2.ListTeamRefereeHistoryRequest - (*ListTeamRefereeHistoryResponse)(nil), // 381: datanode.api.v2.ListTeamRefereeHistoryResponse - (*GetFeesStatsRequest)(nil), // 382: datanode.api.v2.GetFeesStatsRequest - (*GetFeesStatsResponse)(nil), // 383: datanode.api.v2.GetFeesStatsResponse - (*GetFeesStatsForPartyRequest)(nil), // 384: datanode.api.v2.GetFeesStatsForPartyRequest - (*GetFeesStatsForPartyResponse)(nil), // 385: datanode.api.v2.GetFeesStatsForPartyResponse - (*GetCurrentVolumeDiscountProgramRequest)(nil), // 386: datanode.api.v2.GetCurrentVolumeDiscountProgramRequest - (*GetCurrentVolumeDiscountProgramResponse)(nil), // 387: datanode.api.v2.GetCurrentVolumeDiscountProgramResponse - (*GetVolumeDiscountStatsRequest)(nil), // 388: datanode.api.v2.GetVolumeDiscountStatsRequest - (*GetVolumeDiscountStatsResponse)(nil), // 389: datanode.api.v2.GetVolumeDiscountStatsResponse - (*VolumeDiscountStatsConnection)(nil), // 390: datanode.api.v2.VolumeDiscountStatsConnection - (*VolumeDiscountStatsEdge)(nil), // 391: datanode.api.v2.VolumeDiscountStatsEdge - (*VolumeDiscountStats)(nil), // 392: datanode.api.v2.VolumeDiscountStats - (*VolumeDiscountProgram)(nil), // 393: datanode.api.v2.VolumeDiscountProgram - (*FeesStatsForParty)(nil), // 394: datanode.api.v2.FeesStatsForParty - (*ObserveTransactionResultsRequest)(nil), // 395: datanode.api.v2.ObserveTransactionResultsRequest - (*ObserveTransactionResultsResponse)(nil), // 396: datanode.api.v2.ObserveTransactionResultsResponse - (*EstimateTransferFeeRequest)(nil), // 397: datanode.api.v2.EstimateTransferFeeRequest - (*EstimateTransferFeeResponse)(nil), // 398: datanode.api.v2.EstimateTransferFeeResponse - (*GetTotalTransferFeeDiscountRequest)(nil), // 399: datanode.api.v2.GetTotalTransferFeeDiscountRequest - (*GetTotalTransferFeeDiscountResponse)(nil), // 400: datanode.api.v2.GetTotalTransferFeeDiscountResponse - (*ListGamesRequest)(nil), // 401: datanode.api.v2.ListGamesRequest - (*ListGamesResponse)(nil), // 402: datanode.api.v2.ListGamesResponse - (*GamesConnection)(nil), // 403: datanode.api.v2.GamesConnection - (*GameEdge)(nil), // 404: datanode.api.v2.GameEdge - (*Game)(nil), // 405: datanode.api.v2.Game - (*TeamGameEntities)(nil), // 406: datanode.api.v2.TeamGameEntities - (*IndividualGameEntities)(nil), // 407: datanode.api.v2.IndividualGameEntities - (*TeamGameEntity)(nil), // 408: datanode.api.v2.TeamGameEntity - (*TeamGameParticipation)(nil), // 409: datanode.api.v2.TeamGameParticipation - (*IndividualGameEntity)(nil), // 410: datanode.api.v2.IndividualGameEntity - (*ListPartyMarginModesRequest)(nil), // 411: datanode.api.v2.ListPartyMarginModesRequest - (*ListPartyMarginModesResponse)(nil), // 412: datanode.api.v2.ListPartyMarginModesResponse - (*PartyMarginModesConnection)(nil), // 413: datanode.api.v2.PartyMarginModesConnection - (*PartyMarginModeEdge)(nil), // 414: datanode.api.v2.PartyMarginModeEdge - (*PartyMarginMode)(nil), // 415: datanode.api.v2.PartyMarginMode - (*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 + (*ListGameTeamScoresRequest)(nil), // 36: datanode.api.v2.ListGameTeamScoresRequest + (*GameTeamScoresFilter)(nil), // 37: datanode.api.v2.GameTeamScoresFilter + (*ListGameTeamScoresResponse)(nil), // 38: datanode.api.v2.ListGameTeamScoresResponse + (*GameTeamScoresConnection)(nil), // 39: datanode.api.v2.GameTeamScoresConnection + (*GameTeamScoresEdge)(nil), // 40: datanode.api.v2.GameTeamScoresEdge + (*ListGamePartyScoresRequest)(nil), // 41: datanode.api.v2.ListGamePartyScoresRequest + (*GamePartyScoresFilter)(nil), // 42: datanode.api.v2.GamePartyScoresFilter + (*ListGamePartyScoresResponse)(nil), // 43: datanode.api.v2.ListGamePartyScoresResponse + (*GamePartyScoresConnection)(nil), // 44: datanode.api.v2.GamePartyScoresConnection + (*GamePartyScoresEdge)(nil), // 45: datanode.api.v2.GamePartyScoresEdge + (*ListStopOrdersRequest)(nil), // 46: datanode.api.v2.ListStopOrdersRequest + (*StopOrderFilter)(nil), // 47: datanode.api.v2.StopOrderFilter + (*StopOrderEdge)(nil), // 48: datanode.api.v2.StopOrderEdge + (*StopOrderConnection)(nil), // 49: datanode.api.v2.StopOrderConnection + (*ListStopOrdersResponse)(nil), // 50: datanode.api.v2.ListStopOrdersResponse + (*ListPositionsRequest)(nil), // 51: datanode.api.v2.ListPositionsRequest + (*ListPositionsResponse)(nil), // 52: datanode.api.v2.ListPositionsResponse + (*PositionsFilter)(nil), // 53: datanode.api.v2.PositionsFilter + (*ListAllPositionsRequest)(nil), // 54: datanode.api.v2.ListAllPositionsRequest + (*ListAllPositionsResponse)(nil), // 55: datanode.api.v2.ListAllPositionsResponse + (*PositionEdge)(nil), // 56: datanode.api.v2.PositionEdge + (*PositionConnection)(nil), // 57: datanode.api.v2.PositionConnection + (*ObservePositionsRequest)(nil), // 58: datanode.api.v2.ObservePositionsRequest + (*ObservePositionsResponse)(nil), // 59: datanode.api.v2.ObservePositionsResponse + (*PositionSnapshotPage)(nil), // 60: datanode.api.v2.PositionSnapshotPage + (*PositionUpdates)(nil), // 61: datanode.api.v2.PositionUpdates + (*LedgerEntryFilter)(nil), // 62: datanode.api.v2.LedgerEntryFilter + (*AggregatedLedgerEntry)(nil), // 63: datanode.api.v2.AggregatedLedgerEntry + (*ListLedgerEntriesRequest)(nil), // 64: datanode.api.v2.ListLedgerEntriesRequest + (*ExportLedgerEntriesRequest)(nil), // 65: datanode.api.v2.ExportLedgerEntriesRequest + (*ListLedgerEntriesResponse)(nil), // 66: datanode.api.v2.ListLedgerEntriesResponse + (*AggregatedLedgerEntriesEdge)(nil), // 67: datanode.api.v2.AggregatedLedgerEntriesEdge + (*AggregatedLedgerEntriesConnection)(nil), // 68: datanode.api.v2.AggregatedLedgerEntriesConnection + (*ListBalanceChangesRequest)(nil), // 69: datanode.api.v2.ListBalanceChangesRequest + (*ListBalanceChangesResponse)(nil), // 70: datanode.api.v2.ListBalanceChangesResponse + (*GetBalanceHistoryRequest)(nil), // 71: datanode.api.v2.GetBalanceHistoryRequest + (*GetBalanceHistoryResponse)(nil), // 72: datanode.api.v2.GetBalanceHistoryResponse + (*AggregatedBalanceEdge)(nil), // 73: datanode.api.v2.AggregatedBalanceEdge + (*AggregatedBalanceConnection)(nil), // 74: datanode.api.v2.AggregatedBalanceConnection + (*AccountFilter)(nil), // 75: datanode.api.v2.AccountFilter + (*AggregatedBalance)(nil), // 76: datanode.api.v2.AggregatedBalance + (*ObserveMarketsDepthRequest)(nil), // 77: datanode.api.v2.ObserveMarketsDepthRequest + (*ObserveMarketsDepthResponse)(nil), // 78: datanode.api.v2.ObserveMarketsDepthResponse + (*ObserveMarketsDepthUpdatesRequest)(nil), // 79: datanode.api.v2.ObserveMarketsDepthUpdatesRequest + (*ObserveMarketsDepthUpdatesResponse)(nil), // 80: datanode.api.v2.ObserveMarketsDepthUpdatesResponse + (*ObserveMarketsDataRequest)(nil), // 81: datanode.api.v2.ObserveMarketsDataRequest + (*ObserveMarketsDataResponse)(nil), // 82: datanode.api.v2.ObserveMarketsDataResponse + (*GetLatestMarketDepthRequest)(nil), // 83: datanode.api.v2.GetLatestMarketDepthRequest + (*GetLatestMarketDepthResponse)(nil), // 84: datanode.api.v2.GetLatestMarketDepthResponse + (*ListLatestMarketDataRequest)(nil), // 85: datanode.api.v2.ListLatestMarketDataRequest + (*ListLatestMarketDataResponse)(nil), // 86: datanode.api.v2.ListLatestMarketDataResponse + (*GetLatestMarketDataRequest)(nil), // 87: datanode.api.v2.GetLatestMarketDataRequest + (*GetLatestMarketDataResponse)(nil), // 88: datanode.api.v2.GetLatestMarketDataResponse + (*GetMarketDataHistoryByIDRequest)(nil), // 89: datanode.api.v2.GetMarketDataHistoryByIDRequest + (*GetMarketDataHistoryByIDResponse)(nil), // 90: datanode.api.v2.GetMarketDataHistoryByIDResponse + (*MarketDataEdge)(nil), // 91: datanode.api.v2.MarketDataEdge + (*MarketDataConnection)(nil), // 92: datanode.api.v2.MarketDataConnection + (*ListTransfersRequest)(nil), // 93: datanode.api.v2.ListTransfersRequest + (*ListTransfersResponse)(nil), // 94: datanode.api.v2.ListTransfersResponse + (*TransferNode)(nil), // 95: datanode.api.v2.TransferNode + (*TransferEdge)(nil), // 96: datanode.api.v2.TransferEdge + (*TransferConnection)(nil), // 97: datanode.api.v2.TransferConnection + (*GetTransferRequest)(nil), // 98: datanode.api.v2.GetTransferRequest + (*GetTransferResponse)(nil), // 99: datanode.api.v2.GetTransferResponse + (*GetNetworkLimitsRequest)(nil), // 100: datanode.api.v2.GetNetworkLimitsRequest + (*GetNetworkLimitsResponse)(nil), // 101: datanode.api.v2.GetNetworkLimitsResponse + (*ListCandleIntervalsRequest)(nil), // 102: datanode.api.v2.ListCandleIntervalsRequest + (*IntervalToCandleId)(nil), // 103: datanode.api.v2.IntervalToCandleId + (*ListCandleIntervalsResponse)(nil), // 104: datanode.api.v2.ListCandleIntervalsResponse + (*Candle)(nil), // 105: datanode.api.v2.Candle + (*ObserveCandleDataRequest)(nil), // 106: datanode.api.v2.ObserveCandleDataRequest + (*ObserveCandleDataResponse)(nil), // 107: datanode.api.v2.ObserveCandleDataResponse + (*ListCandleDataRequest)(nil), // 108: datanode.api.v2.ListCandleDataRequest + (*ListCandleDataResponse)(nil), // 109: datanode.api.v2.ListCandleDataResponse + (*CandleEdge)(nil), // 110: datanode.api.v2.CandleEdge + (*CandleDataConnection)(nil), // 111: datanode.api.v2.CandleDataConnection + (*ListVotesRequest)(nil), // 112: datanode.api.v2.ListVotesRequest + (*ListVotesResponse)(nil), // 113: datanode.api.v2.ListVotesResponse + (*VoteEdge)(nil), // 114: datanode.api.v2.VoteEdge + (*VoteConnection)(nil), // 115: datanode.api.v2.VoteConnection + (*ObserveVotesRequest)(nil), // 116: datanode.api.v2.ObserveVotesRequest + (*ObserveVotesResponse)(nil), // 117: datanode.api.v2.ObserveVotesResponse + (*ListERC20MultiSigSignerAddedBundlesRequest)(nil), // 118: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest + (*ListERC20MultiSigSignerAddedBundlesResponse)(nil), // 119: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse + (*ERC20MultiSigSignerAddedEdge)(nil), // 120: datanode.api.v2.ERC20MultiSigSignerAddedEdge + (*ERC20MultiSigSignerAddedBundleEdge)(nil), // 121: datanode.api.v2.ERC20MultiSigSignerAddedBundleEdge + (*ERC20MultiSigSignerAddedConnection)(nil), // 122: datanode.api.v2.ERC20MultiSigSignerAddedConnection + (*ERC20MultiSigSignerAddedBundle)(nil), // 123: datanode.api.v2.ERC20MultiSigSignerAddedBundle + (*ListERC20MultiSigSignerRemovedBundlesRequest)(nil), // 124: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest + (*ListERC20MultiSigSignerRemovedBundlesResponse)(nil), // 125: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse + (*ERC20MultiSigSignerRemovedEdge)(nil), // 126: datanode.api.v2.ERC20MultiSigSignerRemovedEdge + (*ERC20MultiSigSignerRemovedBundleEdge)(nil), // 127: datanode.api.v2.ERC20MultiSigSignerRemovedBundleEdge + (*ERC20MultiSigSignerRemovedConnection)(nil), // 128: datanode.api.v2.ERC20MultiSigSignerRemovedConnection + (*ERC20MultiSigSignerRemovedBundle)(nil), // 129: datanode.api.v2.ERC20MultiSigSignerRemovedBundle + (*GetERC20ListAssetBundleRequest)(nil), // 130: datanode.api.v2.GetERC20ListAssetBundleRequest + (*GetERC20ListAssetBundleResponse)(nil), // 131: datanode.api.v2.GetERC20ListAssetBundleResponse + (*GetERC20SetAssetLimitsBundleRequest)(nil), // 132: datanode.api.v2.GetERC20SetAssetLimitsBundleRequest + (*GetERC20SetAssetLimitsBundleResponse)(nil), // 133: datanode.api.v2.GetERC20SetAssetLimitsBundleResponse + (*GetERC20WithdrawalApprovalRequest)(nil), // 134: datanode.api.v2.GetERC20WithdrawalApprovalRequest + (*GetERC20WithdrawalApprovalResponse)(nil), // 135: datanode.api.v2.GetERC20WithdrawalApprovalResponse + (*GetLastTradeRequest)(nil), // 136: datanode.api.v2.GetLastTradeRequest + (*GetLastTradeResponse)(nil), // 137: datanode.api.v2.GetLastTradeResponse + (*ListTradesRequest)(nil), // 138: datanode.api.v2.ListTradesRequest + (*ListTradesResponse)(nil), // 139: datanode.api.v2.ListTradesResponse + (*TradeConnection)(nil), // 140: datanode.api.v2.TradeConnection + (*TradeEdge)(nil), // 141: datanode.api.v2.TradeEdge + (*ObserveTradesRequest)(nil), // 142: datanode.api.v2.ObserveTradesRequest + (*ObserveTradesResponse)(nil), // 143: datanode.api.v2.ObserveTradesResponse + (*GetOracleSpecRequest)(nil), // 144: datanode.api.v2.GetOracleSpecRequest + (*GetOracleSpecResponse)(nil), // 145: datanode.api.v2.GetOracleSpecResponse + (*ListOracleSpecsRequest)(nil), // 146: datanode.api.v2.ListOracleSpecsRequest + (*ListOracleSpecsResponse)(nil), // 147: datanode.api.v2.ListOracleSpecsResponse + (*ListOracleDataRequest)(nil), // 148: datanode.api.v2.ListOracleDataRequest + (*ListOracleDataResponse)(nil), // 149: datanode.api.v2.ListOracleDataResponse + (*OracleSpecEdge)(nil), // 150: datanode.api.v2.OracleSpecEdge + (*OracleSpecsConnection)(nil), // 151: datanode.api.v2.OracleSpecsConnection + (*OracleDataEdge)(nil), // 152: datanode.api.v2.OracleDataEdge + (*OracleDataConnection)(nil), // 153: datanode.api.v2.OracleDataConnection + (*GetMarketRequest)(nil), // 154: datanode.api.v2.GetMarketRequest + (*GetMarketResponse)(nil), // 155: datanode.api.v2.GetMarketResponse + (*ListMarketsRequest)(nil), // 156: datanode.api.v2.ListMarketsRequest + (*ListMarketsResponse)(nil), // 157: datanode.api.v2.ListMarketsResponse + (*MarketEdge)(nil), // 158: datanode.api.v2.MarketEdge + (*MarketConnection)(nil), // 159: datanode.api.v2.MarketConnection + (*ListSuccessorMarketsRequest)(nil), // 160: datanode.api.v2.ListSuccessorMarketsRequest + (*SuccessorMarket)(nil), // 161: datanode.api.v2.SuccessorMarket + (*SuccessorMarketEdge)(nil), // 162: datanode.api.v2.SuccessorMarketEdge + (*SuccessorMarketConnection)(nil), // 163: datanode.api.v2.SuccessorMarketConnection + (*ListSuccessorMarketsResponse)(nil), // 164: datanode.api.v2.ListSuccessorMarketsResponse + (*GetPartyRequest)(nil), // 165: datanode.api.v2.GetPartyRequest + (*GetPartyResponse)(nil), // 166: datanode.api.v2.GetPartyResponse + (*ListPartiesRequest)(nil), // 167: datanode.api.v2.ListPartiesRequest + (*ListPartiesResponse)(nil), // 168: datanode.api.v2.ListPartiesResponse + (*PartyEdge)(nil), // 169: datanode.api.v2.PartyEdge + (*PartyConnection)(nil), // 170: datanode.api.v2.PartyConnection + (*ListPartiesProfilesRequest)(nil), // 171: datanode.api.v2.ListPartiesProfilesRequest + (*ListPartiesProfilesResponse)(nil), // 172: datanode.api.v2.ListPartiesProfilesResponse + (*PartyProfileEdge)(nil), // 173: datanode.api.v2.PartyProfileEdge + (*PartiesProfilesConnection)(nil), // 174: datanode.api.v2.PartiesProfilesConnection + (*OrderEdge)(nil), // 175: datanode.api.v2.OrderEdge + (*ListMarginLevelsRequest)(nil), // 176: datanode.api.v2.ListMarginLevelsRequest + (*ListMarginLevelsResponse)(nil), // 177: datanode.api.v2.ListMarginLevelsResponse + (*ObserveMarginLevelsRequest)(nil), // 178: datanode.api.v2.ObserveMarginLevelsRequest + (*ObserveMarginLevelsResponse)(nil), // 179: datanode.api.v2.ObserveMarginLevelsResponse + (*OrderConnection)(nil), // 180: datanode.api.v2.OrderConnection + (*MarginEdge)(nil), // 181: datanode.api.v2.MarginEdge + (*MarginConnection)(nil), // 182: datanode.api.v2.MarginConnection + (*ListRewardsRequest)(nil), // 183: datanode.api.v2.ListRewardsRequest + (*ListRewardsResponse)(nil), // 184: datanode.api.v2.ListRewardsResponse + (*RewardEdge)(nil), // 185: datanode.api.v2.RewardEdge + (*RewardsConnection)(nil), // 186: datanode.api.v2.RewardsConnection + (*ListRewardSummariesRequest)(nil), // 187: datanode.api.v2.ListRewardSummariesRequest + (*ListRewardSummariesResponse)(nil), // 188: datanode.api.v2.ListRewardSummariesResponse + (*RewardSummaryFilter)(nil), // 189: datanode.api.v2.RewardSummaryFilter + (*ListEpochRewardSummariesRequest)(nil), // 190: datanode.api.v2.ListEpochRewardSummariesRequest + (*ListEpochRewardSummariesResponse)(nil), // 191: datanode.api.v2.ListEpochRewardSummariesResponse + (*EpochRewardSummaryConnection)(nil), // 192: datanode.api.v2.EpochRewardSummaryConnection + (*EpochRewardSummaryEdge)(nil), // 193: datanode.api.v2.EpochRewardSummaryEdge + (*ObserveRewardsRequest)(nil), // 194: datanode.api.v2.ObserveRewardsRequest + (*ObserveRewardsResponse)(nil), // 195: datanode.api.v2.ObserveRewardsResponse + (*GetDepositRequest)(nil), // 196: datanode.api.v2.GetDepositRequest + (*GetDepositResponse)(nil), // 197: datanode.api.v2.GetDepositResponse + (*ListDepositsRequest)(nil), // 198: datanode.api.v2.ListDepositsRequest + (*ListDepositsResponse)(nil), // 199: datanode.api.v2.ListDepositsResponse + (*DepositEdge)(nil), // 200: datanode.api.v2.DepositEdge + (*DepositsConnection)(nil), // 201: datanode.api.v2.DepositsConnection + (*GetWithdrawalRequest)(nil), // 202: datanode.api.v2.GetWithdrawalRequest + (*GetWithdrawalResponse)(nil), // 203: datanode.api.v2.GetWithdrawalResponse + (*ListWithdrawalsRequest)(nil), // 204: datanode.api.v2.ListWithdrawalsRequest + (*ListWithdrawalsResponse)(nil), // 205: datanode.api.v2.ListWithdrawalsResponse + (*WithdrawalEdge)(nil), // 206: datanode.api.v2.WithdrawalEdge + (*WithdrawalsConnection)(nil), // 207: datanode.api.v2.WithdrawalsConnection + (*GetAssetRequest)(nil), // 208: datanode.api.v2.GetAssetRequest + (*GetAssetResponse)(nil), // 209: datanode.api.v2.GetAssetResponse + (*ListAssetsRequest)(nil), // 210: datanode.api.v2.ListAssetsRequest + (*ListAssetsResponse)(nil), // 211: datanode.api.v2.ListAssetsResponse + (*AssetEdge)(nil), // 212: datanode.api.v2.AssetEdge + (*AssetsConnection)(nil), // 213: datanode.api.v2.AssetsConnection + (*ListLiquidityProvisionsRequest)(nil), // 214: datanode.api.v2.ListLiquidityProvisionsRequest + (*ListAllLiquidityProvisionsRequest)(nil), // 215: datanode.api.v2.ListAllLiquidityProvisionsRequest + (*ListLiquidityProvisionsResponse)(nil), // 216: datanode.api.v2.ListLiquidityProvisionsResponse + (*ListAllLiquidityProvisionsResponse)(nil), // 217: datanode.api.v2.ListAllLiquidityProvisionsResponse + (*LiquidityProvision)(nil), // 218: datanode.api.v2.LiquidityProvision + (*LiquidityProvisionsEdge)(nil), // 219: datanode.api.v2.LiquidityProvisionsEdge + (*LiquidityProvisionWithPendingEdge)(nil), // 220: datanode.api.v2.LiquidityProvisionWithPendingEdge + (*LiquidityProvisionsConnection)(nil), // 221: datanode.api.v2.LiquidityProvisionsConnection + (*LiquidityProvisionsWithPendingConnection)(nil), // 222: datanode.api.v2.LiquidityProvisionsWithPendingConnection + (*ObserveLiquidityProvisionsRequest)(nil), // 223: datanode.api.v2.ObserveLiquidityProvisionsRequest + (*ObserveLiquidityProvisionsResponse)(nil), // 224: datanode.api.v2.ObserveLiquidityProvisionsResponse + (*ListLiquidityProvidersRequest)(nil), // 225: datanode.api.v2.ListLiquidityProvidersRequest + (*LiquidityProvider)(nil), // 226: datanode.api.v2.LiquidityProvider + (*LiquidityProviderEdge)(nil), // 227: datanode.api.v2.LiquidityProviderEdge + (*LiquidityProviderConnection)(nil), // 228: datanode.api.v2.LiquidityProviderConnection + (*ListLiquidityProvidersResponse)(nil), // 229: datanode.api.v2.ListLiquidityProvidersResponse + (*ListPaidLiquidityFeesRequest)(nil), // 230: datanode.api.v2.ListPaidLiquidityFeesRequest + (*ListPaidLiquidityFeesResponse)(nil), // 231: datanode.api.v2.ListPaidLiquidityFeesResponse + (*PaidLiquidityFeesEdge)(nil), // 232: datanode.api.v2.PaidLiquidityFeesEdge + (*PaidLiquidityFeesConnection)(nil), // 233: datanode.api.v2.PaidLiquidityFeesConnection + (*GetGovernanceDataRequest)(nil), // 234: datanode.api.v2.GetGovernanceDataRequest + (*GetGovernanceDataResponse)(nil), // 235: datanode.api.v2.GetGovernanceDataResponse + (*ListGovernanceDataRequest)(nil), // 236: datanode.api.v2.ListGovernanceDataRequest + (*ListGovernanceDataResponse)(nil), // 237: datanode.api.v2.ListGovernanceDataResponse + (*GovernanceDataEdge)(nil), // 238: datanode.api.v2.GovernanceDataEdge + (*GovernanceDataConnection)(nil), // 239: datanode.api.v2.GovernanceDataConnection + (*ObserveGovernanceRequest)(nil), // 240: datanode.api.v2.ObserveGovernanceRequest + (*ObserveGovernanceResponse)(nil), // 241: datanode.api.v2.ObserveGovernanceResponse + (*ListDelegationsRequest)(nil), // 242: datanode.api.v2.ListDelegationsRequest + (*ListDelegationsResponse)(nil), // 243: datanode.api.v2.ListDelegationsResponse + (*DelegationEdge)(nil), // 244: datanode.api.v2.DelegationEdge + (*DelegationsConnection)(nil), // 245: datanode.api.v2.DelegationsConnection + (*ObserveDelegationsRequest)(nil), // 246: datanode.api.v2.ObserveDelegationsRequest + (*ObserveDelegationsResponse)(nil), // 247: datanode.api.v2.ObserveDelegationsResponse + (*NodeBasic)(nil), // 248: datanode.api.v2.NodeBasic + (*GetNetworkDataRequest)(nil), // 249: datanode.api.v2.GetNetworkDataRequest + (*GetNetworkDataResponse)(nil), // 250: datanode.api.v2.GetNetworkDataResponse + (*GetNodeRequest)(nil), // 251: datanode.api.v2.GetNodeRequest + (*GetNodeResponse)(nil), // 252: datanode.api.v2.GetNodeResponse + (*ListNodesRequest)(nil), // 253: datanode.api.v2.ListNodesRequest + (*ListNodesResponse)(nil), // 254: datanode.api.v2.ListNodesResponse + (*NodeEdge)(nil), // 255: datanode.api.v2.NodeEdge + (*NodesConnection)(nil), // 256: datanode.api.v2.NodesConnection + (*ListNodeSignaturesRequest)(nil), // 257: datanode.api.v2.ListNodeSignaturesRequest + (*ListNodeSignaturesResponse)(nil), // 258: datanode.api.v2.ListNodeSignaturesResponse + (*NodeSignatureEdge)(nil), // 259: datanode.api.v2.NodeSignatureEdge + (*NodeSignaturesConnection)(nil), // 260: datanode.api.v2.NodeSignaturesConnection + (*GetEpochRequest)(nil), // 261: datanode.api.v2.GetEpochRequest + (*GetEpochResponse)(nil), // 262: datanode.api.v2.GetEpochResponse + (*EstimateFeeRequest)(nil), // 263: datanode.api.v2.EstimateFeeRequest + (*EstimateFeeResponse)(nil), // 264: datanode.api.v2.EstimateFeeResponse + (*EstimateMarginRequest)(nil), // 265: datanode.api.v2.EstimateMarginRequest + (*EstimateMarginResponse)(nil), // 266: datanode.api.v2.EstimateMarginResponse + (*ListNetworkParametersRequest)(nil), // 267: datanode.api.v2.ListNetworkParametersRequest + (*ListNetworkParametersResponse)(nil), // 268: datanode.api.v2.ListNetworkParametersResponse + (*GetNetworkParameterRequest)(nil), // 269: datanode.api.v2.GetNetworkParameterRequest + (*GetNetworkParameterResponse)(nil), // 270: datanode.api.v2.GetNetworkParameterResponse + (*NetworkParameterEdge)(nil), // 271: datanode.api.v2.NetworkParameterEdge + (*NetworkParameterConnection)(nil), // 272: datanode.api.v2.NetworkParameterConnection + (*Checkpoint)(nil), // 273: datanode.api.v2.Checkpoint + (*ListCheckpointsRequest)(nil), // 274: datanode.api.v2.ListCheckpointsRequest + (*ListCheckpointsResponse)(nil), // 275: datanode.api.v2.ListCheckpointsResponse + (*CheckpointEdge)(nil), // 276: datanode.api.v2.CheckpointEdge + (*CheckpointsConnection)(nil), // 277: datanode.api.v2.CheckpointsConnection + (*GetStakeRequest)(nil), // 278: datanode.api.v2.GetStakeRequest + (*GetStakeResponse)(nil), // 279: datanode.api.v2.GetStakeResponse + (*StakeLinkingEdge)(nil), // 280: datanode.api.v2.StakeLinkingEdge + (*StakesConnection)(nil), // 281: datanode.api.v2.StakesConnection + (*GetRiskFactorsRequest)(nil), // 282: datanode.api.v2.GetRiskFactorsRequest + (*GetRiskFactorsResponse)(nil), // 283: datanode.api.v2.GetRiskFactorsResponse + (*ObserveEventBusRequest)(nil), // 284: datanode.api.v2.ObserveEventBusRequest + (*ObserveEventBusResponse)(nil), // 285: datanode.api.v2.ObserveEventBusResponse + (*ObserveLedgerMovementsRequest)(nil), // 286: datanode.api.v2.ObserveLedgerMovementsRequest + (*ObserveLedgerMovementsResponse)(nil), // 287: datanode.api.v2.ObserveLedgerMovementsResponse + (*ListKeyRotationsRequest)(nil), // 288: datanode.api.v2.ListKeyRotationsRequest + (*ListKeyRotationsResponse)(nil), // 289: datanode.api.v2.ListKeyRotationsResponse + (*KeyRotationEdge)(nil), // 290: datanode.api.v2.KeyRotationEdge + (*KeyRotationConnection)(nil), // 291: datanode.api.v2.KeyRotationConnection + (*ListEthereumKeyRotationsRequest)(nil), // 292: datanode.api.v2.ListEthereumKeyRotationsRequest + (*ListEthereumKeyRotationsResponse)(nil), // 293: datanode.api.v2.ListEthereumKeyRotationsResponse + (*EthereumKeyRotationsConnection)(nil), // 294: datanode.api.v2.EthereumKeyRotationsConnection + (*EthereumKeyRotationEdge)(nil), // 295: datanode.api.v2.EthereumKeyRotationEdge + (*GetVegaTimeRequest)(nil), // 296: datanode.api.v2.GetVegaTimeRequest + (*GetVegaTimeResponse)(nil), // 297: datanode.api.v2.GetVegaTimeResponse + (*DateRange)(nil), // 298: datanode.api.v2.DateRange + (*GetProtocolUpgradeStatusRequest)(nil), // 299: datanode.api.v2.GetProtocolUpgradeStatusRequest + (*GetProtocolUpgradeStatusResponse)(nil), // 300: datanode.api.v2.GetProtocolUpgradeStatusResponse + (*ListProtocolUpgradeProposalsRequest)(nil), // 301: datanode.api.v2.ListProtocolUpgradeProposalsRequest + (*ListProtocolUpgradeProposalsResponse)(nil), // 302: datanode.api.v2.ListProtocolUpgradeProposalsResponse + (*ProtocolUpgradeProposalConnection)(nil), // 303: datanode.api.v2.ProtocolUpgradeProposalConnection + (*ProtocolUpgradeProposalEdge)(nil), // 304: datanode.api.v2.ProtocolUpgradeProposalEdge + (*ListCoreSnapshotsRequest)(nil), // 305: datanode.api.v2.ListCoreSnapshotsRequest + (*ListCoreSnapshotsResponse)(nil), // 306: datanode.api.v2.ListCoreSnapshotsResponse + (*CoreSnapshotConnection)(nil), // 307: datanode.api.v2.CoreSnapshotConnection + (*CoreSnapshotEdge)(nil), // 308: datanode.api.v2.CoreSnapshotEdge + (*HistorySegment)(nil), // 309: datanode.api.v2.HistorySegment + (*GetMostRecentNetworkHistorySegmentRequest)(nil), // 310: datanode.api.v2.GetMostRecentNetworkHistorySegmentRequest + (*GetMostRecentNetworkHistorySegmentResponse)(nil), // 311: datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse + (*ListAllNetworkHistorySegmentsRequest)(nil), // 312: datanode.api.v2.ListAllNetworkHistorySegmentsRequest + (*ListAllNetworkHistorySegmentsResponse)(nil), // 313: datanode.api.v2.ListAllNetworkHistorySegmentsResponse + (*GetActiveNetworkHistoryPeerAddressesRequest)(nil), // 314: datanode.api.v2.GetActiveNetworkHistoryPeerAddressesRequest + (*GetActiveNetworkHistoryPeerAddressesResponse)(nil), // 315: datanode.api.v2.GetActiveNetworkHistoryPeerAddressesResponse + (*GetNetworkHistoryStatusRequest)(nil), // 316: datanode.api.v2.GetNetworkHistoryStatusRequest + (*GetNetworkHistoryStatusResponse)(nil), // 317: datanode.api.v2.GetNetworkHistoryStatusResponse + (*GetNetworkHistoryBootstrapPeersRequest)(nil), // 318: datanode.api.v2.GetNetworkHistoryBootstrapPeersRequest + (*GetNetworkHistoryBootstrapPeersResponse)(nil), // 319: datanode.api.v2.GetNetworkHistoryBootstrapPeersResponse + (*ExportNetworkHistoryRequest)(nil), // 320: datanode.api.v2.ExportNetworkHistoryRequest + (*ListEntitiesRequest)(nil), // 321: datanode.api.v2.ListEntitiesRequest + (*ListEntitiesResponse)(nil), // 322: datanode.api.v2.ListEntitiesResponse + (*GetPartyActivityStreakRequest)(nil), // 323: datanode.api.v2.GetPartyActivityStreakRequest + (*GetPartyActivityStreakResponse)(nil), // 324: datanode.api.v2.GetPartyActivityStreakResponse + (*FundingPayment)(nil), // 325: datanode.api.v2.FundingPayment + (*ListFundingPaymentsRequest)(nil), // 326: datanode.api.v2.ListFundingPaymentsRequest + (*FundingPaymentEdge)(nil), // 327: datanode.api.v2.FundingPaymentEdge + (*FundingPaymentConnection)(nil), // 328: datanode.api.v2.FundingPaymentConnection + (*ListFundingPaymentsResponse)(nil), // 329: datanode.api.v2.ListFundingPaymentsResponse + (*ListFundingPeriodsRequest)(nil), // 330: datanode.api.v2.ListFundingPeriodsRequest + (*FundingPeriodEdge)(nil), // 331: datanode.api.v2.FundingPeriodEdge + (*FundingPeriodConnection)(nil), // 332: datanode.api.v2.FundingPeriodConnection + (*ListFundingPeriodsResponse)(nil), // 333: datanode.api.v2.ListFundingPeriodsResponse + (*ListFundingPeriodDataPointsRequest)(nil), // 334: datanode.api.v2.ListFundingPeriodDataPointsRequest + (*FundingPeriodDataPointEdge)(nil), // 335: datanode.api.v2.FundingPeriodDataPointEdge + (*FundingPeriodDataPointConnection)(nil), // 336: datanode.api.v2.FundingPeriodDataPointConnection + (*ListFundingPeriodDataPointsResponse)(nil), // 337: datanode.api.v2.ListFundingPeriodDataPointsResponse + (*PingRequest)(nil), // 338: datanode.api.v2.PingRequest + (*PingResponse)(nil), // 339: datanode.api.v2.PingResponse + (*OrderInfo)(nil), // 340: datanode.api.v2.OrderInfo + (*EstimatePositionRequest)(nil), // 341: datanode.api.v2.EstimatePositionRequest + (*EstimatePositionResponse)(nil), // 342: datanode.api.v2.EstimatePositionResponse + (*CollateralIncreaseEstimate)(nil), // 343: datanode.api.v2.CollateralIncreaseEstimate + (*MarginEstimate)(nil), // 344: datanode.api.v2.MarginEstimate + (*LiquidationEstimate)(nil), // 345: datanode.api.v2.LiquidationEstimate + (*LiquidationPrice)(nil), // 346: datanode.api.v2.LiquidationPrice + (*GetCurrentReferralProgramRequest)(nil), // 347: datanode.api.v2.GetCurrentReferralProgramRequest + (*GetCurrentReferralProgramResponse)(nil), // 348: datanode.api.v2.GetCurrentReferralProgramResponse + (*ReferralProgram)(nil), // 349: datanode.api.v2.ReferralProgram + (*ReferralSet)(nil), // 350: datanode.api.v2.ReferralSet + (*ReferralSetEdge)(nil), // 351: datanode.api.v2.ReferralSetEdge + (*ReferralSetConnection)(nil), // 352: datanode.api.v2.ReferralSetConnection + (*ListReferralSetsRequest)(nil), // 353: datanode.api.v2.ListReferralSetsRequest + (*ListReferralSetsResponse)(nil), // 354: datanode.api.v2.ListReferralSetsResponse + (*ReferralSetReferee)(nil), // 355: datanode.api.v2.ReferralSetReferee + (*ReferralSetRefereeEdge)(nil), // 356: datanode.api.v2.ReferralSetRefereeEdge + (*ReferralSetRefereeConnection)(nil), // 357: datanode.api.v2.ReferralSetRefereeConnection + (*ListReferralSetRefereesRequest)(nil), // 358: datanode.api.v2.ListReferralSetRefereesRequest + (*ListReferralSetRefereesResponse)(nil), // 359: datanode.api.v2.ListReferralSetRefereesResponse + (*GetReferralSetStatsRequest)(nil), // 360: datanode.api.v2.GetReferralSetStatsRequest + (*GetReferralSetStatsResponse)(nil), // 361: datanode.api.v2.GetReferralSetStatsResponse + (*ReferralSetStatsConnection)(nil), // 362: datanode.api.v2.ReferralSetStatsConnection + (*ReferralSetStatsEdge)(nil), // 363: datanode.api.v2.ReferralSetStatsEdge + (*ReferralSetStats)(nil), // 364: datanode.api.v2.ReferralSetStats + (*Team)(nil), // 365: datanode.api.v2.Team + (*TeamEdge)(nil), // 366: datanode.api.v2.TeamEdge + (*TeamConnection)(nil), // 367: datanode.api.v2.TeamConnection + (*ListTeamsRequest)(nil), // 368: datanode.api.v2.ListTeamsRequest + (*ListTeamsResponse)(nil), // 369: datanode.api.v2.ListTeamsResponse + (*ListTeamsStatisticsRequest)(nil), // 370: datanode.api.v2.ListTeamsStatisticsRequest + (*ListTeamsStatisticsResponse)(nil), // 371: datanode.api.v2.ListTeamsStatisticsResponse + (*TeamsStatisticsConnection)(nil), // 372: datanode.api.v2.TeamsStatisticsConnection + (*TeamStatisticsEdge)(nil), // 373: datanode.api.v2.TeamStatisticsEdge + (*TeamStatistics)(nil), // 374: datanode.api.v2.TeamStatistics + (*QuantumRewardsPerEpoch)(nil), // 375: datanode.api.v2.QuantumRewardsPerEpoch + (*QuantumVolumesPerEpoch)(nil), // 376: datanode.api.v2.QuantumVolumesPerEpoch + (*ListTeamMembersStatisticsRequest)(nil), // 377: datanode.api.v2.ListTeamMembersStatisticsRequest + (*ListTeamMembersStatisticsResponse)(nil), // 378: datanode.api.v2.ListTeamMembersStatisticsResponse + (*TeamMembersStatisticsConnection)(nil), // 379: datanode.api.v2.TeamMembersStatisticsConnection + (*TeamMemberStatisticsEdge)(nil), // 380: datanode.api.v2.TeamMemberStatisticsEdge + (*TeamMemberStatistics)(nil), // 381: datanode.api.v2.TeamMemberStatistics + (*ListTeamRefereesRequest)(nil), // 382: datanode.api.v2.ListTeamRefereesRequest + (*TeamReferee)(nil), // 383: datanode.api.v2.TeamReferee + (*TeamRefereeEdge)(nil), // 384: datanode.api.v2.TeamRefereeEdge + (*TeamRefereeConnection)(nil), // 385: datanode.api.v2.TeamRefereeConnection + (*ListTeamRefereesResponse)(nil), // 386: datanode.api.v2.ListTeamRefereesResponse + (*TeamRefereeHistory)(nil), // 387: datanode.api.v2.TeamRefereeHistory + (*TeamRefereeHistoryEdge)(nil), // 388: datanode.api.v2.TeamRefereeHistoryEdge + (*TeamRefereeHistoryConnection)(nil), // 389: datanode.api.v2.TeamRefereeHistoryConnection + (*ListTeamRefereeHistoryRequest)(nil), // 390: datanode.api.v2.ListTeamRefereeHistoryRequest + (*ListTeamRefereeHistoryResponse)(nil), // 391: datanode.api.v2.ListTeamRefereeHistoryResponse + (*GetFeesStatsRequest)(nil), // 392: datanode.api.v2.GetFeesStatsRequest + (*GetFeesStatsResponse)(nil), // 393: datanode.api.v2.GetFeesStatsResponse + (*GetFeesStatsForPartyRequest)(nil), // 394: datanode.api.v2.GetFeesStatsForPartyRequest + (*GetFeesStatsForPartyResponse)(nil), // 395: datanode.api.v2.GetFeesStatsForPartyResponse + (*GetCurrentVolumeDiscountProgramRequest)(nil), // 396: datanode.api.v2.GetCurrentVolumeDiscountProgramRequest + (*GetCurrentVolumeDiscountProgramResponse)(nil), // 397: datanode.api.v2.GetCurrentVolumeDiscountProgramResponse + (*GetVolumeDiscountStatsRequest)(nil), // 398: datanode.api.v2.GetVolumeDiscountStatsRequest + (*GetVolumeDiscountStatsResponse)(nil), // 399: datanode.api.v2.GetVolumeDiscountStatsResponse + (*VolumeDiscountStatsConnection)(nil), // 400: datanode.api.v2.VolumeDiscountStatsConnection + (*VolumeDiscountStatsEdge)(nil), // 401: datanode.api.v2.VolumeDiscountStatsEdge + (*VolumeDiscountStats)(nil), // 402: datanode.api.v2.VolumeDiscountStats + (*VolumeDiscountProgram)(nil), // 403: datanode.api.v2.VolumeDiscountProgram + (*FeesStatsForParty)(nil), // 404: datanode.api.v2.FeesStatsForParty + (*ObserveTransactionResultsRequest)(nil), // 405: datanode.api.v2.ObserveTransactionResultsRequest + (*ObserveTransactionResultsResponse)(nil), // 406: datanode.api.v2.ObserveTransactionResultsResponse + (*EstimateTransferFeeRequest)(nil), // 407: datanode.api.v2.EstimateTransferFeeRequest + (*EstimateTransferFeeResponse)(nil), // 408: datanode.api.v2.EstimateTransferFeeResponse + (*GetTotalTransferFeeDiscountRequest)(nil), // 409: datanode.api.v2.GetTotalTransferFeeDiscountRequest + (*GetTotalTransferFeeDiscountResponse)(nil), // 410: datanode.api.v2.GetTotalTransferFeeDiscountResponse + (*ListGamesRequest)(nil), // 411: datanode.api.v2.ListGamesRequest + (*ListGamesResponse)(nil), // 412: datanode.api.v2.ListGamesResponse + (*GamesConnection)(nil), // 413: datanode.api.v2.GamesConnection + (*GameEdge)(nil), // 414: datanode.api.v2.GameEdge + (*Game)(nil), // 415: datanode.api.v2.Game + (*TeamGameEntities)(nil), // 416: datanode.api.v2.TeamGameEntities + (*IndividualGameEntities)(nil), // 417: datanode.api.v2.IndividualGameEntities + (*TeamGameEntity)(nil), // 418: datanode.api.v2.TeamGameEntity + (*TeamGameParticipation)(nil), // 419: datanode.api.v2.TeamGameParticipation + (*IndividualGameEntity)(nil), // 420: datanode.api.v2.IndividualGameEntity + (*ListPartyMarginModesRequest)(nil), // 421: datanode.api.v2.ListPartyMarginModesRequest + (*ListPartyMarginModesResponse)(nil), // 422: datanode.api.v2.ListPartyMarginModesResponse + (*PartyMarginModesConnection)(nil), // 423: datanode.api.v2.PartyMarginModesConnection + (*PartyMarginModeEdge)(nil), // 424: datanode.api.v2.PartyMarginModeEdge + (*PartyMarginMode)(nil), // 425: datanode.api.v2.PartyMarginMode + (*TimeWeightedNotionalPosition)(nil), // 426: datanode.api.v2.TimeWeightedNotionalPosition + (*GetTimeWeightedNotionalPositionRequest)(nil), // 427: datanode.api.v2.GetTimeWeightedNotionalPositionRequest + (*GetTimeWeightedNotionalPositionResponse)(nil), // 428: datanode.api.v2.GetTimeWeightedNotionalPositionResponse + (*ListAMMsRequest)(nil), // 429: datanode.api.v2.ListAMMsRequest + (*ListAMMsResponse)(nil), // 430: datanode.api.v2.ListAMMsResponse + (*AMMConnection)(nil), // 431: datanode.api.v2.AMMConnection + (*AMMEdge)(nil), // 432: datanode.api.v2.AMMEdge + (*EstimateAMMBoundsRequest)(nil), // 433: datanode.api.v2.EstimateAMMBoundsRequest + (*EstimateAMMBoundsResponse)(nil), // 434: datanode.api.v2.EstimateAMMBoundsResponse + (*v1.PartyLockedBalance)(nil), // 435: vega.events.v1.PartyLockedBalance + (*v1.PartyVestingBalance)(nil), // 436: vega.events.v1.PartyVestingBalance + (vega.AccountType)(0), // 437: vega.AccountType + (*vega.Order)(nil), // 438: vega.Order + (vega.Order_Status)(0), // 439: vega.Order.Status + (vega.Order_Type)(0), // 440: vega.Order.Type + (vega.Order_TimeInForce)(0), // 441: vega.Order.TimeInForce + (*v1.StopOrderEvent)(nil), // 442: vega.events.v1.StopOrderEvent + (*v1.GameTeamScore)(nil), // 443: vega.events.v1.GameTeamScore + (*v1.GamePartyScore)(nil), // 444: vega.events.v1.GamePartyScore + (vega.StopOrder_Status)(0), // 445: vega.StopOrder.Status + (vega.StopOrder_ExpiryStrategy)(0), // 446: vega.StopOrder.ExpiryStrategy + (*vega.Position)(nil), // 447: vega.Position + (vega.TransferType)(0), // 448: vega.TransferType + (*vega.MarketDepth)(nil), // 449: vega.MarketDepth + (*vega.MarketDepthUpdate)(nil), // 450: vega.MarketDepthUpdate + (*vega.MarketData)(nil), // 451: vega.MarketData + (*vega.PriceLevel)(nil), // 452: vega.PriceLevel + (*vega.Trade)(nil), // 453: vega.Trade + (v1.Transfer_Status)(0), // 454: vega.events.v1.Transfer.Status + (*v1.Transfer)(nil), // 455: vega.events.v1.Transfer + (*v1.TransferFees)(nil), // 456: vega.events.v1.TransferFees + (*vega.NetworkLimits)(nil), // 457: vega.NetworkLimits + (*vega.Vote)(nil), // 458: vega.Vote + (*v1.ERC20MultiSigSignerAdded)(nil), // 459: vega.events.v1.ERC20MultiSigSignerAdded + (*v1.ERC20MultiSigSignerRemoved)(nil), // 460: vega.events.v1.ERC20MultiSigSignerRemoved + (*vega.OracleSpec)(nil), // 461: vega.OracleSpec + (*vega.OracleData)(nil), // 462: vega.OracleData + (*vega.Market)(nil), // 463: vega.Market + (*vega.GovernanceData)(nil), // 464: vega.GovernanceData + (*vega.Party)(nil), // 465: vega.Party + (*vega.PartyProfile)(nil), // 466: vega.PartyProfile + (*vega.MarginLevels)(nil), // 467: vega.MarginLevels + (*vega.Reward)(nil), // 468: vega.Reward + (*vega.RewardSummary)(nil), // 469: vega.RewardSummary + (*vega.EpochRewardSummary)(nil), // 470: vega.EpochRewardSummary + (*vega.Deposit)(nil), // 471: vega.Deposit + (*vega.Withdrawal)(nil), // 472: vega.Withdrawal + (*vega.Asset)(nil), // 473: vega.Asset + (*vega.LiquidityProvision)(nil), // 474: vega.LiquidityProvision + (*vega.LiquidityProviderFeeShare)(nil), // 475: vega.LiquidityProviderFeeShare + (*vega.LiquidityProviderSLA)(nil), // 476: vega.LiquidityProviderSLA + (*v1.PaidLiquidityFeesStats)(nil), // 477: vega.events.v1.PaidLiquidityFeesStats + (vega.Proposal_State)(0), // 478: vega.Proposal.State + (*vega.Delegation)(nil), // 479: vega.Delegation + (vega.NodeStatus)(0), // 480: vega.NodeStatus + (*vega.NodeData)(nil), // 481: vega.NodeData + (*vega.Node)(nil), // 482: vega.Node + (*v11.NodeSignature)(nil), // 483: vega.commands.v1.NodeSignature + (*vega.Epoch)(nil), // 484: vega.Epoch + (*vega.Fee)(nil), // 485: vega.Fee + (vega.Side)(0), // 486: vega.Side + (*vega.NetworkParameter)(nil), // 487: vega.NetworkParameter + (*v1.StakeLinking)(nil), // 488: vega.events.v1.StakeLinking + (*vega.RiskFactor)(nil), // 489: vega.RiskFactor + (v1.BusEventType)(0), // 490: vega.events.v1.BusEventType + (*v1.BusEvent)(nil), // 491: vega.events.v1.BusEvent + (*vega.LedgerMovement)(nil), // 492: vega.LedgerMovement + (*v1.KeyRotation)(nil), // 493: vega.events.v1.KeyRotation + (*v1.EthereumKeyRotation)(nil), // 494: vega.events.v1.EthereumKeyRotation + (v1.ProtocolUpgradeProposalStatus)(0), // 495: vega.events.v1.ProtocolUpgradeProposalStatus + (*v1.ProtocolUpgradeEvent)(nil), // 496: vega.events.v1.ProtocolUpgradeEvent + (*v1.CoreSnapshotData)(nil), // 497: vega.events.v1.CoreSnapshotData + (*vega.Account)(nil), // 498: vega.Account + (*vega.LedgerEntry)(nil), // 499: vega.LedgerEntry + (*vega.Proposal)(nil), // 500: vega.Proposal + (*v1.PartyActivityStreak)(nil), // 501: vega.events.v1.PartyActivityStreak + (*v1.FundingPeriod)(nil), // 502: vega.events.v1.FundingPeriod + (v1.FundingPeriodDataPoint_Source)(0), // 503: vega.events.v1.FundingPeriodDataPoint.Source + (*v1.FundingPeriodDataPoint)(nil), // 504: vega.events.v1.FundingPeriodDataPoint + (vega.MarginMode)(0), // 505: vega.MarginMode + (*vega.BenefitTier)(nil), // 506: vega.BenefitTier + (*vega.StakingTier)(nil), // 507: vega.StakingTier + (*v1.FeesStats)(nil), // 508: vega.events.v1.FeesStats + (*vega.VolumeBenefitTier)(nil), // 509: vega.VolumeBenefitTier + (*v1.TransactionResult)(nil), // 510: vega.events.v1.TransactionResult + (vega.EntityScope)(0), // 511: vega.EntityScope + (vega.DispatchMetric)(0), // 512: vega.DispatchMetric + (v1.AMM_Status)(0), // 513: vega.events.v1.AMM.Status + (*v1.AMM)(nil), // 514: vega.events.v1.AMM + (*httpbody.HttpBody)(nil), // 515: 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 - 65, // 3: datanode.api.v2.ListAccountsRequest.filter:type_name -> datanode.api.v2.AccountFilter + 435, // 0: datanode.api.v2.GetVestingBalancesSummaryResponse.locked_balances:type_name -> vega.events.v1.PartyLockedBalance + 436, // 1: datanode.api.v2.GetVestingBalancesSummaryResponse.vesting_balances:type_name -> vega.events.v1.PartyVestingBalance + 437, // 2: datanode.api.v2.AccountBalance.type:type_name -> vega.AccountType + 75, // 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 + 437, // 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 - 288, // 18: datanode.api.v2.OrderFilter.date_range:type_name -> datanode.api.v2.DateRange + 438, // 14: datanode.api.v2.GetOrderResponse.order:type_name -> vega.Order + 439, // 15: datanode.api.v2.OrderFilter.statuses:type_name -> vega.Order.Status + 440, // 16: datanode.api.v2.OrderFilter.types:type_name -> vega.Order.Type + 441, // 17: datanode.api.v2.OrderFilter.time_in_forces:type_name -> vega.Order.TimeInForce + 298, // 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 - 170, // 21: datanode.api.v2.ListOrdersResponse.orders:type_name -> datanode.api.v2.OrderConnection + 180, // 21: datanode.api.v2.ListOrdersResponse.orders:type_name -> datanode.api.v2.OrderConnection 6, // 22: datanode.api.v2.ListOrderVersionsRequest.pagination:type_name -> datanode.api.v2.Pagination - 170, // 23: datanode.api.v2.ListOrderVersionsResponse.orders:type_name -> datanode.api.v2.OrderConnection + 180, // 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 - 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 - 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 - 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 - 6, // 38: datanode.api.v2.ListPositionsRequest.pagination:type_name -> datanode.api.v2.Pagination - 47, // 39: datanode.api.v2.ListPositionsResponse.positions:type_name -> datanode.api.v2.PositionConnection - 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 - 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 - 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 - 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 - 288, // 59: datanode.api.v2.ExportLedgerEntriesRequest.date_range:type_name -> datanode.api.v2.DateRange - 58, // 60: datanode.api.v2.ListLedgerEntriesResponse.ledger_entries:type_name -> datanode.api.v2.AggregatedLedgerEntriesConnection - 53, // 61: datanode.api.v2.AggregatedLedgerEntriesEdge.node:type_name -> datanode.api.v2.AggregatedLedgerEntry - 57, // 62: datanode.api.v2.AggregatedLedgerEntriesConnection.edges:type_name -> datanode.api.v2.AggregatedLedgerEntriesEdge - 7, // 63: datanode.api.v2.AggregatedLedgerEntriesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 65, // 64: datanode.api.v2.ListBalanceChangesRequest.filter:type_name -> datanode.api.v2.AccountFilter - 6, // 65: datanode.api.v2.ListBalanceChangesRequest.pagination:type_name -> datanode.api.v2.Pagination - 288, // 66: datanode.api.v2.ListBalanceChangesRequest.date_range:type_name -> datanode.api.v2.DateRange - 64, // 67: datanode.api.v2.ListBalanceChangesResponse.balances:type_name -> datanode.api.v2.AggregatedBalanceConnection - 65, // 68: datanode.api.v2.GetBalanceHistoryRequest.filter:type_name -> datanode.api.v2.AccountFilter - 1, // 69: datanode.api.v2.GetBalanceHistoryRequest.group_by:type_name -> datanode.api.v2.AccountField - 6, // 70: datanode.api.v2.GetBalanceHistoryRequest.pagination:type_name -> datanode.api.v2.Pagination - 288, // 71: datanode.api.v2.GetBalanceHistoryRequest.date_range:type_name -> datanode.api.v2.DateRange - 64, // 72: datanode.api.v2.GetBalanceHistoryResponse.balances:type_name -> datanode.api.v2.AggregatedBalanceConnection - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 101, // 108: datanode.api.v2.ListCandleDataResponse.candles:type_name -> datanode.api.v2.CandleDataConnection - 95, // 109: datanode.api.v2.CandleEdge.node:type_name -> datanode.api.v2.Candle - 100, // 110: datanode.api.v2.CandleDataConnection.edges:type_name -> datanode.api.v2.CandleEdge - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 267, // 281: datanode.api.v2.ListCheckpointsResponse.checkpoints:type_name -> datanode.api.v2.CheckpointsConnection - 263, // 282: datanode.api.v2.CheckpointEdge.node:type_name -> datanode.api.v2.Checkpoint - 266, // 283: datanode.api.v2.CheckpointsConnection.edges:type_name -> datanode.api.v2.CheckpointEdge - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 7, // 350: datanode.api.v2.FundingPaymentConnection.page_info:type_name -> datanode.api.v2.PageInfo - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 6, // 381: datanode.api.v2.ListReferralSetsRequest.pagination:type_name -> datanode.api.v2.Pagination - 342, // 382: datanode.api.v2.ListReferralSetsResponse.referral_sets:type_name -> datanode.api.v2.ReferralSetConnection - 345, // 383: datanode.api.v2.ReferralSetRefereeEdge.node:type_name -> datanode.api.v2.ReferralSetReferee - 346, // 384: datanode.api.v2.ReferralSetRefereeConnection.edges:type_name -> datanode.api.v2.ReferralSetRefereeEdge - 7, // 385: datanode.api.v2.ReferralSetRefereeConnection.page_info:type_name -> datanode.api.v2.PageInfo - 6, // 386: datanode.api.v2.ListReferralSetRefereesRequest.pagination:type_name -> datanode.api.v2.Pagination - 347, // 387: datanode.api.v2.ListReferralSetRefereesResponse.referral_set_referees:type_name -> datanode.api.v2.ReferralSetRefereeConnection - 6, // 388: datanode.api.v2.GetReferralSetStatsRequest.pagination:type_name -> datanode.api.v2.Pagination - 352, // 389: datanode.api.v2.GetReferralSetStatsResponse.stats:type_name -> datanode.api.v2.ReferralSetStatsConnection - 353, // 390: datanode.api.v2.ReferralSetStatsConnection.edges:type_name -> datanode.api.v2.ReferralSetStatsEdge - 7, // 391: datanode.api.v2.ReferralSetStatsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 354, // 392: datanode.api.v2.ReferralSetStatsEdge.node:type_name -> datanode.api.v2.ReferralSetStats - 355, // 393: datanode.api.v2.TeamEdge.node:type_name -> datanode.api.v2.Team - 356, // 394: datanode.api.v2.TeamConnection.edges:type_name -> datanode.api.v2.TeamEdge - 7, // 395: datanode.api.v2.TeamConnection.page_info:type_name -> datanode.api.v2.PageInfo - 6, // 396: datanode.api.v2.ListTeamsRequest.pagination:type_name -> datanode.api.v2.Pagination - 357, // 397: datanode.api.v2.ListTeamsResponse.teams:type_name -> datanode.api.v2.TeamConnection - 6, // 398: datanode.api.v2.ListTeamsStatisticsRequest.pagination:type_name -> datanode.api.v2.Pagination - 362, // 399: datanode.api.v2.ListTeamsStatisticsResponse.statistics:type_name -> datanode.api.v2.TeamsStatisticsConnection - 363, // 400: datanode.api.v2.TeamsStatisticsConnection.edges:type_name -> datanode.api.v2.TeamStatisticsEdge - 7, // 401: datanode.api.v2.TeamsStatisticsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 364, // 402: datanode.api.v2.TeamStatisticsEdge.node:type_name -> datanode.api.v2.TeamStatistics - 365, // 403: datanode.api.v2.TeamStatistics.quantum_rewards:type_name -> datanode.api.v2.QuantumRewardsPerEpoch - 366, // 404: datanode.api.v2.TeamStatistics.quantum_volumes:type_name -> datanode.api.v2.QuantumVolumesPerEpoch - 6, // 405: datanode.api.v2.ListTeamMembersStatisticsRequest.pagination:type_name -> datanode.api.v2.Pagination - 369, // 406: datanode.api.v2.ListTeamMembersStatisticsResponse.statistics:type_name -> datanode.api.v2.TeamMembersStatisticsConnection - 370, // 407: datanode.api.v2.TeamMembersStatisticsConnection.edges:type_name -> datanode.api.v2.TeamMemberStatisticsEdge - 7, // 408: datanode.api.v2.TeamMembersStatisticsConnection.page_info:type_name -> datanode.api.v2.PageInfo - 371, // 409: datanode.api.v2.TeamMemberStatisticsEdge.node:type_name -> datanode.api.v2.TeamMemberStatistics - 365, // 410: datanode.api.v2.TeamMemberStatistics.quantum_rewards:type_name -> datanode.api.v2.QuantumRewardsPerEpoch - 366, // 411: datanode.api.v2.TeamMemberStatistics.quantum_volumes:type_name -> datanode.api.v2.QuantumVolumesPerEpoch - 6, // 412: datanode.api.v2.ListTeamRefereesRequest.pagination:type_name -> datanode.api.v2.Pagination - 373, // 413: datanode.api.v2.TeamRefereeEdge.node:type_name -> datanode.api.v2.TeamReferee - 374, // 414: datanode.api.v2.TeamRefereeConnection.edges:type_name -> datanode.api.v2.TeamRefereeEdge - 7, // 415: datanode.api.v2.TeamRefereeConnection.page_info:type_name -> datanode.api.v2.PageInfo - 375, // 416: datanode.api.v2.ListTeamRefereesResponse.team_referees:type_name -> datanode.api.v2.TeamRefereeConnection - 377, // 417: datanode.api.v2.TeamRefereeHistoryEdge.node:type_name -> datanode.api.v2.TeamRefereeHistory - 378, // 418: datanode.api.v2.TeamRefereeHistoryConnection.edges:type_name -> datanode.api.v2.TeamRefereeHistoryEdge - 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 - 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 - 390, // 426: datanode.api.v2.GetVolumeDiscountStatsResponse.stats:type_name -> datanode.api.v2.VolumeDiscountStatsConnection - 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 - 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 - 7, // 437: datanode.api.v2.GamesConnection.page_info:type_name -> datanode.api.v2.PageInfo - 405, // 438: datanode.api.v2.GameEdge.node:type_name -> datanode.api.v2.Game - 406, // 439: datanode.api.v2.Game.team:type_name -> datanode.api.v2.TeamGameEntities - 407, // 440: datanode.api.v2.Game.individual:type_name -> datanode.api.v2.IndividualGameEntities - 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 - 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 - 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 - 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 + 438, // 26: datanode.api.v2.OrderSnapshotPage.orders:type_name -> vega.Order + 438, // 27: datanode.api.v2.OrderUpdates.orders:type_name -> vega.Order + 442, // 28: datanode.api.v2.GetStopOrderResponse.order:type_name -> vega.events.v1.StopOrderEvent + 6, // 29: datanode.api.v2.ListGameTeamScoresRequest.pagination:type_name -> datanode.api.v2.Pagination + 37, // 30: datanode.api.v2.ListGameTeamScoresRequest.filter:type_name -> datanode.api.v2.GameTeamScoresFilter + 39, // 31: datanode.api.v2.ListGameTeamScoresResponse.team_scores:type_name -> datanode.api.v2.GameTeamScoresConnection + 40, // 32: datanode.api.v2.GameTeamScoresConnection.edges:type_name -> datanode.api.v2.GameTeamScoresEdge + 7, // 33: datanode.api.v2.GameTeamScoresConnection.page_info:type_name -> datanode.api.v2.PageInfo + 443, // 34: datanode.api.v2.GameTeamScoresEdge.node:type_name -> vega.events.v1.GameTeamScore + 6, // 35: datanode.api.v2.ListGamePartyScoresRequest.pagination:type_name -> datanode.api.v2.Pagination + 42, // 36: datanode.api.v2.ListGamePartyScoresRequest.filter:type_name -> datanode.api.v2.GamePartyScoresFilter + 44, // 37: datanode.api.v2.ListGamePartyScoresResponse.party_scores:type_name -> datanode.api.v2.GamePartyScoresConnection + 45, // 38: datanode.api.v2.GamePartyScoresConnection.edges:type_name -> datanode.api.v2.GamePartyScoresEdge + 7, // 39: datanode.api.v2.GamePartyScoresConnection.page_info:type_name -> datanode.api.v2.PageInfo + 444, // 40: datanode.api.v2.GamePartyScoresEdge.node:type_name -> vega.events.v1.GamePartyScore + 6, // 41: datanode.api.v2.ListStopOrdersRequest.pagination:type_name -> datanode.api.v2.Pagination + 47, // 42: datanode.api.v2.ListStopOrdersRequest.filter:type_name -> datanode.api.v2.StopOrderFilter + 445, // 43: datanode.api.v2.StopOrderFilter.statuses:type_name -> vega.StopOrder.Status + 446, // 44: datanode.api.v2.StopOrderFilter.expiry_strategies:type_name -> vega.StopOrder.ExpiryStrategy + 298, // 45: datanode.api.v2.StopOrderFilter.date_range:type_name -> datanode.api.v2.DateRange + 442, // 46: datanode.api.v2.StopOrderEdge.node:type_name -> vega.events.v1.StopOrderEvent + 48, // 47: datanode.api.v2.StopOrderConnection.edges:type_name -> datanode.api.v2.StopOrderEdge + 7, // 48: datanode.api.v2.StopOrderConnection.page_info:type_name -> datanode.api.v2.PageInfo + 49, // 49: datanode.api.v2.ListStopOrdersResponse.orders:type_name -> datanode.api.v2.StopOrderConnection + 6, // 50: datanode.api.v2.ListPositionsRequest.pagination:type_name -> datanode.api.v2.Pagination + 57, // 51: datanode.api.v2.ListPositionsResponse.positions:type_name -> datanode.api.v2.PositionConnection + 53, // 52: datanode.api.v2.ListAllPositionsRequest.filter:type_name -> datanode.api.v2.PositionsFilter + 6, // 53: datanode.api.v2.ListAllPositionsRequest.pagination:type_name -> datanode.api.v2.Pagination + 57, // 54: datanode.api.v2.ListAllPositionsResponse.positions:type_name -> datanode.api.v2.PositionConnection + 447, // 55: datanode.api.v2.PositionEdge.node:type_name -> vega.Position + 56, // 56: datanode.api.v2.PositionConnection.edges:type_name -> datanode.api.v2.PositionEdge + 7, // 57: datanode.api.v2.PositionConnection.page_info:type_name -> datanode.api.v2.PageInfo + 60, // 58: datanode.api.v2.ObservePositionsResponse.snapshot:type_name -> datanode.api.v2.PositionSnapshotPage + 61, // 59: datanode.api.v2.ObservePositionsResponse.updates:type_name -> datanode.api.v2.PositionUpdates + 447, // 60: datanode.api.v2.PositionSnapshotPage.positions:type_name -> vega.Position + 447, // 61: datanode.api.v2.PositionUpdates.positions:type_name -> vega.Position + 75, // 62: datanode.api.v2.LedgerEntryFilter.from_account_filter:type_name -> datanode.api.v2.AccountFilter + 75, // 63: datanode.api.v2.LedgerEntryFilter.to_account_filter:type_name -> datanode.api.v2.AccountFilter + 448, // 64: datanode.api.v2.LedgerEntryFilter.transfer_types:type_name -> vega.TransferType + 448, // 65: datanode.api.v2.AggregatedLedgerEntry.transfer_type:type_name -> vega.TransferType + 437, // 66: datanode.api.v2.AggregatedLedgerEntry.from_account_type:type_name -> vega.AccountType + 437, // 67: datanode.api.v2.AggregatedLedgerEntry.to_account_type:type_name -> vega.AccountType + 62, // 68: datanode.api.v2.ListLedgerEntriesRequest.filter:type_name -> datanode.api.v2.LedgerEntryFilter + 6, // 69: datanode.api.v2.ListLedgerEntriesRequest.pagination:type_name -> datanode.api.v2.Pagination + 298, // 70: datanode.api.v2.ListLedgerEntriesRequest.date_range:type_name -> datanode.api.v2.DateRange + 298, // 71: datanode.api.v2.ExportLedgerEntriesRequest.date_range:type_name -> datanode.api.v2.DateRange + 68, // 72: datanode.api.v2.ListLedgerEntriesResponse.ledger_entries:type_name -> datanode.api.v2.AggregatedLedgerEntriesConnection + 63, // 73: datanode.api.v2.AggregatedLedgerEntriesEdge.node:type_name -> datanode.api.v2.AggregatedLedgerEntry + 67, // 74: datanode.api.v2.AggregatedLedgerEntriesConnection.edges:type_name -> datanode.api.v2.AggregatedLedgerEntriesEdge + 7, // 75: datanode.api.v2.AggregatedLedgerEntriesConnection.page_info:type_name -> datanode.api.v2.PageInfo + 75, // 76: datanode.api.v2.ListBalanceChangesRequest.filter:type_name -> datanode.api.v2.AccountFilter + 6, // 77: datanode.api.v2.ListBalanceChangesRequest.pagination:type_name -> datanode.api.v2.Pagination + 298, // 78: datanode.api.v2.ListBalanceChangesRequest.date_range:type_name -> datanode.api.v2.DateRange + 74, // 79: datanode.api.v2.ListBalanceChangesResponse.balances:type_name -> datanode.api.v2.AggregatedBalanceConnection + 75, // 80: datanode.api.v2.GetBalanceHistoryRequest.filter:type_name -> datanode.api.v2.AccountFilter + 1, // 81: datanode.api.v2.GetBalanceHistoryRequest.group_by:type_name -> datanode.api.v2.AccountField + 6, // 82: datanode.api.v2.GetBalanceHistoryRequest.pagination:type_name -> datanode.api.v2.Pagination + 298, // 83: datanode.api.v2.GetBalanceHistoryRequest.date_range:type_name -> datanode.api.v2.DateRange + 74, // 84: datanode.api.v2.GetBalanceHistoryResponse.balances:type_name -> datanode.api.v2.AggregatedBalanceConnection + 76, // 85: datanode.api.v2.AggregatedBalanceEdge.node:type_name -> datanode.api.v2.AggregatedBalance + 73, // 86: datanode.api.v2.AggregatedBalanceConnection.edges:type_name -> datanode.api.v2.AggregatedBalanceEdge + 7, // 87: datanode.api.v2.AggregatedBalanceConnection.page_info:type_name -> datanode.api.v2.PageInfo + 437, // 88: datanode.api.v2.AccountFilter.account_types:type_name -> vega.AccountType + 437, // 89: datanode.api.v2.AggregatedBalance.account_type:type_name -> vega.AccountType + 449, // 90: datanode.api.v2.ObserveMarketsDepthResponse.market_depth:type_name -> vega.MarketDepth + 450, // 91: datanode.api.v2.ObserveMarketsDepthUpdatesResponse.update:type_name -> vega.MarketDepthUpdate + 451, // 92: datanode.api.v2.ObserveMarketsDataResponse.market_data:type_name -> vega.MarketData + 452, // 93: datanode.api.v2.GetLatestMarketDepthResponse.buy:type_name -> vega.PriceLevel + 452, // 94: datanode.api.v2.GetLatestMarketDepthResponse.sell:type_name -> vega.PriceLevel + 453, // 95: datanode.api.v2.GetLatestMarketDepthResponse.last_trade:type_name -> vega.Trade + 451, // 96: datanode.api.v2.ListLatestMarketDataResponse.markets_data:type_name -> vega.MarketData + 451, // 97: datanode.api.v2.GetLatestMarketDataResponse.market_data:type_name -> vega.MarketData + 6, // 98: datanode.api.v2.GetMarketDataHistoryByIDRequest.pagination:type_name -> datanode.api.v2.Pagination + 92, // 99: datanode.api.v2.GetMarketDataHistoryByIDResponse.market_data:type_name -> datanode.api.v2.MarketDataConnection + 451, // 100: datanode.api.v2.MarketDataEdge.node:type_name -> vega.MarketData + 91, // 101: datanode.api.v2.MarketDataConnection.edges:type_name -> datanode.api.v2.MarketDataEdge + 7, // 102: datanode.api.v2.MarketDataConnection.page_info:type_name -> datanode.api.v2.PageInfo + 2, // 103: datanode.api.v2.ListTransfersRequest.direction:type_name -> datanode.api.v2.TransferDirection + 6, // 104: datanode.api.v2.ListTransfersRequest.pagination:type_name -> datanode.api.v2.Pagination + 454, // 105: datanode.api.v2.ListTransfersRequest.status:type_name -> vega.events.v1.Transfer.Status + 4, // 106: datanode.api.v2.ListTransfersRequest.scope:type_name -> datanode.api.v2.ListTransfersRequest.Scope + 437, // 107: datanode.api.v2.ListTransfersRequest.from_account_type:type_name -> vega.AccountType + 437, // 108: datanode.api.v2.ListTransfersRequest.to_account_type:type_name -> vega.AccountType + 97, // 109: datanode.api.v2.ListTransfersResponse.transfers:type_name -> datanode.api.v2.TransferConnection + 455, // 110: datanode.api.v2.TransferNode.transfer:type_name -> vega.events.v1.Transfer + 456, // 111: datanode.api.v2.TransferNode.fees:type_name -> vega.events.v1.TransferFees + 95, // 112: datanode.api.v2.TransferEdge.node:type_name -> datanode.api.v2.TransferNode + 96, // 113: datanode.api.v2.TransferConnection.edges:type_name -> datanode.api.v2.TransferEdge + 7, // 114: datanode.api.v2.TransferConnection.page_info:type_name -> datanode.api.v2.PageInfo + 95, // 115: datanode.api.v2.GetTransferResponse.transfer_node:type_name -> datanode.api.v2.TransferNode + 457, // 116: datanode.api.v2.GetNetworkLimitsResponse.limits:type_name -> vega.NetworkLimits + 103, // 117: datanode.api.v2.ListCandleIntervalsResponse.interval_to_candle_id:type_name -> datanode.api.v2.IntervalToCandleId + 105, // 118: datanode.api.v2.ObserveCandleDataResponse.candle:type_name -> datanode.api.v2.Candle + 6, // 119: datanode.api.v2.ListCandleDataRequest.pagination:type_name -> datanode.api.v2.Pagination + 111, // 120: datanode.api.v2.ListCandleDataResponse.candles:type_name -> datanode.api.v2.CandleDataConnection + 105, // 121: datanode.api.v2.CandleEdge.node:type_name -> datanode.api.v2.Candle + 110, // 122: datanode.api.v2.CandleDataConnection.edges:type_name -> datanode.api.v2.CandleEdge + 7, // 123: datanode.api.v2.CandleDataConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 124: datanode.api.v2.ListVotesRequest.pagination:type_name -> datanode.api.v2.Pagination + 115, // 125: datanode.api.v2.ListVotesResponse.votes:type_name -> datanode.api.v2.VoteConnection + 458, // 126: datanode.api.v2.VoteEdge.node:type_name -> vega.Vote + 114, // 127: datanode.api.v2.VoteConnection.edges:type_name -> datanode.api.v2.VoteEdge + 7, // 128: datanode.api.v2.VoteConnection.page_info:type_name -> datanode.api.v2.PageInfo + 458, // 129: datanode.api.v2.ObserveVotesResponse.vote:type_name -> vega.Vote + 6, // 130: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest.pagination:type_name -> datanode.api.v2.Pagination + 122, // 131: datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse.bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedConnection + 459, // 132: datanode.api.v2.ERC20MultiSigSignerAddedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerAdded + 123, // 133: datanode.api.v2.ERC20MultiSigSignerAddedBundleEdge.node:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedBundle + 121, // 134: datanode.api.v2.ERC20MultiSigSignerAddedConnection.edges:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedBundleEdge + 7, // 135: datanode.api.v2.ERC20MultiSigSignerAddedConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 136: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest.pagination:type_name -> datanode.api.v2.Pagination + 128, // 137: datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse.bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedConnection + 460, // 138: datanode.api.v2.ERC20MultiSigSignerRemovedEdge.node:type_name -> vega.events.v1.ERC20MultiSigSignerRemoved + 129, // 139: datanode.api.v2.ERC20MultiSigSignerRemovedBundleEdge.node:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedBundle + 127, // 140: datanode.api.v2.ERC20MultiSigSignerRemovedConnection.edges:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedBundleEdge + 7, // 141: datanode.api.v2.ERC20MultiSigSignerRemovedConnection.page_info:type_name -> datanode.api.v2.PageInfo + 453, // 142: datanode.api.v2.GetLastTradeResponse.trade:type_name -> vega.Trade + 6, // 143: datanode.api.v2.ListTradesRequest.pagination:type_name -> datanode.api.v2.Pagination + 298, // 144: datanode.api.v2.ListTradesRequest.date_range:type_name -> datanode.api.v2.DateRange + 140, // 145: datanode.api.v2.ListTradesResponse.trades:type_name -> datanode.api.v2.TradeConnection + 141, // 146: datanode.api.v2.TradeConnection.edges:type_name -> datanode.api.v2.TradeEdge + 7, // 147: datanode.api.v2.TradeConnection.page_info:type_name -> datanode.api.v2.PageInfo + 453, // 148: datanode.api.v2.TradeEdge.node:type_name -> vega.Trade + 453, // 149: datanode.api.v2.ObserveTradesResponse.trades:type_name -> vega.Trade + 461, // 150: datanode.api.v2.GetOracleSpecResponse.oracle_spec:type_name -> vega.OracleSpec + 6, // 151: datanode.api.v2.ListOracleSpecsRequest.pagination:type_name -> datanode.api.v2.Pagination + 151, // 152: datanode.api.v2.ListOracleSpecsResponse.oracle_specs:type_name -> datanode.api.v2.OracleSpecsConnection + 6, // 153: datanode.api.v2.ListOracleDataRequest.pagination:type_name -> datanode.api.v2.Pagination + 153, // 154: datanode.api.v2.ListOracleDataResponse.oracle_data:type_name -> datanode.api.v2.OracleDataConnection + 461, // 155: datanode.api.v2.OracleSpecEdge.node:type_name -> vega.OracleSpec + 150, // 156: datanode.api.v2.OracleSpecsConnection.edges:type_name -> datanode.api.v2.OracleSpecEdge + 7, // 157: datanode.api.v2.OracleSpecsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 462, // 158: datanode.api.v2.OracleDataEdge.node:type_name -> vega.OracleData + 152, // 159: datanode.api.v2.OracleDataConnection.edges:type_name -> datanode.api.v2.OracleDataEdge + 7, // 160: datanode.api.v2.OracleDataConnection.page_info:type_name -> datanode.api.v2.PageInfo + 463, // 161: datanode.api.v2.GetMarketResponse.market:type_name -> vega.Market + 6, // 162: datanode.api.v2.ListMarketsRequest.pagination:type_name -> datanode.api.v2.Pagination + 159, // 163: datanode.api.v2.ListMarketsResponse.markets:type_name -> datanode.api.v2.MarketConnection + 463, // 164: datanode.api.v2.MarketEdge.node:type_name -> vega.Market + 158, // 165: datanode.api.v2.MarketConnection.edges:type_name -> datanode.api.v2.MarketEdge + 7, // 166: datanode.api.v2.MarketConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 167: datanode.api.v2.ListSuccessorMarketsRequest.pagination:type_name -> datanode.api.v2.Pagination + 463, // 168: datanode.api.v2.SuccessorMarket.market:type_name -> vega.Market + 464, // 169: datanode.api.v2.SuccessorMarket.proposals:type_name -> vega.GovernanceData + 161, // 170: datanode.api.v2.SuccessorMarketEdge.node:type_name -> datanode.api.v2.SuccessorMarket + 162, // 171: datanode.api.v2.SuccessorMarketConnection.edges:type_name -> datanode.api.v2.SuccessorMarketEdge + 7, // 172: datanode.api.v2.SuccessorMarketConnection.page_info:type_name -> datanode.api.v2.PageInfo + 163, // 173: datanode.api.v2.ListSuccessorMarketsResponse.successor_markets:type_name -> datanode.api.v2.SuccessorMarketConnection + 465, // 174: datanode.api.v2.GetPartyResponse.party:type_name -> vega.Party + 6, // 175: datanode.api.v2.ListPartiesRequest.pagination:type_name -> datanode.api.v2.Pagination + 170, // 176: datanode.api.v2.ListPartiesResponse.parties:type_name -> datanode.api.v2.PartyConnection + 465, // 177: datanode.api.v2.PartyEdge.node:type_name -> vega.Party + 169, // 178: datanode.api.v2.PartyConnection.edges:type_name -> datanode.api.v2.PartyEdge + 7, // 179: datanode.api.v2.PartyConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 180: datanode.api.v2.ListPartiesProfilesRequest.pagination:type_name -> datanode.api.v2.Pagination + 174, // 181: datanode.api.v2.ListPartiesProfilesResponse.profiles:type_name -> datanode.api.v2.PartiesProfilesConnection + 466, // 182: datanode.api.v2.PartyProfileEdge.node:type_name -> vega.PartyProfile + 173, // 183: datanode.api.v2.PartiesProfilesConnection.edges:type_name -> datanode.api.v2.PartyProfileEdge + 7, // 184: datanode.api.v2.PartiesProfilesConnection.page_info:type_name -> datanode.api.v2.PageInfo + 438, // 185: datanode.api.v2.OrderEdge.node:type_name -> vega.Order + 6, // 186: datanode.api.v2.ListMarginLevelsRequest.pagination:type_name -> datanode.api.v2.Pagination + 182, // 187: datanode.api.v2.ListMarginLevelsResponse.margin_levels:type_name -> datanode.api.v2.MarginConnection + 467, // 188: datanode.api.v2.ObserveMarginLevelsResponse.margin_levels:type_name -> vega.MarginLevels + 175, // 189: datanode.api.v2.OrderConnection.edges:type_name -> datanode.api.v2.OrderEdge + 7, // 190: datanode.api.v2.OrderConnection.page_info:type_name -> datanode.api.v2.PageInfo + 467, // 191: datanode.api.v2.MarginEdge.node:type_name -> vega.MarginLevels + 181, // 192: datanode.api.v2.MarginConnection.edges:type_name -> datanode.api.v2.MarginEdge + 7, // 193: datanode.api.v2.MarginConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 194: datanode.api.v2.ListRewardsRequest.pagination:type_name -> datanode.api.v2.Pagination + 186, // 195: datanode.api.v2.ListRewardsResponse.rewards:type_name -> datanode.api.v2.RewardsConnection + 468, // 196: datanode.api.v2.RewardEdge.node:type_name -> vega.Reward + 185, // 197: datanode.api.v2.RewardsConnection.edges:type_name -> datanode.api.v2.RewardEdge + 7, // 198: datanode.api.v2.RewardsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 199: datanode.api.v2.ListRewardSummariesRequest.pagination:type_name -> datanode.api.v2.Pagination + 469, // 200: datanode.api.v2.ListRewardSummariesResponse.summaries:type_name -> vega.RewardSummary + 189, // 201: datanode.api.v2.ListEpochRewardSummariesRequest.filter:type_name -> datanode.api.v2.RewardSummaryFilter + 6, // 202: datanode.api.v2.ListEpochRewardSummariesRequest.pagination:type_name -> datanode.api.v2.Pagination + 192, // 203: datanode.api.v2.ListEpochRewardSummariesResponse.summaries:type_name -> datanode.api.v2.EpochRewardSummaryConnection + 193, // 204: datanode.api.v2.EpochRewardSummaryConnection.edges:type_name -> datanode.api.v2.EpochRewardSummaryEdge + 7, // 205: datanode.api.v2.EpochRewardSummaryConnection.page_info:type_name -> datanode.api.v2.PageInfo + 470, // 206: datanode.api.v2.EpochRewardSummaryEdge.node:type_name -> vega.EpochRewardSummary + 468, // 207: datanode.api.v2.ObserveRewardsResponse.reward:type_name -> vega.Reward + 471, // 208: datanode.api.v2.GetDepositResponse.deposit:type_name -> vega.Deposit + 6, // 209: datanode.api.v2.ListDepositsRequest.pagination:type_name -> datanode.api.v2.Pagination + 298, // 210: datanode.api.v2.ListDepositsRequest.date_range:type_name -> datanode.api.v2.DateRange + 201, // 211: datanode.api.v2.ListDepositsResponse.deposits:type_name -> datanode.api.v2.DepositsConnection + 471, // 212: datanode.api.v2.DepositEdge.node:type_name -> vega.Deposit + 200, // 213: datanode.api.v2.DepositsConnection.edges:type_name -> datanode.api.v2.DepositEdge + 7, // 214: datanode.api.v2.DepositsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 472, // 215: datanode.api.v2.GetWithdrawalResponse.withdrawal:type_name -> vega.Withdrawal + 6, // 216: datanode.api.v2.ListWithdrawalsRequest.pagination:type_name -> datanode.api.v2.Pagination + 298, // 217: datanode.api.v2.ListWithdrawalsRequest.date_range:type_name -> datanode.api.v2.DateRange + 207, // 218: datanode.api.v2.ListWithdrawalsResponse.withdrawals:type_name -> datanode.api.v2.WithdrawalsConnection + 472, // 219: datanode.api.v2.WithdrawalEdge.node:type_name -> vega.Withdrawal + 206, // 220: datanode.api.v2.WithdrawalsConnection.edges:type_name -> datanode.api.v2.WithdrawalEdge + 7, // 221: datanode.api.v2.WithdrawalsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 473, // 222: datanode.api.v2.GetAssetResponse.asset:type_name -> vega.Asset + 6, // 223: datanode.api.v2.ListAssetsRequest.pagination:type_name -> datanode.api.v2.Pagination + 213, // 224: datanode.api.v2.ListAssetsResponse.assets:type_name -> datanode.api.v2.AssetsConnection + 473, // 225: datanode.api.v2.AssetEdge.node:type_name -> vega.Asset + 212, // 226: datanode.api.v2.AssetsConnection.edges:type_name -> datanode.api.v2.AssetEdge + 7, // 227: datanode.api.v2.AssetsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 228: datanode.api.v2.ListLiquidityProvisionsRequest.pagination:type_name -> datanode.api.v2.Pagination + 6, // 229: datanode.api.v2.ListAllLiquidityProvisionsRequest.pagination:type_name -> datanode.api.v2.Pagination + 221, // 230: datanode.api.v2.ListLiquidityProvisionsResponse.liquidity_provisions:type_name -> datanode.api.v2.LiquidityProvisionsConnection + 222, // 231: datanode.api.v2.ListAllLiquidityProvisionsResponse.liquidity_provisions:type_name -> datanode.api.v2.LiquidityProvisionsWithPendingConnection + 474, // 232: datanode.api.v2.LiquidityProvision.current:type_name -> vega.LiquidityProvision + 474, // 233: datanode.api.v2.LiquidityProvision.pending:type_name -> vega.LiquidityProvision + 474, // 234: datanode.api.v2.LiquidityProvisionsEdge.node:type_name -> vega.LiquidityProvision + 218, // 235: datanode.api.v2.LiquidityProvisionWithPendingEdge.node:type_name -> datanode.api.v2.LiquidityProvision + 219, // 236: datanode.api.v2.LiquidityProvisionsConnection.edges:type_name -> datanode.api.v2.LiquidityProvisionsEdge + 7, // 237: datanode.api.v2.LiquidityProvisionsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 220, // 238: datanode.api.v2.LiquidityProvisionsWithPendingConnection.edges:type_name -> datanode.api.v2.LiquidityProvisionWithPendingEdge + 7, // 239: datanode.api.v2.LiquidityProvisionsWithPendingConnection.page_info:type_name -> datanode.api.v2.PageInfo + 474, // 240: datanode.api.v2.ObserveLiquidityProvisionsResponse.liquidity_provisions:type_name -> vega.LiquidityProvision + 6, // 241: datanode.api.v2.ListLiquidityProvidersRequest.pagination:type_name -> datanode.api.v2.Pagination + 475, // 242: datanode.api.v2.LiquidityProvider.fee_share:type_name -> vega.LiquidityProviderFeeShare + 476, // 243: datanode.api.v2.LiquidityProvider.sla:type_name -> vega.LiquidityProviderSLA + 226, // 244: datanode.api.v2.LiquidityProviderEdge.node:type_name -> datanode.api.v2.LiquidityProvider + 227, // 245: datanode.api.v2.LiquidityProviderConnection.edges:type_name -> datanode.api.v2.LiquidityProviderEdge + 7, // 246: datanode.api.v2.LiquidityProviderConnection.page_info:type_name -> datanode.api.v2.PageInfo + 228, // 247: datanode.api.v2.ListLiquidityProvidersResponse.liquidity_providers:type_name -> datanode.api.v2.LiquidityProviderConnection + 6, // 248: datanode.api.v2.ListPaidLiquidityFeesRequest.pagination:type_name -> datanode.api.v2.Pagination + 233, // 249: datanode.api.v2.ListPaidLiquidityFeesResponse.paid_liquidity_fees:type_name -> datanode.api.v2.PaidLiquidityFeesConnection + 477, // 250: datanode.api.v2.PaidLiquidityFeesEdge.node:type_name -> vega.events.v1.PaidLiquidityFeesStats + 232, // 251: datanode.api.v2.PaidLiquidityFeesConnection.edges:type_name -> datanode.api.v2.PaidLiquidityFeesEdge + 7, // 252: datanode.api.v2.PaidLiquidityFeesConnection.page_info:type_name -> datanode.api.v2.PageInfo + 464, // 253: datanode.api.v2.GetGovernanceDataResponse.data:type_name -> vega.GovernanceData + 478, // 254: datanode.api.v2.ListGovernanceDataRequest.proposal_state:type_name -> vega.Proposal.State + 5, // 255: datanode.api.v2.ListGovernanceDataRequest.proposal_type:type_name -> datanode.api.v2.ListGovernanceDataRequest.Type + 6, // 256: datanode.api.v2.ListGovernanceDataRequest.pagination:type_name -> datanode.api.v2.Pagination + 239, // 257: datanode.api.v2.ListGovernanceDataResponse.connection:type_name -> datanode.api.v2.GovernanceDataConnection + 464, // 258: datanode.api.v2.GovernanceDataEdge.node:type_name -> vega.GovernanceData + 238, // 259: datanode.api.v2.GovernanceDataConnection.edges:type_name -> datanode.api.v2.GovernanceDataEdge + 7, // 260: datanode.api.v2.GovernanceDataConnection.page_info:type_name -> datanode.api.v2.PageInfo + 464, // 261: datanode.api.v2.ObserveGovernanceResponse.data:type_name -> vega.GovernanceData + 6, // 262: datanode.api.v2.ListDelegationsRequest.pagination:type_name -> datanode.api.v2.Pagination + 245, // 263: datanode.api.v2.ListDelegationsResponse.delegations:type_name -> datanode.api.v2.DelegationsConnection + 479, // 264: datanode.api.v2.DelegationEdge.node:type_name -> vega.Delegation + 244, // 265: datanode.api.v2.DelegationsConnection.edges:type_name -> datanode.api.v2.DelegationEdge + 7, // 266: datanode.api.v2.DelegationsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 479, // 267: datanode.api.v2.ObserveDelegationsResponse.delegation:type_name -> vega.Delegation + 480, // 268: datanode.api.v2.NodeBasic.status:type_name -> vega.NodeStatus + 481, // 269: datanode.api.v2.GetNetworkDataResponse.node_data:type_name -> vega.NodeData + 482, // 270: datanode.api.v2.GetNodeResponse.node:type_name -> vega.Node + 6, // 271: datanode.api.v2.ListNodesRequest.pagination:type_name -> datanode.api.v2.Pagination + 256, // 272: datanode.api.v2.ListNodesResponse.nodes:type_name -> datanode.api.v2.NodesConnection + 482, // 273: datanode.api.v2.NodeEdge.node:type_name -> vega.Node + 255, // 274: datanode.api.v2.NodesConnection.edges:type_name -> datanode.api.v2.NodeEdge + 7, // 275: datanode.api.v2.NodesConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 276: datanode.api.v2.ListNodeSignaturesRequest.pagination:type_name -> datanode.api.v2.Pagination + 260, // 277: datanode.api.v2.ListNodeSignaturesResponse.signatures:type_name -> datanode.api.v2.NodeSignaturesConnection + 483, // 278: datanode.api.v2.NodeSignatureEdge.node:type_name -> vega.commands.v1.NodeSignature + 259, // 279: datanode.api.v2.NodeSignaturesConnection.edges:type_name -> datanode.api.v2.NodeSignatureEdge + 7, // 280: datanode.api.v2.NodeSignaturesConnection.page_info:type_name -> datanode.api.v2.PageInfo + 484, // 281: datanode.api.v2.GetEpochResponse.epoch:type_name -> vega.Epoch + 485, // 282: datanode.api.v2.EstimateFeeResponse.fee:type_name -> vega.Fee + 486, // 283: datanode.api.v2.EstimateMarginRequest.side:type_name -> vega.Side + 440, // 284: datanode.api.v2.EstimateMarginRequest.type:type_name -> vega.Order.Type + 467, // 285: datanode.api.v2.EstimateMarginResponse.margin_levels:type_name -> vega.MarginLevels + 6, // 286: datanode.api.v2.ListNetworkParametersRequest.pagination:type_name -> datanode.api.v2.Pagination + 272, // 287: datanode.api.v2.ListNetworkParametersResponse.network_parameters:type_name -> datanode.api.v2.NetworkParameterConnection + 487, // 288: datanode.api.v2.GetNetworkParameterResponse.network_parameter:type_name -> vega.NetworkParameter + 487, // 289: datanode.api.v2.NetworkParameterEdge.node:type_name -> vega.NetworkParameter + 271, // 290: datanode.api.v2.NetworkParameterConnection.edges:type_name -> datanode.api.v2.NetworkParameterEdge + 7, // 291: datanode.api.v2.NetworkParameterConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 292: datanode.api.v2.ListCheckpointsRequest.pagination:type_name -> datanode.api.v2.Pagination + 277, // 293: datanode.api.v2.ListCheckpointsResponse.checkpoints:type_name -> datanode.api.v2.CheckpointsConnection + 273, // 294: datanode.api.v2.CheckpointEdge.node:type_name -> datanode.api.v2.Checkpoint + 276, // 295: datanode.api.v2.CheckpointsConnection.edges:type_name -> datanode.api.v2.CheckpointEdge + 7, // 296: datanode.api.v2.CheckpointsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 297: datanode.api.v2.GetStakeRequest.pagination:type_name -> datanode.api.v2.Pagination + 281, // 298: datanode.api.v2.GetStakeResponse.stake_linkings:type_name -> datanode.api.v2.StakesConnection + 488, // 299: datanode.api.v2.StakeLinkingEdge.node:type_name -> vega.events.v1.StakeLinking + 280, // 300: datanode.api.v2.StakesConnection.edges:type_name -> datanode.api.v2.StakeLinkingEdge + 7, // 301: datanode.api.v2.StakesConnection.page_info:type_name -> datanode.api.v2.PageInfo + 489, // 302: datanode.api.v2.GetRiskFactorsResponse.risk_factor:type_name -> vega.RiskFactor + 490, // 303: datanode.api.v2.ObserveEventBusRequest.type:type_name -> vega.events.v1.BusEventType + 491, // 304: datanode.api.v2.ObserveEventBusResponse.events:type_name -> vega.events.v1.BusEvent + 492, // 305: datanode.api.v2.ObserveLedgerMovementsResponse.ledger_movement:type_name -> vega.LedgerMovement + 6, // 306: datanode.api.v2.ListKeyRotationsRequest.pagination:type_name -> datanode.api.v2.Pagination + 291, // 307: datanode.api.v2.ListKeyRotationsResponse.rotations:type_name -> datanode.api.v2.KeyRotationConnection + 493, // 308: datanode.api.v2.KeyRotationEdge.node:type_name -> vega.events.v1.KeyRotation + 290, // 309: datanode.api.v2.KeyRotationConnection.edges:type_name -> datanode.api.v2.KeyRotationEdge + 7, // 310: datanode.api.v2.KeyRotationConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 311: datanode.api.v2.ListEthereumKeyRotationsRequest.pagination:type_name -> datanode.api.v2.Pagination + 294, // 312: datanode.api.v2.ListEthereumKeyRotationsResponse.key_rotations:type_name -> datanode.api.v2.EthereumKeyRotationsConnection + 295, // 313: datanode.api.v2.EthereumKeyRotationsConnection.edges:type_name -> datanode.api.v2.EthereumKeyRotationEdge + 7, // 314: datanode.api.v2.EthereumKeyRotationsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 494, // 315: datanode.api.v2.EthereumKeyRotationEdge.node:type_name -> vega.events.v1.EthereumKeyRotation + 495, // 316: datanode.api.v2.ListProtocolUpgradeProposalsRequest.status:type_name -> vega.events.v1.ProtocolUpgradeProposalStatus + 6, // 317: datanode.api.v2.ListProtocolUpgradeProposalsRequest.pagination:type_name -> datanode.api.v2.Pagination + 303, // 318: datanode.api.v2.ListProtocolUpgradeProposalsResponse.protocol_upgrade_proposals:type_name -> datanode.api.v2.ProtocolUpgradeProposalConnection + 304, // 319: datanode.api.v2.ProtocolUpgradeProposalConnection.edges:type_name -> datanode.api.v2.ProtocolUpgradeProposalEdge + 7, // 320: datanode.api.v2.ProtocolUpgradeProposalConnection.page_info:type_name -> datanode.api.v2.PageInfo + 496, // 321: datanode.api.v2.ProtocolUpgradeProposalEdge.node:type_name -> vega.events.v1.ProtocolUpgradeEvent + 6, // 322: datanode.api.v2.ListCoreSnapshotsRequest.pagination:type_name -> datanode.api.v2.Pagination + 307, // 323: datanode.api.v2.ListCoreSnapshotsResponse.core_snapshots:type_name -> datanode.api.v2.CoreSnapshotConnection + 308, // 324: datanode.api.v2.CoreSnapshotConnection.edges:type_name -> datanode.api.v2.CoreSnapshotEdge + 7, // 325: datanode.api.v2.CoreSnapshotConnection.page_info:type_name -> datanode.api.v2.PageInfo + 497, // 326: datanode.api.v2.CoreSnapshotEdge.node:type_name -> vega.events.v1.CoreSnapshotData + 309, // 327: datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse.segment:type_name -> datanode.api.v2.HistorySegment + 309, // 328: datanode.api.v2.ListAllNetworkHistorySegmentsResponse.segments:type_name -> datanode.api.v2.HistorySegment + 3, // 329: datanode.api.v2.ExportNetworkHistoryRequest.table:type_name -> datanode.api.v2.Table + 498, // 330: datanode.api.v2.ListEntitiesResponse.accounts:type_name -> vega.Account + 438, // 331: datanode.api.v2.ListEntitiesResponse.orders:type_name -> vega.Order + 447, // 332: datanode.api.v2.ListEntitiesResponse.positions:type_name -> vega.Position + 499, // 333: datanode.api.v2.ListEntitiesResponse.ledger_entries:type_name -> vega.LedgerEntry + 12, // 334: datanode.api.v2.ListEntitiesResponse.balance_changes:type_name -> datanode.api.v2.AccountBalance + 455, // 335: datanode.api.v2.ListEntitiesResponse.transfers:type_name -> vega.events.v1.Transfer + 458, // 336: datanode.api.v2.ListEntitiesResponse.votes:type_name -> vega.Vote + 123, // 337: datanode.api.v2.ListEntitiesResponse.erc20_multi_sig_signer_added_bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerAddedBundle + 129, // 338: datanode.api.v2.ListEntitiesResponse.erc20_multi_sig_signer_removed_bundles:type_name -> datanode.api.v2.ERC20MultiSigSignerRemovedBundle + 453, // 339: datanode.api.v2.ListEntitiesResponse.trades:type_name -> vega.Trade + 461, // 340: datanode.api.v2.ListEntitiesResponse.oracle_specs:type_name -> vega.OracleSpec + 462, // 341: datanode.api.v2.ListEntitiesResponse.oracle_data:type_name -> vega.OracleData + 463, // 342: datanode.api.v2.ListEntitiesResponse.markets:type_name -> vega.Market + 465, // 343: datanode.api.v2.ListEntitiesResponse.parties:type_name -> vega.Party + 467, // 344: datanode.api.v2.ListEntitiesResponse.margin_levels:type_name -> vega.MarginLevels + 468, // 345: datanode.api.v2.ListEntitiesResponse.rewards:type_name -> vega.Reward + 471, // 346: datanode.api.v2.ListEntitiesResponse.deposits:type_name -> vega.Deposit + 472, // 347: datanode.api.v2.ListEntitiesResponse.withdrawals:type_name -> vega.Withdrawal + 473, // 348: datanode.api.v2.ListEntitiesResponse.assets:type_name -> vega.Asset + 474, // 349: datanode.api.v2.ListEntitiesResponse.liquidity_provisions:type_name -> vega.LiquidityProvision + 500, // 350: datanode.api.v2.ListEntitiesResponse.proposals:type_name -> vega.Proposal + 479, // 351: datanode.api.v2.ListEntitiesResponse.delegations:type_name -> vega.Delegation + 248, // 352: datanode.api.v2.ListEntitiesResponse.nodes:type_name -> datanode.api.v2.NodeBasic + 483, // 353: datanode.api.v2.ListEntitiesResponse.node_signatures:type_name -> vega.commands.v1.NodeSignature + 487, // 354: datanode.api.v2.ListEntitiesResponse.network_parameters:type_name -> vega.NetworkParameter + 493, // 355: datanode.api.v2.ListEntitiesResponse.key_rotations:type_name -> vega.events.v1.KeyRotation + 494, // 356: datanode.api.v2.ListEntitiesResponse.ethereum_key_rotations:type_name -> vega.events.v1.EthereumKeyRotation + 496, // 357: datanode.api.v2.ListEntitiesResponse.protocol_upgrade_proposals:type_name -> vega.events.v1.ProtocolUpgradeEvent + 501, // 358: datanode.api.v2.GetPartyActivityStreakResponse.activity_streak:type_name -> vega.events.v1.PartyActivityStreak + 6, // 359: datanode.api.v2.ListFundingPaymentsRequest.pagination:type_name -> datanode.api.v2.Pagination + 325, // 360: datanode.api.v2.FundingPaymentEdge.node:type_name -> datanode.api.v2.FundingPayment + 327, // 361: datanode.api.v2.FundingPaymentConnection.edges:type_name -> datanode.api.v2.FundingPaymentEdge + 7, // 362: datanode.api.v2.FundingPaymentConnection.page_info:type_name -> datanode.api.v2.PageInfo + 328, // 363: datanode.api.v2.ListFundingPaymentsResponse.funding_payments:type_name -> datanode.api.v2.FundingPaymentConnection + 298, // 364: datanode.api.v2.ListFundingPeriodsRequest.date_range:type_name -> datanode.api.v2.DateRange + 6, // 365: datanode.api.v2.ListFundingPeriodsRequest.pagination:type_name -> datanode.api.v2.Pagination + 502, // 366: datanode.api.v2.FundingPeriodEdge.node:type_name -> vega.events.v1.FundingPeriod + 331, // 367: datanode.api.v2.FundingPeriodConnection.edges:type_name -> datanode.api.v2.FundingPeriodEdge + 7, // 368: datanode.api.v2.FundingPeriodConnection.page_info:type_name -> datanode.api.v2.PageInfo + 332, // 369: datanode.api.v2.ListFundingPeriodsResponse.funding_periods:type_name -> datanode.api.v2.FundingPeriodConnection + 298, // 370: datanode.api.v2.ListFundingPeriodDataPointsRequest.date_range:type_name -> datanode.api.v2.DateRange + 503, // 371: datanode.api.v2.ListFundingPeriodDataPointsRequest.source:type_name -> vega.events.v1.FundingPeriodDataPoint.Source + 6, // 372: datanode.api.v2.ListFundingPeriodDataPointsRequest.pagination:type_name -> datanode.api.v2.Pagination + 504, // 373: datanode.api.v2.FundingPeriodDataPointEdge.node:type_name -> vega.events.v1.FundingPeriodDataPoint + 335, // 374: datanode.api.v2.FundingPeriodDataPointConnection.edges:type_name -> datanode.api.v2.FundingPeriodDataPointEdge + 7, // 375: datanode.api.v2.FundingPeriodDataPointConnection.page_info:type_name -> datanode.api.v2.PageInfo + 336, // 376: datanode.api.v2.ListFundingPeriodDataPointsResponse.funding_period_data_points:type_name -> datanode.api.v2.FundingPeriodDataPointConnection + 486, // 377: datanode.api.v2.OrderInfo.side:type_name -> vega.Side + 340, // 378: datanode.api.v2.EstimatePositionRequest.orders:type_name -> datanode.api.v2.OrderInfo + 505, // 379: datanode.api.v2.EstimatePositionRequest.margin_mode:type_name -> vega.MarginMode + 344, // 380: datanode.api.v2.EstimatePositionResponse.margin:type_name -> datanode.api.v2.MarginEstimate + 343, // 381: datanode.api.v2.EstimatePositionResponse.collateral_increase_estimate:type_name -> datanode.api.v2.CollateralIncreaseEstimate + 345, // 382: datanode.api.v2.EstimatePositionResponse.liquidation:type_name -> datanode.api.v2.LiquidationEstimate + 467, // 383: datanode.api.v2.MarginEstimate.worst_case:type_name -> vega.MarginLevels + 467, // 384: datanode.api.v2.MarginEstimate.best_case:type_name -> vega.MarginLevels + 346, // 385: datanode.api.v2.LiquidationEstimate.worst_case:type_name -> datanode.api.v2.LiquidationPrice + 346, // 386: datanode.api.v2.LiquidationEstimate.best_case:type_name -> datanode.api.v2.LiquidationPrice + 349, // 387: datanode.api.v2.GetCurrentReferralProgramResponse.current_referral_program:type_name -> datanode.api.v2.ReferralProgram + 506, // 388: datanode.api.v2.ReferralProgram.benefit_tiers:type_name -> vega.BenefitTier + 507, // 389: datanode.api.v2.ReferralProgram.staking_tiers:type_name -> vega.StakingTier + 350, // 390: datanode.api.v2.ReferralSetEdge.node:type_name -> datanode.api.v2.ReferralSet + 351, // 391: datanode.api.v2.ReferralSetConnection.edges:type_name -> datanode.api.v2.ReferralSetEdge + 7, // 392: datanode.api.v2.ReferralSetConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 393: datanode.api.v2.ListReferralSetsRequest.pagination:type_name -> datanode.api.v2.Pagination + 352, // 394: datanode.api.v2.ListReferralSetsResponse.referral_sets:type_name -> datanode.api.v2.ReferralSetConnection + 355, // 395: datanode.api.v2.ReferralSetRefereeEdge.node:type_name -> datanode.api.v2.ReferralSetReferee + 356, // 396: datanode.api.v2.ReferralSetRefereeConnection.edges:type_name -> datanode.api.v2.ReferralSetRefereeEdge + 7, // 397: datanode.api.v2.ReferralSetRefereeConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 398: datanode.api.v2.ListReferralSetRefereesRequest.pagination:type_name -> datanode.api.v2.Pagination + 357, // 399: datanode.api.v2.ListReferralSetRefereesResponse.referral_set_referees:type_name -> datanode.api.v2.ReferralSetRefereeConnection + 6, // 400: datanode.api.v2.GetReferralSetStatsRequest.pagination:type_name -> datanode.api.v2.Pagination + 362, // 401: datanode.api.v2.GetReferralSetStatsResponse.stats:type_name -> datanode.api.v2.ReferralSetStatsConnection + 363, // 402: datanode.api.v2.ReferralSetStatsConnection.edges:type_name -> datanode.api.v2.ReferralSetStatsEdge + 7, // 403: datanode.api.v2.ReferralSetStatsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 364, // 404: datanode.api.v2.ReferralSetStatsEdge.node:type_name -> datanode.api.v2.ReferralSetStats + 365, // 405: datanode.api.v2.TeamEdge.node:type_name -> datanode.api.v2.Team + 366, // 406: datanode.api.v2.TeamConnection.edges:type_name -> datanode.api.v2.TeamEdge + 7, // 407: datanode.api.v2.TeamConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 408: datanode.api.v2.ListTeamsRequest.pagination:type_name -> datanode.api.v2.Pagination + 367, // 409: datanode.api.v2.ListTeamsResponse.teams:type_name -> datanode.api.v2.TeamConnection + 6, // 410: datanode.api.v2.ListTeamsStatisticsRequest.pagination:type_name -> datanode.api.v2.Pagination + 372, // 411: datanode.api.v2.ListTeamsStatisticsResponse.statistics:type_name -> datanode.api.v2.TeamsStatisticsConnection + 373, // 412: datanode.api.v2.TeamsStatisticsConnection.edges:type_name -> datanode.api.v2.TeamStatisticsEdge + 7, // 413: datanode.api.v2.TeamsStatisticsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 374, // 414: datanode.api.v2.TeamStatisticsEdge.node:type_name -> datanode.api.v2.TeamStatistics + 375, // 415: datanode.api.v2.TeamStatistics.quantum_rewards:type_name -> datanode.api.v2.QuantumRewardsPerEpoch + 376, // 416: datanode.api.v2.TeamStatistics.quantum_volumes:type_name -> datanode.api.v2.QuantumVolumesPerEpoch + 6, // 417: datanode.api.v2.ListTeamMembersStatisticsRequest.pagination:type_name -> datanode.api.v2.Pagination + 379, // 418: datanode.api.v2.ListTeamMembersStatisticsResponse.statistics:type_name -> datanode.api.v2.TeamMembersStatisticsConnection + 380, // 419: datanode.api.v2.TeamMembersStatisticsConnection.edges:type_name -> datanode.api.v2.TeamMemberStatisticsEdge + 7, // 420: datanode.api.v2.TeamMembersStatisticsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 381, // 421: datanode.api.v2.TeamMemberStatisticsEdge.node:type_name -> datanode.api.v2.TeamMemberStatistics + 375, // 422: datanode.api.v2.TeamMemberStatistics.quantum_rewards:type_name -> datanode.api.v2.QuantumRewardsPerEpoch + 376, // 423: datanode.api.v2.TeamMemberStatistics.quantum_volumes:type_name -> datanode.api.v2.QuantumVolumesPerEpoch + 6, // 424: datanode.api.v2.ListTeamRefereesRequest.pagination:type_name -> datanode.api.v2.Pagination + 383, // 425: datanode.api.v2.TeamRefereeEdge.node:type_name -> datanode.api.v2.TeamReferee + 384, // 426: datanode.api.v2.TeamRefereeConnection.edges:type_name -> datanode.api.v2.TeamRefereeEdge + 7, // 427: datanode.api.v2.TeamRefereeConnection.page_info:type_name -> datanode.api.v2.PageInfo + 385, // 428: datanode.api.v2.ListTeamRefereesResponse.team_referees:type_name -> datanode.api.v2.TeamRefereeConnection + 387, // 429: datanode.api.v2.TeamRefereeHistoryEdge.node:type_name -> datanode.api.v2.TeamRefereeHistory + 388, // 430: datanode.api.v2.TeamRefereeHistoryConnection.edges:type_name -> datanode.api.v2.TeamRefereeHistoryEdge + 7, // 431: datanode.api.v2.TeamRefereeHistoryConnection.page_info:type_name -> datanode.api.v2.PageInfo + 6, // 432: datanode.api.v2.ListTeamRefereeHistoryRequest.pagination:type_name -> datanode.api.v2.Pagination + 389, // 433: datanode.api.v2.ListTeamRefereeHistoryResponse.team_referee_history:type_name -> datanode.api.v2.TeamRefereeHistoryConnection + 508, // 434: datanode.api.v2.GetFeesStatsResponse.fees_stats:type_name -> vega.events.v1.FeesStats + 404, // 435: datanode.api.v2.GetFeesStatsForPartyResponse.fees_stats_for_party:type_name -> datanode.api.v2.FeesStatsForParty + 403, // 436: datanode.api.v2.GetCurrentVolumeDiscountProgramResponse.current_volume_discount_program:type_name -> datanode.api.v2.VolumeDiscountProgram + 6, // 437: datanode.api.v2.GetVolumeDiscountStatsRequest.pagination:type_name -> datanode.api.v2.Pagination + 400, // 438: datanode.api.v2.GetVolumeDiscountStatsResponse.stats:type_name -> datanode.api.v2.VolumeDiscountStatsConnection + 401, // 439: datanode.api.v2.VolumeDiscountStatsConnection.edges:type_name -> datanode.api.v2.VolumeDiscountStatsEdge + 7, // 440: datanode.api.v2.VolumeDiscountStatsConnection.page_info:type_name -> datanode.api.v2.PageInfo + 402, // 441: datanode.api.v2.VolumeDiscountStatsEdge.node:type_name -> datanode.api.v2.VolumeDiscountStats + 509, // 442: datanode.api.v2.VolumeDiscountProgram.benefit_tiers:type_name -> vega.VolumeBenefitTier + 510, // 443: datanode.api.v2.ObserveTransactionResultsResponse.transaction_results:type_name -> vega.events.v1.TransactionResult + 437, // 444: datanode.api.v2.EstimateTransferFeeRequest.from_account_type:type_name -> vega.AccountType + 511, // 445: datanode.api.v2.ListGamesRequest.entity_scope:type_name -> vega.EntityScope + 6, // 446: datanode.api.v2.ListGamesRequest.pagination:type_name -> datanode.api.v2.Pagination + 413, // 447: datanode.api.v2.ListGamesResponse.games:type_name -> datanode.api.v2.GamesConnection + 414, // 448: datanode.api.v2.GamesConnection.edges:type_name -> datanode.api.v2.GameEdge + 7, // 449: datanode.api.v2.GamesConnection.page_info:type_name -> datanode.api.v2.PageInfo + 415, // 450: datanode.api.v2.GameEdge.node:type_name -> datanode.api.v2.Game + 416, // 451: datanode.api.v2.Game.team:type_name -> datanode.api.v2.TeamGameEntities + 417, // 452: datanode.api.v2.Game.individual:type_name -> datanode.api.v2.IndividualGameEntities + 418, // 453: datanode.api.v2.TeamGameEntities.team:type_name -> datanode.api.v2.TeamGameEntity + 420, // 454: datanode.api.v2.IndividualGameEntities.individual:type_name -> datanode.api.v2.IndividualGameEntity + 419, // 455: datanode.api.v2.TeamGameEntity.team:type_name -> datanode.api.v2.TeamGameParticipation + 512, // 456: datanode.api.v2.TeamGameEntity.reward_metric:type_name -> vega.DispatchMetric + 420, // 457: datanode.api.v2.TeamGameParticipation.members_participating:type_name -> datanode.api.v2.IndividualGameEntity + 512, // 458: datanode.api.v2.IndividualGameEntity.reward_metric:type_name -> vega.DispatchMetric + 6, // 459: datanode.api.v2.ListPartyMarginModesRequest.pagination:type_name -> datanode.api.v2.Pagination + 423, // 460: datanode.api.v2.ListPartyMarginModesResponse.party_margin_modes:type_name -> datanode.api.v2.PartyMarginModesConnection + 424, // 461: datanode.api.v2.PartyMarginModesConnection.edges:type_name -> datanode.api.v2.PartyMarginModeEdge + 7, // 462: datanode.api.v2.PartyMarginModesConnection.page_info:type_name -> datanode.api.v2.PageInfo + 425, // 463: datanode.api.v2.PartyMarginModeEdge.node:type_name -> datanode.api.v2.PartyMarginMode + 505, // 464: datanode.api.v2.PartyMarginMode.margin_mode:type_name -> vega.MarginMode + 426, // 465: datanode.api.v2.GetTimeWeightedNotionalPositionResponse.time_weighted_notional_position:type_name -> datanode.api.v2.TimeWeightedNotionalPosition + 513, // 466: datanode.api.v2.ListAMMsRequest.status:type_name -> vega.events.v1.AMM.Status + 6, // 467: datanode.api.v2.ListAMMsRequest.pagination:type_name -> datanode.api.v2.Pagination + 431, // 468: datanode.api.v2.ListAMMsResponse.amms:type_name -> datanode.api.v2.AMMConnection + 432, // 469: datanode.api.v2.AMMConnection.edges:type_name -> datanode.api.v2.AMMEdge + 7, // 470: datanode.api.v2.AMMConnection.page_info:type_name -> datanode.api.v2.PageInfo + 514, // 471: datanode.api.v2.AMMEdge.node:type_name -> vega.events.v1.AMM + 13, // 472: datanode.api.v2.TradingDataService.ListAccounts:input_type -> datanode.api.v2.ListAccountsRequest + 17, // 473: datanode.api.v2.TradingDataService.ObserveAccounts:input_type -> datanode.api.v2.ObserveAccountsRequest + 21, // 474: datanode.api.v2.TradingDataService.Info:input_type -> datanode.api.v2.InfoRequest + 23, // 475: datanode.api.v2.TradingDataService.GetOrder:input_type -> datanode.api.v2.GetOrderRequest + 26, // 476: datanode.api.v2.TradingDataService.ListOrders:input_type -> datanode.api.v2.ListOrdersRequest + 28, // 477: datanode.api.v2.TradingDataService.ListOrderVersions:input_type -> datanode.api.v2.ListOrderVersionsRequest + 30, // 478: datanode.api.v2.TradingDataService.ObserveOrders:input_type -> datanode.api.v2.ObserveOrdersRequest + 34, // 479: datanode.api.v2.TradingDataService.GetStopOrder:input_type -> datanode.api.v2.GetStopOrderRequest + 46, // 480: datanode.api.v2.TradingDataService.ListStopOrders:input_type -> datanode.api.v2.ListStopOrdersRequest + 36, // 481: datanode.api.v2.TradingDataService.ListGameTeamScores:input_type -> datanode.api.v2.ListGameTeamScoresRequest + 41, // 482: datanode.api.v2.TradingDataService.ListGamePartyScores:input_type -> datanode.api.v2.ListGamePartyScoresRequest + 51, // 483: datanode.api.v2.TradingDataService.ListPositions:input_type -> datanode.api.v2.ListPositionsRequest + 54, // 484: datanode.api.v2.TradingDataService.ListAllPositions:input_type -> datanode.api.v2.ListAllPositionsRequest + 58, // 485: datanode.api.v2.TradingDataService.ObservePositions:input_type -> datanode.api.v2.ObservePositionsRequest + 64, // 486: datanode.api.v2.TradingDataService.ListLedgerEntries:input_type -> datanode.api.v2.ListLedgerEntriesRequest + 65, // 487: datanode.api.v2.TradingDataService.ExportLedgerEntries:input_type -> datanode.api.v2.ExportLedgerEntriesRequest + 69, // 488: datanode.api.v2.TradingDataService.ListBalanceChanges:input_type -> datanode.api.v2.ListBalanceChangesRequest + 87, // 489: datanode.api.v2.TradingDataService.GetLatestMarketData:input_type -> datanode.api.v2.GetLatestMarketDataRequest + 85, // 490: datanode.api.v2.TradingDataService.ListLatestMarketData:input_type -> datanode.api.v2.ListLatestMarketDataRequest + 83, // 491: datanode.api.v2.TradingDataService.GetLatestMarketDepth:input_type -> datanode.api.v2.GetLatestMarketDepthRequest + 77, // 492: datanode.api.v2.TradingDataService.ObserveMarketsDepth:input_type -> datanode.api.v2.ObserveMarketsDepthRequest + 79, // 493: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:input_type -> datanode.api.v2.ObserveMarketsDepthUpdatesRequest + 81, // 494: datanode.api.v2.TradingDataService.ObserveMarketsData:input_type -> datanode.api.v2.ObserveMarketsDataRequest + 89, // 495: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:input_type -> datanode.api.v2.GetMarketDataHistoryByIDRequest + 93, // 496: datanode.api.v2.TradingDataService.ListTransfers:input_type -> datanode.api.v2.ListTransfersRequest + 98, // 497: datanode.api.v2.TradingDataService.GetTransfer:input_type -> datanode.api.v2.GetTransferRequest + 100, // 498: datanode.api.v2.TradingDataService.GetNetworkLimits:input_type -> datanode.api.v2.GetNetworkLimitsRequest + 108, // 499: datanode.api.v2.TradingDataService.ListCandleData:input_type -> datanode.api.v2.ListCandleDataRequest + 106, // 500: datanode.api.v2.TradingDataService.ObserveCandleData:input_type -> datanode.api.v2.ObserveCandleDataRequest + 102, // 501: datanode.api.v2.TradingDataService.ListCandleIntervals:input_type -> datanode.api.v2.ListCandleIntervalsRequest + 112, // 502: datanode.api.v2.TradingDataService.ListVotes:input_type -> datanode.api.v2.ListVotesRequest + 116, // 503: datanode.api.v2.TradingDataService.ObserveVotes:input_type -> datanode.api.v2.ObserveVotesRequest + 118, // 504: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesRequest + 124, // 505: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:input_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesRequest + 130, // 506: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:input_type -> datanode.api.v2.GetERC20ListAssetBundleRequest + 132, // 507: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:input_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleRequest + 134, // 508: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:input_type -> datanode.api.v2.GetERC20WithdrawalApprovalRequest + 136, // 509: datanode.api.v2.TradingDataService.GetLastTrade:input_type -> datanode.api.v2.GetLastTradeRequest + 138, // 510: datanode.api.v2.TradingDataService.ListTrades:input_type -> datanode.api.v2.ListTradesRequest + 142, // 511: datanode.api.v2.TradingDataService.ObserveTrades:input_type -> datanode.api.v2.ObserveTradesRequest + 144, // 512: datanode.api.v2.TradingDataService.GetOracleSpec:input_type -> datanode.api.v2.GetOracleSpecRequest + 146, // 513: datanode.api.v2.TradingDataService.ListOracleSpecs:input_type -> datanode.api.v2.ListOracleSpecsRequest + 148, // 514: datanode.api.v2.TradingDataService.ListOracleData:input_type -> datanode.api.v2.ListOracleDataRequest + 154, // 515: datanode.api.v2.TradingDataService.GetMarket:input_type -> datanode.api.v2.GetMarketRequest + 156, // 516: datanode.api.v2.TradingDataService.ListMarkets:input_type -> datanode.api.v2.ListMarketsRequest + 160, // 517: datanode.api.v2.TradingDataService.ListSuccessorMarkets:input_type -> datanode.api.v2.ListSuccessorMarketsRequest + 165, // 518: datanode.api.v2.TradingDataService.GetParty:input_type -> datanode.api.v2.GetPartyRequest + 167, // 519: datanode.api.v2.TradingDataService.ListParties:input_type -> datanode.api.v2.ListPartiesRequest + 171, // 520: datanode.api.v2.TradingDataService.ListPartiesProfiles:input_type -> datanode.api.v2.ListPartiesProfilesRequest + 176, // 521: datanode.api.v2.TradingDataService.ListMarginLevels:input_type -> datanode.api.v2.ListMarginLevelsRequest + 178, // 522: datanode.api.v2.TradingDataService.ObserveMarginLevels:input_type -> datanode.api.v2.ObserveMarginLevelsRequest + 183, // 523: datanode.api.v2.TradingDataService.ListRewards:input_type -> datanode.api.v2.ListRewardsRequest + 187, // 524: datanode.api.v2.TradingDataService.ListRewardSummaries:input_type -> datanode.api.v2.ListRewardSummariesRequest + 190, // 525: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:input_type -> datanode.api.v2.ListEpochRewardSummariesRequest + 196, // 526: datanode.api.v2.TradingDataService.GetDeposit:input_type -> datanode.api.v2.GetDepositRequest + 198, // 527: datanode.api.v2.TradingDataService.ListDeposits:input_type -> datanode.api.v2.ListDepositsRequest + 202, // 528: datanode.api.v2.TradingDataService.GetWithdrawal:input_type -> datanode.api.v2.GetWithdrawalRequest + 204, // 529: datanode.api.v2.TradingDataService.ListWithdrawals:input_type -> datanode.api.v2.ListWithdrawalsRequest + 208, // 530: datanode.api.v2.TradingDataService.GetAsset:input_type -> datanode.api.v2.GetAssetRequest + 210, // 531: datanode.api.v2.TradingDataService.ListAssets:input_type -> datanode.api.v2.ListAssetsRequest + 214, // 532: datanode.api.v2.TradingDataService.ListLiquidityProvisions:input_type -> datanode.api.v2.ListLiquidityProvisionsRequest + 215, // 533: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:input_type -> datanode.api.v2.ListAllLiquidityProvisionsRequest + 223, // 534: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:input_type -> datanode.api.v2.ObserveLiquidityProvisionsRequest + 225, // 535: datanode.api.v2.TradingDataService.ListLiquidityProviders:input_type -> datanode.api.v2.ListLiquidityProvidersRequest + 230, // 536: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:input_type -> datanode.api.v2.ListPaidLiquidityFeesRequest + 234, // 537: datanode.api.v2.TradingDataService.GetGovernanceData:input_type -> datanode.api.v2.GetGovernanceDataRequest + 236, // 538: datanode.api.v2.TradingDataService.ListGovernanceData:input_type -> datanode.api.v2.ListGovernanceDataRequest + 240, // 539: datanode.api.v2.TradingDataService.ObserveGovernance:input_type -> datanode.api.v2.ObserveGovernanceRequest + 242, // 540: datanode.api.v2.TradingDataService.ListDelegations:input_type -> datanode.api.v2.ListDelegationsRequest + 249, // 541: datanode.api.v2.TradingDataService.GetNetworkData:input_type -> datanode.api.v2.GetNetworkDataRequest + 251, // 542: datanode.api.v2.TradingDataService.GetNode:input_type -> datanode.api.v2.GetNodeRequest + 253, // 543: datanode.api.v2.TradingDataService.ListNodes:input_type -> datanode.api.v2.ListNodesRequest + 257, // 544: datanode.api.v2.TradingDataService.ListNodeSignatures:input_type -> datanode.api.v2.ListNodeSignaturesRequest + 261, // 545: datanode.api.v2.TradingDataService.GetEpoch:input_type -> datanode.api.v2.GetEpochRequest + 263, // 546: datanode.api.v2.TradingDataService.EstimateFee:input_type -> datanode.api.v2.EstimateFeeRequest + 265, // 547: datanode.api.v2.TradingDataService.EstimateMargin:input_type -> datanode.api.v2.EstimateMarginRequest + 341, // 548: datanode.api.v2.TradingDataService.EstimatePosition:input_type -> datanode.api.v2.EstimatePositionRequest + 267, // 549: datanode.api.v2.TradingDataService.ListNetworkParameters:input_type -> datanode.api.v2.ListNetworkParametersRequest + 269, // 550: datanode.api.v2.TradingDataService.GetNetworkParameter:input_type -> datanode.api.v2.GetNetworkParameterRequest + 274, // 551: datanode.api.v2.TradingDataService.ListCheckpoints:input_type -> datanode.api.v2.ListCheckpointsRequest + 278, // 552: datanode.api.v2.TradingDataService.GetStake:input_type -> datanode.api.v2.GetStakeRequest + 282, // 553: datanode.api.v2.TradingDataService.GetRiskFactors:input_type -> datanode.api.v2.GetRiskFactorsRequest + 284, // 554: datanode.api.v2.TradingDataService.ObserveEventBus:input_type -> datanode.api.v2.ObserveEventBusRequest + 286, // 555: datanode.api.v2.TradingDataService.ObserveLedgerMovements:input_type -> datanode.api.v2.ObserveLedgerMovementsRequest + 288, // 556: datanode.api.v2.TradingDataService.ListKeyRotations:input_type -> datanode.api.v2.ListKeyRotationsRequest + 292, // 557: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:input_type -> datanode.api.v2.ListEthereumKeyRotationsRequest + 296, // 558: datanode.api.v2.TradingDataService.GetVegaTime:input_type -> datanode.api.v2.GetVegaTimeRequest + 299, // 559: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:input_type -> datanode.api.v2.GetProtocolUpgradeStatusRequest + 301, // 560: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:input_type -> datanode.api.v2.ListProtocolUpgradeProposalsRequest + 305, // 561: datanode.api.v2.TradingDataService.ListCoreSnapshots:input_type -> datanode.api.v2.ListCoreSnapshotsRequest + 310, // 562: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:input_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentRequest + 312, // 563: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:input_type -> datanode.api.v2.ListAllNetworkHistorySegmentsRequest + 314, // 564: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:input_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesRequest + 316, // 565: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:input_type -> datanode.api.v2.GetNetworkHistoryStatusRequest + 318, // 566: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:input_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersRequest + 321, // 567: datanode.api.v2.TradingDataService.ListEntities:input_type -> datanode.api.v2.ListEntitiesRequest + 330, // 568: datanode.api.v2.TradingDataService.ListFundingPeriods:input_type -> datanode.api.v2.ListFundingPeriodsRequest + 334, // 569: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:input_type -> datanode.api.v2.ListFundingPeriodDataPointsRequest + 326, // 570: datanode.api.v2.TradingDataService.ListFundingPayments:input_type -> datanode.api.v2.ListFundingPaymentsRequest + 323, // 571: datanode.api.v2.TradingDataService.GetPartyActivityStreak:input_type -> datanode.api.v2.GetPartyActivityStreakRequest + 347, // 572: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:input_type -> datanode.api.v2.GetCurrentReferralProgramRequest + 353, // 573: datanode.api.v2.TradingDataService.ListReferralSets:input_type -> datanode.api.v2.ListReferralSetsRequest + 358, // 574: datanode.api.v2.TradingDataService.ListReferralSetReferees:input_type -> datanode.api.v2.ListReferralSetRefereesRequest + 360, // 575: datanode.api.v2.TradingDataService.GetReferralSetStats:input_type -> datanode.api.v2.GetReferralSetStatsRequest + 368, // 576: datanode.api.v2.TradingDataService.ListTeams:input_type -> datanode.api.v2.ListTeamsRequest + 370, // 577: datanode.api.v2.TradingDataService.ListTeamsStatistics:input_type -> datanode.api.v2.ListTeamsStatisticsRequest + 377, // 578: datanode.api.v2.TradingDataService.ListTeamMembersStatistics:input_type -> datanode.api.v2.ListTeamMembersStatisticsRequest + 382, // 579: datanode.api.v2.TradingDataService.ListTeamReferees:input_type -> datanode.api.v2.ListTeamRefereesRequest + 390, // 580: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:input_type -> datanode.api.v2.ListTeamRefereeHistoryRequest + 392, // 581: datanode.api.v2.TradingDataService.GetFeesStats:input_type -> datanode.api.v2.GetFeesStatsRequest + 394, // 582: datanode.api.v2.TradingDataService.GetFeesStatsForParty:input_type -> datanode.api.v2.GetFeesStatsForPartyRequest + 396, // 583: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:input_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramRequest + 398, // 584: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:input_type -> datanode.api.v2.GetVolumeDiscountStatsRequest + 10, // 585: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:input_type -> datanode.api.v2.GetVestingBalancesSummaryRequest + 8, // 586: datanode.api.v2.TradingDataService.GetPartyVestingStats:input_type -> datanode.api.v2.GetPartyVestingStatsRequest + 405, // 587: datanode.api.v2.TradingDataService.ObserveTransactionResults:input_type -> datanode.api.v2.ObserveTransactionResultsRequest + 407, // 588: datanode.api.v2.TradingDataService.EstimateTransferFee:input_type -> datanode.api.v2.EstimateTransferFeeRequest + 409, // 589: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:input_type -> datanode.api.v2.GetTotalTransferFeeDiscountRequest + 411, // 590: datanode.api.v2.TradingDataService.ListGames:input_type -> datanode.api.v2.ListGamesRequest + 421, // 591: datanode.api.v2.TradingDataService.ListPartyMarginModes:input_type -> datanode.api.v2.ListPartyMarginModesRequest + 427, // 592: datanode.api.v2.TradingDataService.GetTimeWeightedNotionalPosition:input_type -> datanode.api.v2.GetTimeWeightedNotionalPositionRequest + 429, // 593: datanode.api.v2.TradingDataService.ListAMMs:input_type -> datanode.api.v2.ListAMMsRequest + 433, // 594: datanode.api.v2.TradingDataService.EstimateAMMBounds:input_type -> datanode.api.v2.EstimateAMMBoundsRequest + 320, // 595: datanode.api.v2.TradingDataService.ExportNetworkHistory:input_type -> datanode.api.v2.ExportNetworkHistoryRequest + 338, // 596: datanode.api.v2.TradingDataService.Ping:input_type -> datanode.api.v2.PingRequest + 14, // 597: datanode.api.v2.TradingDataService.ListAccounts:output_type -> datanode.api.v2.ListAccountsResponse + 18, // 598: datanode.api.v2.TradingDataService.ObserveAccounts:output_type -> datanode.api.v2.ObserveAccountsResponse + 22, // 599: datanode.api.v2.TradingDataService.Info:output_type -> datanode.api.v2.InfoResponse + 24, // 600: datanode.api.v2.TradingDataService.GetOrder:output_type -> datanode.api.v2.GetOrderResponse + 27, // 601: datanode.api.v2.TradingDataService.ListOrders:output_type -> datanode.api.v2.ListOrdersResponse + 29, // 602: datanode.api.v2.TradingDataService.ListOrderVersions:output_type -> datanode.api.v2.ListOrderVersionsResponse + 31, // 603: datanode.api.v2.TradingDataService.ObserveOrders:output_type -> datanode.api.v2.ObserveOrdersResponse + 35, // 604: datanode.api.v2.TradingDataService.GetStopOrder:output_type -> datanode.api.v2.GetStopOrderResponse + 50, // 605: datanode.api.v2.TradingDataService.ListStopOrders:output_type -> datanode.api.v2.ListStopOrdersResponse + 38, // 606: datanode.api.v2.TradingDataService.ListGameTeamScores:output_type -> datanode.api.v2.ListGameTeamScoresResponse + 43, // 607: datanode.api.v2.TradingDataService.ListGamePartyScores:output_type -> datanode.api.v2.ListGamePartyScoresResponse + 52, // 608: datanode.api.v2.TradingDataService.ListPositions:output_type -> datanode.api.v2.ListPositionsResponse + 55, // 609: datanode.api.v2.TradingDataService.ListAllPositions:output_type -> datanode.api.v2.ListAllPositionsResponse + 59, // 610: datanode.api.v2.TradingDataService.ObservePositions:output_type -> datanode.api.v2.ObservePositionsResponse + 66, // 611: datanode.api.v2.TradingDataService.ListLedgerEntries:output_type -> datanode.api.v2.ListLedgerEntriesResponse + 515, // 612: datanode.api.v2.TradingDataService.ExportLedgerEntries:output_type -> google.api.HttpBody + 70, // 613: datanode.api.v2.TradingDataService.ListBalanceChanges:output_type -> datanode.api.v2.ListBalanceChangesResponse + 88, // 614: datanode.api.v2.TradingDataService.GetLatestMarketData:output_type -> datanode.api.v2.GetLatestMarketDataResponse + 86, // 615: datanode.api.v2.TradingDataService.ListLatestMarketData:output_type -> datanode.api.v2.ListLatestMarketDataResponse + 84, // 616: datanode.api.v2.TradingDataService.GetLatestMarketDepth:output_type -> datanode.api.v2.GetLatestMarketDepthResponse + 78, // 617: datanode.api.v2.TradingDataService.ObserveMarketsDepth:output_type -> datanode.api.v2.ObserveMarketsDepthResponse + 80, // 618: datanode.api.v2.TradingDataService.ObserveMarketsDepthUpdates:output_type -> datanode.api.v2.ObserveMarketsDepthUpdatesResponse + 82, // 619: datanode.api.v2.TradingDataService.ObserveMarketsData:output_type -> datanode.api.v2.ObserveMarketsDataResponse + 90, // 620: datanode.api.v2.TradingDataService.GetMarketDataHistoryByID:output_type -> datanode.api.v2.GetMarketDataHistoryByIDResponse + 94, // 621: datanode.api.v2.TradingDataService.ListTransfers:output_type -> datanode.api.v2.ListTransfersResponse + 99, // 622: datanode.api.v2.TradingDataService.GetTransfer:output_type -> datanode.api.v2.GetTransferResponse + 101, // 623: datanode.api.v2.TradingDataService.GetNetworkLimits:output_type -> datanode.api.v2.GetNetworkLimitsResponse + 109, // 624: datanode.api.v2.TradingDataService.ListCandleData:output_type -> datanode.api.v2.ListCandleDataResponse + 107, // 625: datanode.api.v2.TradingDataService.ObserveCandleData:output_type -> datanode.api.v2.ObserveCandleDataResponse + 104, // 626: datanode.api.v2.TradingDataService.ListCandleIntervals:output_type -> datanode.api.v2.ListCandleIntervalsResponse + 113, // 627: datanode.api.v2.TradingDataService.ListVotes:output_type -> datanode.api.v2.ListVotesResponse + 117, // 628: datanode.api.v2.TradingDataService.ObserveVotes:output_type -> datanode.api.v2.ObserveVotesResponse + 119, // 629: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerAddedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerAddedBundlesResponse + 125, // 630: datanode.api.v2.TradingDataService.ListERC20MultiSigSignerRemovedBundles:output_type -> datanode.api.v2.ListERC20MultiSigSignerRemovedBundlesResponse + 131, // 631: datanode.api.v2.TradingDataService.GetERC20ListAssetBundle:output_type -> datanode.api.v2.GetERC20ListAssetBundleResponse + 133, // 632: datanode.api.v2.TradingDataService.GetERC20SetAssetLimitsBundle:output_type -> datanode.api.v2.GetERC20SetAssetLimitsBundleResponse + 135, // 633: datanode.api.v2.TradingDataService.GetERC20WithdrawalApproval:output_type -> datanode.api.v2.GetERC20WithdrawalApprovalResponse + 137, // 634: datanode.api.v2.TradingDataService.GetLastTrade:output_type -> datanode.api.v2.GetLastTradeResponse + 139, // 635: datanode.api.v2.TradingDataService.ListTrades:output_type -> datanode.api.v2.ListTradesResponse + 143, // 636: datanode.api.v2.TradingDataService.ObserveTrades:output_type -> datanode.api.v2.ObserveTradesResponse + 145, // 637: datanode.api.v2.TradingDataService.GetOracleSpec:output_type -> datanode.api.v2.GetOracleSpecResponse + 147, // 638: datanode.api.v2.TradingDataService.ListOracleSpecs:output_type -> datanode.api.v2.ListOracleSpecsResponse + 149, // 639: datanode.api.v2.TradingDataService.ListOracleData:output_type -> datanode.api.v2.ListOracleDataResponse + 155, // 640: datanode.api.v2.TradingDataService.GetMarket:output_type -> datanode.api.v2.GetMarketResponse + 157, // 641: datanode.api.v2.TradingDataService.ListMarkets:output_type -> datanode.api.v2.ListMarketsResponse + 164, // 642: datanode.api.v2.TradingDataService.ListSuccessorMarkets:output_type -> datanode.api.v2.ListSuccessorMarketsResponse + 166, // 643: datanode.api.v2.TradingDataService.GetParty:output_type -> datanode.api.v2.GetPartyResponse + 168, // 644: datanode.api.v2.TradingDataService.ListParties:output_type -> datanode.api.v2.ListPartiesResponse + 172, // 645: datanode.api.v2.TradingDataService.ListPartiesProfiles:output_type -> datanode.api.v2.ListPartiesProfilesResponse + 177, // 646: datanode.api.v2.TradingDataService.ListMarginLevels:output_type -> datanode.api.v2.ListMarginLevelsResponse + 179, // 647: datanode.api.v2.TradingDataService.ObserveMarginLevels:output_type -> datanode.api.v2.ObserveMarginLevelsResponse + 184, // 648: datanode.api.v2.TradingDataService.ListRewards:output_type -> datanode.api.v2.ListRewardsResponse + 188, // 649: datanode.api.v2.TradingDataService.ListRewardSummaries:output_type -> datanode.api.v2.ListRewardSummariesResponse + 191, // 650: datanode.api.v2.TradingDataService.ListEpochRewardSummaries:output_type -> datanode.api.v2.ListEpochRewardSummariesResponse + 197, // 651: datanode.api.v2.TradingDataService.GetDeposit:output_type -> datanode.api.v2.GetDepositResponse + 199, // 652: datanode.api.v2.TradingDataService.ListDeposits:output_type -> datanode.api.v2.ListDepositsResponse + 203, // 653: datanode.api.v2.TradingDataService.GetWithdrawal:output_type -> datanode.api.v2.GetWithdrawalResponse + 205, // 654: datanode.api.v2.TradingDataService.ListWithdrawals:output_type -> datanode.api.v2.ListWithdrawalsResponse + 209, // 655: datanode.api.v2.TradingDataService.GetAsset:output_type -> datanode.api.v2.GetAssetResponse + 211, // 656: datanode.api.v2.TradingDataService.ListAssets:output_type -> datanode.api.v2.ListAssetsResponse + 216, // 657: datanode.api.v2.TradingDataService.ListLiquidityProvisions:output_type -> datanode.api.v2.ListLiquidityProvisionsResponse + 217, // 658: datanode.api.v2.TradingDataService.ListAllLiquidityProvisions:output_type -> datanode.api.v2.ListAllLiquidityProvisionsResponse + 224, // 659: datanode.api.v2.TradingDataService.ObserveLiquidityProvisions:output_type -> datanode.api.v2.ObserveLiquidityProvisionsResponse + 229, // 660: datanode.api.v2.TradingDataService.ListLiquidityProviders:output_type -> datanode.api.v2.ListLiquidityProvidersResponse + 231, // 661: datanode.api.v2.TradingDataService.ListPaidLiquidityFees:output_type -> datanode.api.v2.ListPaidLiquidityFeesResponse + 235, // 662: datanode.api.v2.TradingDataService.GetGovernanceData:output_type -> datanode.api.v2.GetGovernanceDataResponse + 237, // 663: datanode.api.v2.TradingDataService.ListGovernanceData:output_type -> datanode.api.v2.ListGovernanceDataResponse + 241, // 664: datanode.api.v2.TradingDataService.ObserveGovernance:output_type -> datanode.api.v2.ObserveGovernanceResponse + 243, // 665: datanode.api.v2.TradingDataService.ListDelegations:output_type -> datanode.api.v2.ListDelegationsResponse + 250, // 666: datanode.api.v2.TradingDataService.GetNetworkData:output_type -> datanode.api.v2.GetNetworkDataResponse + 252, // 667: datanode.api.v2.TradingDataService.GetNode:output_type -> datanode.api.v2.GetNodeResponse + 254, // 668: datanode.api.v2.TradingDataService.ListNodes:output_type -> datanode.api.v2.ListNodesResponse + 258, // 669: datanode.api.v2.TradingDataService.ListNodeSignatures:output_type -> datanode.api.v2.ListNodeSignaturesResponse + 262, // 670: datanode.api.v2.TradingDataService.GetEpoch:output_type -> datanode.api.v2.GetEpochResponse + 264, // 671: datanode.api.v2.TradingDataService.EstimateFee:output_type -> datanode.api.v2.EstimateFeeResponse + 266, // 672: datanode.api.v2.TradingDataService.EstimateMargin:output_type -> datanode.api.v2.EstimateMarginResponse + 342, // 673: datanode.api.v2.TradingDataService.EstimatePosition:output_type -> datanode.api.v2.EstimatePositionResponse + 268, // 674: datanode.api.v2.TradingDataService.ListNetworkParameters:output_type -> datanode.api.v2.ListNetworkParametersResponse + 270, // 675: datanode.api.v2.TradingDataService.GetNetworkParameter:output_type -> datanode.api.v2.GetNetworkParameterResponse + 275, // 676: datanode.api.v2.TradingDataService.ListCheckpoints:output_type -> datanode.api.v2.ListCheckpointsResponse + 279, // 677: datanode.api.v2.TradingDataService.GetStake:output_type -> datanode.api.v2.GetStakeResponse + 283, // 678: datanode.api.v2.TradingDataService.GetRiskFactors:output_type -> datanode.api.v2.GetRiskFactorsResponse + 285, // 679: datanode.api.v2.TradingDataService.ObserveEventBus:output_type -> datanode.api.v2.ObserveEventBusResponse + 287, // 680: datanode.api.v2.TradingDataService.ObserveLedgerMovements:output_type -> datanode.api.v2.ObserveLedgerMovementsResponse + 289, // 681: datanode.api.v2.TradingDataService.ListKeyRotations:output_type -> datanode.api.v2.ListKeyRotationsResponse + 293, // 682: datanode.api.v2.TradingDataService.ListEthereumKeyRotations:output_type -> datanode.api.v2.ListEthereumKeyRotationsResponse + 297, // 683: datanode.api.v2.TradingDataService.GetVegaTime:output_type -> datanode.api.v2.GetVegaTimeResponse + 300, // 684: datanode.api.v2.TradingDataService.GetProtocolUpgradeStatus:output_type -> datanode.api.v2.GetProtocolUpgradeStatusResponse + 302, // 685: datanode.api.v2.TradingDataService.ListProtocolUpgradeProposals:output_type -> datanode.api.v2.ListProtocolUpgradeProposalsResponse + 306, // 686: datanode.api.v2.TradingDataService.ListCoreSnapshots:output_type -> datanode.api.v2.ListCoreSnapshotsResponse + 311, // 687: datanode.api.v2.TradingDataService.GetMostRecentNetworkHistorySegment:output_type -> datanode.api.v2.GetMostRecentNetworkHistorySegmentResponse + 313, // 688: datanode.api.v2.TradingDataService.ListAllNetworkHistorySegments:output_type -> datanode.api.v2.ListAllNetworkHistorySegmentsResponse + 315, // 689: datanode.api.v2.TradingDataService.GetActiveNetworkHistoryPeerAddresses:output_type -> datanode.api.v2.GetActiveNetworkHistoryPeerAddressesResponse + 317, // 690: datanode.api.v2.TradingDataService.GetNetworkHistoryStatus:output_type -> datanode.api.v2.GetNetworkHistoryStatusResponse + 319, // 691: datanode.api.v2.TradingDataService.GetNetworkHistoryBootstrapPeers:output_type -> datanode.api.v2.GetNetworkHistoryBootstrapPeersResponse + 322, // 692: datanode.api.v2.TradingDataService.ListEntities:output_type -> datanode.api.v2.ListEntitiesResponse + 333, // 693: datanode.api.v2.TradingDataService.ListFundingPeriods:output_type -> datanode.api.v2.ListFundingPeriodsResponse + 337, // 694: datanode.api.v2.TradingDataService.ListFundingPeriodDataPoints:output_type -> datanode.api.v2.ListFundingPeriodDataPointsResponse + 329, // 695: datanode.api.v2.TradingDataService.ListFundingPayments:output_type -> datanode.api.v2.ListFundingPaymentsResponse + 324, // 696: datanode.api.v2.TradingDataService.GetPartyActivityStreak:output_type -> datanode.api.v2.GetPartyActivityStreakResponse + 348, // 697: datanode.api.v2.TradingDataService.GetCurrentReferralProgram:output_type -> datanode.api.v2.GetCurrentReferralProgramResponse + 354, // 698: datanode.api.v2.TradingDataService.ListReferralSets:output_type -> datanode.api.v2.ListReferralSetsResponse + 359, // 699: datanode.api.v2.TradingDataService.ListReferralSetReferees:output_type -> datanode.api.v2.ListReferralSetRefereesResponse + 361, // 700: datanode.api.v2.TradingDataService.GetReferralSetStats:output_type -> datanode.api.v2.GetReferralSetStatsResponse + 369, // 701: datanode.api.v2.TradingDataService.ListTeams:output_type -> datanode.api.v2.ListTeamsResponse + 371, // 702: datanode.api.v2.TradingDataService.ListTeamsStatistics:output_type -> datanode.api.v2.ListTeamsStatisticsResponse + 378, // 703: datanode.api.v2.TradingDataService.ListTeamMembersStatistics:output_type -> datanode.api.v2.ListTeamMembersStatisticsResponse + 386, // 704: datanode.api.v2.TradingDataService.ListTeamReferees:output_type -> datanode.api.v2.ListTeamRefereesResponse + 391, // 705: datanode.api.v2.TradingDataService.ListTeamRefereeHistory:output_type -> datanode.api.v2.ListTeamRefereeHistoryResponse + 393, // 706: datanode.api.v2.TradingDataService.GetFeesStats:output_type -> datanode.api.v2.GetFeesStatsResponse + 395, // 707: datanode.api.v2.TradingDataService.GetFeesStatsForParty:output_type -> datanode.api.v2.GetFeesStatsForPartyResponse + 397, // 708: datanode.api.v2.TradingDataService.GetCurrentVolumeDiscountProgram:output_type -> datanode.api.v2.GetCurrentVolumeDiscountProgramResponse + 399, // 709: datanode.api.v2.TradingDataService.GetVolumeDiscountStats:output_type -> datanode.api.v2.GetVolumeDiscountStatsResponse + 11, // 710: datanode.api.v2.TradingDataService.GetVestingBalancesSummary:output_type -> datanode.api.v2.GetVestingBalancesSummaryResponse + 9, // 711: datanode.api.v2.TradingDataService.GetPartyVestingStats:output_type -> datanode.api.v2.GetPartyVestingStatsResponse + 406, // 712: datanode.api.v2.TradingDataService.ObserveTransactionResults:output_type -> datanode.api.v2.ObserveTransactionResultsResponse + 408, // 713: datanode.api.v2.TradingDataService.EstimateTransferFee:output_type -> datanode.api.v2.EstimateTransferFeeResponse + 410, // 714: datanode.api.v2.TradingDataService.GetTotalTransferFeeDiscount:output_type -> datanode.api.v2.GetTotalTransferFeeDiscountResponse + 412, // 715: datanode.api.v2.TradingDataService.ListGames:output_type -> datanode.api.v2.ListGamesResponse + 422, // 716: datanode.api.v2.TradingDataService.ListPartyMarginModes:output_type -> datanode.api.v2.ListPartyMarginModesResponse + 428, // 717: datanode.api.v2.TradingDataService.GetTimeWeightedNotionalPosition:output_type -> datanode.api.v2.GetTimeWeightedNotionalPositionResponse + 430, // 718: datanode.api.v2.TradingDataService.ListAMMs:output_type -> datanode.api.v2.ListAMMsResponse + 434, // 719: datanode.api.v2.TradingDataService.EstimateAMMBounds:output_type -> datanode.api.v2.EstimateAMMBoundsResponse + 515, // 720: datanode.api.v2.TradingDataService.ExportNetworkHistory:output_type -> google.api.HttpBody + 339, // 721: datanode.api.v2.TradingDataService.Ping:output_type -> datanode.api.v2.PingResponse + 597, // [597:722] is the sub-list for method output_type + 472, // [472:597] is the sub-list for method input_type + 472, // [472:472] is the sub-list for extension type_name + 472, // [472:472] is the sub-list for extension extendee + 0, // [0:472] is the sub-list for field type_name } func init() { file_data_node_api_v2_trading_data_proto_init() } @@ -32131,7 +33649,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStopOrdersRequest); i { + switch v := v.(*ListGameTeamScoresRequest); i { case 0: return &v.state case 1: @@ -32143,7 +33661,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopOrderFilter); i { + switch v := v.(*GameTeamScoresFilter); i { case 0: return &v.state case 1: @@ -32155,7 +33673,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopOrderEdge); i { + switch v := v.(*ListGameTeamScoresResponse); i { case 0: return &v.state case 1: @@ -32167,7 +33685,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopOrderConnection); i { + switch v := v.(*GameTeamScoresConnection); i { case 0: return &v.state case 1: @@ -32179,7 +33697,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStopOrdersResponse); i { + switch v := v.(*GameTeamScoresEdge); i { case 0: return &v.state case 1: @@ -32191,7 +33709,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPositionsRequest); i { + switch v := v.(*ListGamePartyScoresRequest); i { case 0: return &v.state case 1: @@ -32203,7 +33721,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPositionsResponse); i { + switch v := v.(*GamePartyScoresFilter); i { case 0: return &v.state case 1: @@ -32215,7 +33733,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PositionsFilter); i { + switch v := v.(*ListGamePartyScoresResponse); i { case 0: return &v.state case 1: @@ -32227,7 +33745,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAllPositionsRequest); i { + switch v := v.(*GamePartyScoresConnection); i { case 0: return &v.state case 1: @@ -32239,7 +33757,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListAllPositionsResponse); i { + switch v := v.(*GamePartyScoresEdge); i { case 0: return &v.state case 1: @@ -32251,7 +33769,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PositionEdge); i { + switch v := v.(*ListStopOrdersRequest); i { case 0: return &v.state case 1: @@ -32263,7 +33781,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PositionConnection); i { + switch v := v.(*StopOrderFilter); i { case 0: return &v.state case 1: @@ -32275,7 +33793,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObservePositionsRequest); i { + switch v := v.(*StopOrderEdge); i { case 0: return &v.state case 1: @@ -32287,7 +33805,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObservePositionsResponse); i { + switch v := v.(*StopOrderConnection); i { case 0: return &v.state case 1: @@ -32299,7 +33817,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PositionSnapshotPage); i { + switch v := v.(*ListStopOrdersResponse); i { case 0: return &v.state case 1: @@ -32311,7 +33829,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PositionUpdates); i { + switch v := v.(*ListPositionsRequest); i { case 0: return &v.state case 1: @@ -32323,7 +33841,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LedgerEntryFilter); i { + switch v := v.(*ListPositionsResponse); i { case 0: return &v.state case 1: @@ -32335,7 +33853,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AggregatedLedgerEntry); i { + switch v := v.(*PositionsFilter); i { case 0: return &v.state case 1: @@ -32347,7 +33865,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListLedgerEntriesRequest); i { + switch v := v.(*ListAllPositionsRequest); i { case 0: return &v.state case 1: @@ -32359,7 +33877,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportLedgerEntriesRequest); i { + switch v := v.(*ListAllPositionsResponse); i { case 0: return &v.state case 1: @@ -32371,7 +33889,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListLedgerEntriesResponse); i { + switch v := v.(*PositionEdge); i { case 0: return &v.state case 1: @@ -32383,7 +33901,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AggregatedLedgerEntriesEdge); i { + switch v := v.(*PositionConnection); i { case 0: return &v.state case 1: @@ -32395,7 +33913,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AggregatedLedgerEntriesConnection); i { + switch v := v.(*ObservePositionsRequest); i { case 0: return &v.state case 1: @@ -32407,7 +33925,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListBalanceChangesRequest); i { + switch v := v.(*ObservePositionsResponse); i { case 0: return &v.state case 1: @@ -32419,7 +33937,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListBalanceChangesResponse); i { + switch v := v.(*PositionSnapshotPage); i { case 0: return &v.state case 1: @@ -32431,7 +33949,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBalanceHistoryRequest); i { + switch v := v.(*PositionUpdates); i { case 0: return &v.state case 1: @@ -32443,7 +33961,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetBalanceHistoryResponse); i { + switch v := v.(*LedgerEntryFilter); i { case 0: return &v.state case 1: @@ -32455,7 +33973,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AggregatedBalanceEdge); i { + switch v := v.(*AggregatedLedgerEntry); i { case 0: return &v.state case 1: @@ -32467,7 +33985,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AggregatedBalanceConnection); i { + switch v := v.(*ListLedgerEntriesRequest); i { case 0: return &v.state case 1: @@ -32479,7 +33997,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AccountFilter); i { + switch v := v.(*ExportLedgerEntriesRequest); i { case 0: return &v.state case 1: @@ -32491,7 +34009,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AggregatedBalance); i { + switch v := v.(*ListLedgerEntriesResponse); i { case 0: return &v.state case 1: @@ -32503,7 +34021,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveMarketsDepthRequest); i { + switch v := v.(*AggregatedLedgerEntriesEdge); i { case 0: return &v.state case 1: @@ -32515,7 +34033,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveMarketsDepthResponse); i { + switch v := v.(*AggregatedLedgerEntriesConnection); i { case 0: return &v.state case 1: @@ -32527,7 +34045,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveMarketsDepthUpdatesRequest); i { + switch v := v.(*ListBalanceChangesRequest); i { case 0: return &v.state case 1: @@ -32539,7 +34057,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveMarketsDepthUpdatesResponse); i { + switch v := v.(*ListBalanceChangesResponse); i { case 0: return &v.state case 1: @@ -32551,7 +34069,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveMarketsDataRequest); i { + switch v := v.(*GetBalanceHistoryRequest); i { case 0: return &v.state case 1: @@ -32563,7 +34081,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveMarketsDataResponse); i { + switch v := v.(*GetBalanceHistoryResponse); i { case 0: return &v.state case 1: @@ -32575,7 +34093,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestMarketDepthRequest); i { + switch v := v.(*AggregatedBalanceEdge); i { case 0: return &v.state case 1: @@ -32587,7 +34105,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestMarketDepthResponse); i { + switch v := v.(*AggregatedBalanceConnection); i { case 0: return &v.state case 1: @@ -32599,7 +34117,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListLatestMarketDataRequest); i { + switch v := v.(*AccountFilter); i { case 0: return &v.state case 1: @@ -32611,7 +34129,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListLatestMarketDataResponse); i { + switch v := v.(*AggregatedBalance); i { case 0: return &v.state case 1: @@ -32623,7 +34141,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestMarketDataRequest); i { + switch v := v.(*ObserveMarketsDepthRequest); i { case 0: return &v.state case 1: @@ -32635,7 +34153,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLatestMarketDataResponse); i { + switch v := v.(*ObserveMarketsDepthResponse); i { case 0: return &v.state case 1: @@ -32647,7 +34165,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketDataHistoryByIDRequest); i { + switch v := v.(*ObserveMarketsDepthUpdatesRequest); i { case 0: return &v.state case 1: @@ -32659,7 +34177,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketDataHistoryByIDResponse); i { + switch v := v.(*ObserveMarketsDepthUpdatesResponse); i { case 0: return &v.state case 1: @@ -32671,7 +34189,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketDataEdge); i { + switch v := v.(*ObserveMarketsDataRequest); i { case 0: return &v.state case 1: @@ -32683,7 +34201,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketDataConnection); i { + switch v := v.(*ObserveMarketsDataResponse); i { case 0: return &v.state case 1: @@ -32695,7 +34213,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTransfersRequest); i { + switch v := v.(*GetLatestMarketDepthRequest); i { case 0: return &v.state case 1: @@ -32707,7 +34225,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTransfersResponse); i { + switch v := v.(*GetLatestMarketDepthResponse); i { case 0: return &v.state case 1: @@ -32719,7 +34237,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransferNode); i { + switch v := v.(*ListLatestMarketDataRequest); i { case 0: return &v.state case 1: @@ -32731,7 +34249,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransferEdge); i { + switch v := v.(*ListLatestMarketDataResponse); i { case 0: return &v.state case 1: @@ -32743,7 +34261,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransferConnection); i { + switch v := v.(*GetLatestMarketDataRequest); i { case 0: return &v.state case 1: @@ -32755,7 +34273,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTransferRequest); i { + switch v := v.(*GetLatestMarketDataResponse); i { case 0: return &v.state case 1: @@ -32767,7 +34285,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTransferResponse); i { + switch v := v.(*GetMarketDataHistoryByIDRequest); i { case 0: return &v.state case 1: @@ -32779,7 +34297,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNetworkLimitsRequest); i { + switch v := v.(*GetMarketDataHistoryByIDResponse); i { case 0: return &v.state case 1: @@ -32791,7 +34309,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetNetworkLimitsResponse); i { + switch v := v.(*MarketDataEdge); i { case 0: return &v.state case 1: @@ -32803,7 +34321,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListCandleIntervalsRequest); i { + switch v := v.(*MarketDataConnection); i { case 0: return &v.state case 1: @@ -32815,7 +34333,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IntervalToCandleId); i { + switch v := v.(*ListTransfersRequest); i { case 0: return &v.state case 1: @@ -32827,7 +34345,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListCandleIntervalsResponse); i { + switch v := v.(*ListTransfersResponse); i { case 0: return &v.state case 1: @@ -32839,7 +34357,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Candle); i { + switch v := v.(*TransferNode); i { case 0: return &v.state case 1: @@ -32851,7 +34369,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveCandleDataRequest); i { + switch v := v.(*TransferEdge); i { case 0: return &v.state case 1: @@ -32863,7 +34381,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveCandleDataResponse); i { + switch v := v.(*TransferConnection); i { case 0: return &v.state case 1: @@ -32875,7 +34393,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListCandleDataRequest); i { + switch v := v.(*GetTransferRequest); i { case 0: return &v.state case 1: @@ -32887,7 +34405,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListCandleDataResponse); i { + switch v := v.(*GetTransferResponse); i { case 0: return &v.state case 1: @@ -32899,7 +34417,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CandleEdge); i { + switch v := v.(*GetNetworkLimitsRequest); i { case 0: return &v.state case 1: @@ -32911,7 +34429,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CandleDataConnection); i { + switch v := v.(*GetNetworkLimitsResponse); i { case 0: return &v.state case 1: @@ -32923,7 +34441,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListVotesRequest); i { + switch v := v.(*ListCandleIntervalsRequest); i { case 0: return &v.state case 1: @@ -32935,7 +34453,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListVotesResponse); i { + switch v := v.(*IntervalToCandleId); i { case 0: return &v.state case 1: @@ -32947,7 +34465,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VoteEdge); i { + switch v := v.(*ListCandleIntervalsResponse); i { case 0: return &v.state case 1: @@ -32959,7 +34477,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VoteConnection); i { + switch v := v.(*Candle); i { case 0: return &v.state case 1: @@ -32971,7 +34489,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveVotesRequest); i { + switch v := v.(*ObserveCandleDataRequest); i { case 0: return &v.state case 1: @@ -32983,7 +34501,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveVotesResponse); i { + switch v := v.(*ObserveCandleDataResponse); i { case 0: return &v.state case 1: @@ -32995,7 +34513,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListERC20MultiSigSignerAddedBundlesRequest); i { + switch v := v.(*ListCandleDataRequest); i { case 0: return &v.state case 1: @@ -33007,7 +34525,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListERC20MultiSigSignerAddedBundlesResponse); i { + switch v := v.(*ListCandleDataResponse); i { case 0: return &v.state case 1: @@ -33019,7 +34537,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerAddedEdge); i { + switch v := v.(*CandleEdge); i { case 0: return &v.state case 1: @@ -33031,7 +34549,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerAddedBundleEdge); i { + switch v := v.(*CandleDataConnection); i { case 0: return &v.state case 1: @@ -33043,7 +34561,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerAddedConnection); i { + switch v := v.(*ListVotesRequest); i { case 0: return &v.state case 1: @@ -33055,7 +34573,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerAddedBundle); i { + switch v := v.(*ListVotesResponse); i { case 0: return &v.state case 1: @@ -33067,7 +34585,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListERC20MultiSigSignerRemovedBundlesRequest); i { + switch v := v.(*VoteEdge); i { case 0: return &v.state case 1: @@ -33079,7 +34597,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListERC20MultiSigSignerRemovedBundlesResponse); i { + switch v := v.(*VoteConnection); i { case 0: return &v.state case 1: @@ -33091,7 +34609,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerRemovedEdge); i { + switch v := v.(*ObserveVotesRequest); i { case 0: return &v.state case 1: @@ -33103,7 +34621,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerRemovedBundleEdge); i { + switch v := v.(*ObserveVotesResponse); i { case 0: return &v.state case 1: @@ -33115,7 +34633,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerRemovedConnection); i { + switch v := v.(*ListERC20MultiSigSignerAddedBundlesRequest); i { case 0: return &v.state case 1: @@ -33127,7 +34645,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigSignerRemovedBundle); i { + switch v := v.(*ListERC20MultiSigSignerAddedBundlesResponse); i { case 0: return &v.state case 1: @@ -33139,7 +34657,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetERC20ListAssetBundleRequest); i { + switch v := v.(*ERC20MultiSigSignerAddedEdge); i { case 0: return &v.state case 1: @@ -33151,7 +34669,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetERC20ListAssetBundleResponse); i { + switch v := v.(*ERC20MultiSigSignerAddedBundleEdge); i { case 0: return &v.state case 1: @@ -33163,7 +34681,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetERC20SetAssetLimitsBundleRequest); i { + switch v := v.(*ERC20MultiSigSignerAddedConnection); i { case 0: return &v.state case 1: @@ -33175,7 +34693,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetERC20SetAssetLimitsBundleResponse); i { + switch v := v.(*ERC20MultiSigSignerAddedBundle); i { case 0: return &v.state case 1: @@ -33187,7 +34705,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetERC20WithdrawalApprovalRequest); i { + switch v := v.(*ListERC20MultiSigSignerRemovedBundlesRequest); i { case 0: return &v.state case 1: @@ -33199,7 +34717,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetERC20WithdrawalApprovalResponse); i { + switch v := v.(*ListERC20MultiSigSignerRemovedBundlesResponse); i { case 0: return &v.state case 1: @@ -33211,7 +34729,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLastTradeRequest); i { + switch v := v.(*ERC20MultiSigSignerRemovedEdge); i { case 0: return &v.state case 1: @@ -33223,7 +34741,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLastTradeResponse); i { + switch v := v.(*ERC20MultiSigSignerRemovedBundleEdge); i { case 0: return &v.state case 1: @@ -33235,7 +34753,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTradesRequest); i { + switch v := v.(*ERC20MultiSigSignerRemovedConnection); i { case 0: return &v.state case 1: @@ -33247,7 +34765,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListTradesResponse); i { + switch v := v.(*ERC20MultiSigSignerRemovedBundle); i { case 0: return &v.state case 1: @@ -33259,7 +34777,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TradeConnection); i { + switch v := v.(*GetERC20ListAssetBundleRequest); i { case 0: return &v.state case 1: @@ -33271,7 +34789,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[125].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TradeEdge); i { + switch v := v.(*GetERC20ListAssetBundleResponse); i { case 0: return &v.state case 1: @@ -33283,7 +34801,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[126].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveTradesRequest); i { + switch v := v.(*GetERC20SetAssetLimitsBundleRequest); i { case 0: return &v.state case 1: @@ -33295,7 +34813,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[127].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveTradesResponse); i { + switch v := v.(*GetERC20SetAssetLimitsBundleResponse); i { case 0: return &v.state case 1: @@ -33307,7 +34825,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[128].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOracleSpecRequest); i { + switch v := v.(*GetERC20WithdrawalApprovalRequest); i { case 0: return &v.state case 1: @@ -33319,7 +34837,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[129].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetOracleSpecResponse); i { + switch v := v.(*GetERC20WithdrawalApprovalResponse); i { case 0: return &v.state case 1: @@ -33331,7 +34849,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[130].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListOracleSpecsRequest); i { + switch v := v.(*GetLastTradeRequest); i { case 0: return &v.state case 1: @@ -33343,7 +34861,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[131].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListOracleSpecsResponse); i { + switch v := v.(*GetLastTradeResponse); i { case 0: return &v.state case 1: @@ -33355,7 +34873,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListOracleDataRequest); i { + switch v := v.(*ListTradesRequest); i { case 0: return &v.state case 1: @@ -33367,7 +34885,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListOracleDataResponse); i { + switch v := v.(*ListTradesResponse); i { case 0: return &v.state case 1: @@ -33379,7 +34897,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[134].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OracleSpecEdge); i { + switch v := v.(*TradeConnection); i { case 0: return &v.state case 1: @@ -33391,7 +34909,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[135].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OracleSpecsConnection); i { + switch v := v.(*TradeEdge); i { case 0: return &v.state case 1: @@ -33403,7 +34921,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[136].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OracleDataEdge); i { + switch v := v.(*ObserveTradesRequest); i { case 0: return &v.state case 1: @@ -33415,7 +34933,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[137].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OracleDataConnection); i { + switch v := v.(*ObserveTradesResponse); i { case 0: return &v.state case 1: @@ -33427,7 +34945,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[138].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketRequest); i { + switch v := v.(*GetOracleSpecRequest); i { case 0: return &v.state case 1: @@ -33439,7 +34957,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[139].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMarketResponse); i { + switch v := v.(*GetOracleSpecResponse); i { case 0: return &v.state case 1: @@ -33451,7 +34969,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[140].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketsRequest); i { + switch v := v.(*ListOracleSpecsRequest); i { case 0: return &v.state case 1: @@ -33463,7 +34981,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[141].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarketsResponse); i { + switch v := v.(*ListOracleSpecsResponse); i { case 0: return &v.state case 1: @@ -33475,7 +34993,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[142].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketEdge); i { + switch v := v.(*ListOracleDataRequest); i { case 0: return &v.state case 1: @@ -33487,7 +35005,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[143].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketConnection); i { + switch v := v.(*ListOracleDataResponse); i { case 0: return &v.state case 1: @@ -33499,7 +35017,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[144].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListSuccessorMarketsRequest); i { + switch v := v.(*OracleSpecEdge); i { case 0: return &v.state case 1: @@ -33511,7 +35029,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[145].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuccessorMarket); i { + switch v := v.(*OracleSpecsConnection); i { case 0: return &v.state case 1: @@ -33523,7 +35041,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[146].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuccessorMarketEdge); i { + switch v := v.(*OracleDataEdge); i { case 0: return &v.state case 1: @@ -33535,7 +35053,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[147].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuccessorMarketConnection); i { + switch v := v.(*OracleDataConnection); i { case 0: return &v.state case 1: @@ -33547,7 +35065,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[148].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListSuccessorMarketsResponse); i { + switch v := v.(*GetMarketRequest); i { case 0: return &v.state case 1: @@ -33559,7 +35077,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[149].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPartyRequest); i { + switch v := v.(*GetMarketResponse); i { case 0: return &v.state case 1: @@ -33571,7 +35089,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[150].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetPartyResponse); i { + switch v := v.(*ListMarketsRequest); i { case 0: return &v.state case 1: @@ -33583,7 +35101,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[151].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPartiesRequest); i { + switch v := v.(*ListMarketsResponse); i { case 0: return &v.state case 1: @@ -33595,7 +35113,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[152].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPartiesResponse); i { + switch v := v.(*MarketEdge); i { case 0: return &v.state case 1: @@ -33607,7 +35125,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[153].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyEdge); i { + switch v := v.(*MarketConnection); i { case 0: return &v.state case 1: @@ -33619,7 +35137,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[154].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyConnection); i { + switch v := v.(*ListSuccessorMarketsRequest); i { case 0: return &v.state case 1: @@ -33631,7 +35149,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[155].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPartiesProfilesRequest); i { + switch v := v.(*SuccessorMarket); i { case 0: return &v.state case 1: @@ -33643,7 +35161,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[156].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPartiesProfilesResponse); i { + switch v := v.(*SuccessorMarketEdge); i { case 0: return &v.state case 1: @@ -33655,7 +35173,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[157].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyProfileEdge); i { + switch v := v.(*SuccessorMarketConnection); i { case 0: return &v.state case 1: @@ -33667,7 +35185,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[158].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartiesProfilesConnection); i { + switch v := v.(*ListSuccessorMarketsResponse); i { case 0: return &v.state case 1: @@ -33679,7 +35197,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[159].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrderEdge); i { + switch v := v.(*GetPartyRequest); i { case 0: return &v.state case 1: @@ -33691,7 +35209,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[160].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarginLevelsRequest); i { + switch v := v.(*GetPartyResponse); i { case 0: return &v.state case 1: @@ -33703,7 +35221,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[161].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMarginLevelsResponse); i { + switch v := v.(*ListPartiesRequest); i { case 0: return &v.state case 1: @@ -33715,7 +35233,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[162].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveMarginLevelsRequest); i { + switch v := v.(*ListPartiesResponse); i { case 0: return &v.state case 1: @@ -33727,7 +35245,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[163].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveMarginLevelsResponse); i { + switch v := v.(*PartyEdge); i { case 0: return &v.state case 1: @@ -33739,7 +35257,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[164].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrderConnection); i { + switch v := v.(*PartyConnection); i { case 0: return &v.state case 1: @@ -33751,7 +35269,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[165].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarginEdge); i { + switch v := v.(*ListPartiesProfilesRequest); i { case 0: return &v.state case 1: @@ -33763,7 +35281,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[166].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarginConnection); i { + switch v := v.(*ListPartiesProfilesResponse); i { case 0: return &v.state case 1: @@ -33775,7 +35293,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[167].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRewardsRequest); i { + switch v := v.(*PartyProfileEdge); i { case 0: return &v.state case 1: @@ -33787,7 +35305,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[168].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRewardsResponse); i { + switch v := v.(*PartiesProfilesConnection); i { case 0: return &v.state case 1: @@ -33799,7 +35317,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[169].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RewardEdge); i { + switch v := v.(*OrderEdge); i { case 0: return &v.state case 1: @@ -33811,7 +35329,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[170].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RewardsConnection); i { + switch v := v.(*ListMarginLevelsRequest); i { case 0: return &v.state case 1: @@ -33823,7 +35341,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[171].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRewardSummariesRequest); i { + switch v := v.(*ListMarginLevelsResponse); i { case 0: return &v.state case 1: @@ -33835,7 +35353,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[172].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRewardSummariesResponse); i { + switch v := v.(*ObserveMarginLevelsRequest); i { case 0: return &v.state case 1: @@ -33847,7 +35365,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[173].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RewardSummaryFilter); i { + switch v := v.(*ObserveMarginLevelsResponse); i { case 0: return &v.state case 1: @@ -33859,7 +35377,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListEpochRewardSummariesRequest); i { + switch v := v.(*OrderConnection); i { case 0: return &v.state case 1: @@ -33871,7 +35389,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListEpochRewardSummariesResponse); i { + switch v := v.(*MarginEdge); i { case 0: return &v.state case 1: @@ -33883,7 +35401,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochRewardSummaryConnection); i { + switch v := v.(*MarginConnection); i { case 0: return &v.state case 1: @@ -33895,7 +35413,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochRewardSummaryEdge); i { + switch v := v.(*ListRewardsRequest); i { case 0: return &v.state case 1: @@ -33907,7 +35425,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveRewardsRequest); i { + switch v := v.(*ListRewardsResponse); i { case 0: return &v.state case 1: @@ -33919,7 +35437,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObserveRewardsResponse); i { + switch v := v.(*RewardEdge); i { case 0: return &v.state case 1: @@ -33931,7 +35449,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[180].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetDepositRequest); i { + switch v := v.(*RewardsConnection); i { case 0: return &v.state case 1: @@ -33943,7 +35461,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[181].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetDepositResponse); i { + switch v := v.(*ListRewardSummariesRequest); i { case 0: return &v.state case 1: @@ -33955,7 +35473,7 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[182].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListDepositsRequest); i { + switch v := v.(*ListRewardSummariesResponse); i { case 0: return &v.state case 1: @@ -33967,6 +35485,126 @@ func file_data_node_api_v2_trading_data_proto_init() { } } file_data_node_api_v2_trading_data_proto_msgTypes[183].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RewardSummaryFilter); 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[184].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListEpochRewardSummariesRequest); 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[185].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListEpochRewardSummariesResponse); 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[186].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EpochRewardSummaryConnection); 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[187].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EpochRewardSummaryEdge); 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[188].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ObserveRewardsRequest); 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[189].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ObserveRewardsResponse); 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[190].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetDepositRequest); 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[191].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetDepositResponse); 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[192].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListDepositsRequest); 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[193].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListDepositsResponse); i { case 0: return &v.state @@ -33978,7 +35616,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[184].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[194].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DepositEdge); i { case 0: return &v.state @@ -33990,7 +35628,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[185].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[195].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DepositsConnection); i { case 0: return &v.state @@ -34002,7 +35640,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[186].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[196].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWithdrawalRequest); i { case 0: return &v.state @@ -34014,7 +35652,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[187].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[197].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWithdrawalResponse); i { case 0: return &v.state @@ -34026,7 +35664,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[188].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[198].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListWithdrawalsRequest); i { case 0: return &v.state @@ -34038,7 +35676,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[189].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[199].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListWithdrawalsResponse); i { case 0: return &v.state @@ -34050,7 +35688,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[190].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[200].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WithdrawalEdge); i { case 0: return &v.state @@ -34062,7 +35700,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[191].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[201].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WithdrawalsConnection); i { case 0: return &v.state @@ -34074,7 +35712,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[192].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[202].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAssetRequest); i { case 0: return &v.state @@ -34086,7 +35724,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[193].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[203].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAssetResponse); i { case 0: return &v.state @@ -34098,7 +35736,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[194].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[204].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAssetsRequest); i { case 0: return &v.state @@ -34110,7 +35748,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[195].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[205].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAssetsResponse); i { case 0: return &v.state @@ -34122,7 +35760,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[196].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[206].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AssetEdge); i { case 0: return &v.state @@ -34134,7 +35772,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[197].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[207].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AssetsConnection); i { case 0: return &v.state @@ -34146,7 +35784,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[198].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[208].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListLiquidityProvisionsRequest); i { case 0: return &v.state @@ -34158,7 +35796,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[199].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[209].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAllLiquidityProvisionsRequest); i { case 0: return &v.state @@ -34170,7 +35808,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[200].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[210].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListLiquidityProvisionsResponse); i { case 0: return &v.state @@ -34182,7 +35820,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[201].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[211].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAllLiquidityProvisionsResponse); i { case 0: return &v.state @@ -34194,7 +35832,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[202].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[212].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityProvision); i { case 0: return &v.state @@ -34206,7 +35844,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[203].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[213].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityProvisionsEdge); i { case 0: return &v.state @@ -34218,7 +35856,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[204].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[214].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityProvisionWithPendingEdge); i { case 0: return &v.state @@ -34230,7 +35868,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[205].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[215].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityProvisionsConnection); i { case 0: return &v.state @@ -34242,7 +35880,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[206].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[216].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityProvisionsWithPendingConnection); i { case 0: return &v.state @@ -34254,7 +35892,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[207].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[217].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveLiquidityProvisionsRequest); i { case 0: return &v.state @@ -34266,7 +35904,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[208].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[218].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveLiquidityProvisionsResponse); i { case 0: return &v.state @@ -34278,7 +35916,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[209].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[219].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListLiquidityProvidersRequest); i { case 0: return &v.state @@ -34290,7 +35928,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[210].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[220].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityProvider); i { case 0: return &v.state @@ -34302,7 +35940,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[211].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[221].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityProviderEdge); i { case 0: return &v.state @@ -34314,7 +35952,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[212].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[222].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidityProviderConnection); i { case 0: return &v.state @@ -34326,7 +35964,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[213].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[223].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListLiquidityProvidersResponse); i { case 0: return &v.state @@ -34338,7 +35976,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[214].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[224].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPaidLiquidityFeesRequest); i { case 0: return &v.state @@ -34350,7 +35988,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[215].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[225].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPaidLiquidityFeesResponse); i { case 0: return &v.state @@ -34362,7 +36000,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[216].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[226].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PaidLiquidityFeesEdge); i { case 0: return &v.state @@ -34374,7 +36012,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[217].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[227].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PaidLiquidityFeesConnection); i { case 0: return &v.state @@ -34386,7 +36024,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[218].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[228].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetGovernanceDataRequest); i { case 0: return &v.state @@ -34398,7 +36036,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[219].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[229].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetGovernanceDataResponse); i { case 0: return &v.state @@ -34410,7 +36048,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[220].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[230].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListGovernanceDataRequest); i { case 0: return &v.state @@ -34422,7 +36060,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[221].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[231].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListGovernanceDataResponse); i { case 0: return &v.state @@ -34434,7 +36072,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[222].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[232].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GovernanceDataEdge); i { case 0: return &v.state @@ -34446,7 +36084,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[223].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[233].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GovernanceDataConnection); i { case 0: return &v.state @@ -34458,7 +36096,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[224].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[234].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveGovernanceRequest); i { case 0: return &v.state @@ -34470,7 +36108,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[225].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[235].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveGovernanceResponse); i { case 0: return &v.state @@ -34482,7 +36120,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[226].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[236].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListDelegationsRequest); i { case 0: return &v.state @@ -34494,7 +36132,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[227].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[237].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListDelegationsResponse); i { case 0: return &v.state @@ -34506,7 +36144,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[228].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[238].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DelegationEdge); i { case 0: return &v.state @@ -34518,7 +36156,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[229].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[239].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DelegationsConnection); i { case 0: return &v.state @@ -34530,7 +36168,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[230].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[240].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveDelegationsRequest); i { case 0: return &v.state @@ -34542,7 +36180,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[231].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[241].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveDelegationsResponse); i { case 0: return &v.state @@ -34554,7 +36192,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[232].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[242].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeBasic); i { case 0: return &v.state @@ -34566,7 +36204,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[233].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[243].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNetworkDataRequest); i { case 0: return &v.state @@ -34578,7 +36216,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[234].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[244].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNetworkDataResponse); i { case 0: return &v.state @@ -34590,7 +36228,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[235].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[245].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNodeRequest); i { case 0: return &v.state @@ -34602,7 +36240,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[236].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[246].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNodeResponse); i { case 0: return &v.state @@ -34614,7 +36252,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[237].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[247].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNodesRequest); i { case 0: return &v.state @@ -34626,7 +36264,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[238].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[248].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNodesResponse); i { case 0: return &v.state @@ -34638,7 +36276,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[239].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[249].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeEdge); i { case 0: return &v.state @@ -34650,7 +36288,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[240].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[250].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodesConnection); i { case 0: return &v.state @@ -34662,7 +36300,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[241].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[251].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNodeSignaturesRequest); i { case 0: return &v.state @@ -34674,7 +36312,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[242].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[252].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNodeSignaturesResponse); i { case 0: return &v.state @@ -34686,7 +36324,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[243].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[253].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSignatureEdge); i { case 0: return &v.state @@ -34698,7 +36336,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[244].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[254].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NodeSignaturesConnection); i { case 0: return &v.state @@ -34710,7 +36348,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[245].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[255].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEpochRequest); i { case 0: return &v.state @@ -34722,7 +36360,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[246].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[256].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEpochResponse); i { case 0: return &v.state @@ -34734,7 +36372,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[247].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[257].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstimateFeeRequest); i { case 0: return &v.state @@ -34746,7 +36384,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[248].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[258].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstimateFeeResponse); i { case 0: return &v.state @@ -34758,7 +36396,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[249].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[259].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstimateMarginRequest); i { case 0: return &v.state @@ -34770,7 +36408,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[250].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[260].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstimateMarginResponse); i { case 0: return &v.state @@ -34782,7 +36420,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[251].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[261].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNetworkParametersRequest); i { case 0: return &v.state @@ -34794,7 +36432,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[252].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[262].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListNetworkParametersResponse); i { case 0: return &v.state @@ -34806,7 +36444,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[253].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[263].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNetworkParameterRequest); i { case 0: return &v.state @@ -34818,7 +36456,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[254].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[264].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNetworkParameterResponse); i { case 0: return &v.state @@ -34830,7 +36468,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[255].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[265].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NetworkParameterEdge); i { case 0: return &v.state @@ -34842,7 +36480,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[256].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[266].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NetworkParameterConnection); i { case 0: return &v.state @@ -34854,7 +36492,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[257].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[267].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Checkpoint); i { case 0: return &v.state @@ -34866,7 +36504,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[258].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[268].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListCheckpointsRequest); i { case 0: return &v.state @@ -34878,7 +36516,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[259].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[269].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListCheckpointsResponse); i { case 0: return &v.state @@ -34890,7 +36528,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[260].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[270].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CheckpointEdge); i { case 0: return &v.state @@ -34902,7 +36540,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[261].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[271].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CheckpointsConnection); i { case 0: return &v.state @@ -34914,7 +36552,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[262].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[272].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetStakeRequest); i { case 0: return &v.state @@ -34926,7 +36564,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[263].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[273].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetStakeResponse); i { case 0: return &v.state @@ -34938,7 +36576,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[264].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[274].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StakeLinkingEdge); i { case 0: return &v.state @@ -34950,7 +36588,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[265].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[275].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StakesConnection); i { case 0: return &v.state @@ -34962,7 +36600,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[266].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[276].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRiskFactorsRequest); i { case 0: return &v.state @@ -34974,7 +36612,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[267].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[277].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRiskFactorsResponse); i { case 0: return &v.state @@ -34986,7 +36624,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[268].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[278].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveEventBusRequest); i { case 0: return &v.state @@ -34998,7 +36636,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[269].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[279].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveEventBusResponse); i { case 0: return &v.state @@ -35010,7 +36648,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[270].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[280].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveLedgerMovementsRequest); i { case 0: return &v.state @@ -35022,7 +36660,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[271].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[281].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveLedgerMovementsResponse); i { case 0: return &v.state @@ -35034,7 +36672,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[272].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[282].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListKeyRotationsRequest); i { case 0: return &v.state @@ -35046,7 +36684,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[273].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[283].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListKeyRotationsResponse); i { case 0: return &v.state @@ -35058,7 +36696,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[274].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[284].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KeyRotationEdge); i { case 0: return &v.state @@ -35070,7 +36708,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[275].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[285].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KeyRotationConnection); i { case 0: return &v.state @@ -35082,7 +36720,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[276].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[286].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListEthereumKeyRotationsRequest); i { case 0: return &v.state @@ -35094,7 +36732,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[277].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[287].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListEthereumKeyRotationsResponse); i { case 0: return &v.state @@ -35106,7 +36744,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[278].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[288].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EthereumKeyRotationsConnection); i { case 0: return &v.state @@ -35118,7 +36756,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[279].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[289].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EthereumKeyRotationEdge); i { case 0: return &v.state @@ -35130,7 +36768,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[280].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[290].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVegaTimeRequest); i { case 0: return &v.state @@ -35142,7 +36780,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[281].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[291].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVegaTimeResponse); i { case 0: return &v.state @@ -35154,7 +36792,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[282].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[292].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DateRange); i { case 0: return &v.state @@ -35166,7 +36804,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[283].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[293].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetProtocolUpgradeStatusRequest); i { case 0: return &v.state @@ -35178,7 +36816,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[284].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[294].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetProtocolUpgradeStatusResponse); i { case 0: return &v.state @@ -35190,7 +36828,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[285].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[295].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListProtocolUpgradeProposalsRequest); i { case 0: return &v.state @@ -35202,7 +36840,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[286].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[296].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListProtocolUpgradeProposalsResponse); i { case 0: return &v.state @@ -35214,7 +36852,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[287].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[297].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProtocolUpgradeProposalConnection); i { case 0: return &v.state @@ -35226,7 +36864,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[288].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[298].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProtocolUpgradeProposalEdge); i { case 0: return &v.state @@ -35238,7 +36876,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[289].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[299].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListCoreSnapshotsRequest); i { case 0: return &v.state @@ -35250,7 +36888,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[290].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[300].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListCoreSnapshotsResponse); i { case 0: return &v.state @@ -35262,7 +36900,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[291].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[301].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CoreSnapshotConnection); i { case 0: return &v.state @@ -35274,7 +36912,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[292].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[302].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CoreSnapshotEdge); i { case 0: return &v.state @@ -35286,7 +36924,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[293].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[303].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HistorySegment); i { case 0: return &v.state @@ -35298,7 +36936,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[294].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[304].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMostRecentNetworkHistorySegmentRequest); i { case 0: return &v.state @@ -35310,7 +36948,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[295].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[305].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetMostRecentNetworkHistorySegmentResponse); i { case 0: return &v.state @@ -35322,7 +36960,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[296].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[306].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAllNetworkHistorySegmentsRequest); i { case 0: return &v.state @@ -35334,7 +36972,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[297].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[307].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListAllNetworkHistorySegmentsResponse); i { case 0: return &v.state @@ -35346,7 +36984,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[298].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[308].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetActiveNetworkHistoryPeerAddressesRequest); i { case 0: return &v.state @@ -35358,7 +36996,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[299].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[309].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetActiveNetworkHistoryPeerAddressesResponse); i { case 0: return &v.state @@ -35370,7 +37008,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[300].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[310].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNetworkHistoryStatusRequest); i { case 0: return &v.state @@ -35382,7 +37020,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[301].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[311].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNetworkHistoryStatusResponse); i { case 0: return &v.state @@ -35394,7 +37032,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[302].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[312].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNetworkHistoryBootstrapPeersRequest); i { case 0: return &v.state @@ -35406,7 +37044,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[303].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[313].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetNetworkHistoryBootstrapPeersResponse); i { case 0: return &v.state @@ -35418,7 +37056,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[304].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[314].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExportNetworkHistoryRequest); i { case 0: return &v.state @@ -35430,7 +37068,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[305].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[315].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListEntitiesRequest); i { case 0: return &v.state @@ -35442,7 +37080,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[306].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[316].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListEntitiesResponse); i { case 0: return &v.state @@ -35454,7 +37092,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[307].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[317].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetPartyActivityStreakRequest); i { case 0: return &v.state @@ -35466,7 +37104,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[308].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[318].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetPartyActivityStreakResponse); i { case 0: return &v.state @@ -35478,7 +37116,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[309].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[319].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FundingPayment); i { case 0: return &v.state @@ -35490,7 +37128,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[310].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[320].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFundingPaymentsRequest); i { case 0: return &v.state @@ -35502,7 +37140,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[311].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[321].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FundingPaymentEdge); i { case 0: return &v.state @@ -35514,7 +37152,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[312].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[322].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FundingPaymentConnection); i { case 0: return &v.state @@ -35526,7 +37164,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[313].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[323].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFundingPaymentsResponse); i { case 0: return &v.state @@ -35538,7 +37176,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[314].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[324].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFundingPeriodsRequest); i { case 0: return &v.state @@ -35550,7 +37188,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[315].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[325].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FundingPeriodEdge); i { case 0: return &v.state @@ -35562,7 +37200,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[316].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[326].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FundingPeriodConnection); i { case 0: return &v.state @@ -35574,7 +37212,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[317].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[327].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFundingPeriodsResponse); i { case 0: return &v.state @@ -35586,7 +37224,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[318].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[328].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFundingPeriodDataPointsRequest); i { case 0: return &v.state @@ -35598,7 +37236,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[319].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[329].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FundingPeriodDataPointEdge); i { case 0: return &v.state @@ -35610,7 +37248,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[320].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[330].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FundingPeriodDataPointConnection); i { case 0: return &v.state @@ -35622,7 +37260,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[321].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[331].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListFundingPeriodDataPointsResponse); i { case 0: return &v.state @@ -35634,7 +37272,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[322].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[332].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PingRequest); i { case 0: return &v.state @@ -35646,7 +37284,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[323].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[333].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PingResponse); i { case 0: return &v.state @@ -35658,7 +37296,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[324].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[334].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OrderInfo); i { case 0: return &v.state @@ -35670,7 +37308,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[325].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[335].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstimatePositionRequest); i { case 0: return &v.state @@ -35682,7 +37320,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[326].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[336].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstimatePositionResponse); i { case 0: return &v.state @@ -35694,7 +37332,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[327].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[337].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CollateralIncreaseEstimate); i { case 0: return &v.state @@ -35706,7 +37344,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[328].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[338].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MarginEstimate); i { case 0: return &v.state @@ -35718,7 +37356,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[329].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[339].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidationEstimate); i { case 0: return &v.state @@ -35730,7 +37368,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[330].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[340].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LiquidationPrice); i { case 0: return &v.state @@ -35742,7 +37380,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[331].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[341].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCurrentReferralProgramRequest); i { case 0: return &v.state @@ -35754,7 +37392,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[332].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[342].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCurrentReferralProgramResponse); i { case 0: return &v.state @@ -35766,7 +37404,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[333].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[343].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralProgram); i { case 0: return &v.state @@ -35778,7 +37416,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[334].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[344].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSet); i { case 0: return &v.state @@ -35790,7 +37428,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[335].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[345].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSetEdge); i { case 0: return &v.state @@ -35802,7 +37440,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[336].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[346].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSetConnection); i { case 0: return &v.state @@ -35814,7 +37452,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[337].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[347].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReferralSetsRequest); i { case 0: return &v.state @@ -35826,7 +37464,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[338].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[348].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReferralSetsResponse); i { case 0: return &v.state @@ -35838,7 +37476,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[339].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[349].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSetReferee); i { case 0: return &v.state @@ -35850,7 +37488,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[340].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[350].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSetRefereeEdge); i { case 0: return &v.state @@ -35862,7 +37500,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[341].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[351].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSetRefereeConnection); i { case 0: return &v.state @@ -35874,7 +37512,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[342].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[352].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReferralSetRefereesRequest); i { case 0: return &v.state @@ -35886,7 +37524,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[343].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[353].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReferralSetRefereesResponse); i { case 0: return &v.state @@ -35898,7 +37536,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[344].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[354].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetReferralSetStatsRequest); i { case 0: return &v.state @@ -35910,7 +37548,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[345].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[355].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetReferralSetStatsResponse); i { case 0: return &v.state @@ -35922,7 +37560,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[346].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[356].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSetStatsConnection); i { case 0: return &v.state @@ -35934,7 +37572,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[347].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[357].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSetStatsEdge); i { case 0: return &v.state @@ -35946,7 +37584,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[348].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[358].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ReferralSetStats); i { case 0: return &v.state @@ -35958,7 +37596,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[349].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[359].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Team); i { case 0: return &v.state @@ -35970,7 +37608,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[350].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[360].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamEdge); i { case 0: return &v.state @@ -35982,7 +37620,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[351].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[361].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamConnection); i { case 0: return &v.state @@ -35994,7 +37632,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[352].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[362].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamsRequest); i { case 0: return &v.state @@ -36006,7 +37644,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[353].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[363].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamsResponse); i { case 0: return &v.state @@ -36018,7 +37656,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[354].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[364].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamsStatisticsRequest); i { case 0: return &v.state @@ -36030,7 +37668,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[355].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[365].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamsStatisticsResponse); i { case 0: return &v.state @@ -36042,7 +37680,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[356].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[366].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamsStatisticsConnection); i { case 0: return &v.state @@ -36054,7 +37692,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[357].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[367].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamStatisticsEdge); i { case 0: return &v.state @@ -36066,7 +37704,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[358].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[368].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamStatistics); i { case 0: return &v.state @@ -36078,7 +37716,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[359].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[369].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QuantumRewardsPerEpoch); i { case 0: return &v.state @@ -36090,7 +37728,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[360].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[370].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QuantumVolumesPerEpoch); i { case 0: return &v.state @@ -36102,7 +37740,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[361].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[371].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamMembersStatisticsRequest); i { case 0: return &v.state @@ -36114,7 +37752,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[362].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[372].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamMembersStatisticsResponse); i { case 0: return &v.state @@ -36126,7 +37764,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[363].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[373].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamMembersStatisticsConnection); i { case 0: return &v.state @@ -36138,7 +37776,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[364].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[374].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamMemberStatisticsEdge); i { case 0: return &v.state @@ -36150,7 +37788,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[365].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[375].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamMemberStatistics); i { case 0: return &v.state @@ -36162,7 +37800,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[366].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[376].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamRefereesRequest); i { case 0: return &v.state @@ -36174,7 +37812,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[367].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[377].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamReferee); i { case 0: return &v.state @@ -36186,7 +37824,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[368].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[378].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamRefereeEdge); i { case 0: return &v.state @@ -36198,7 +37836,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[369].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[379].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamRefereeConnection); i { case 0: return &v.state @@ -36210,7 +37848,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[370].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[380].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamRefereesResponse); i { case 0: return &v.state @@ -36222,7 +37860,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[371].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[381].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamRefereeHistory); i { case 0: return &v.state @@ -36234,7 +37872,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[372].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[382].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamRefereeHistoryEdge); i { case 0: return &v.state @@ -36246,7 +37884,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[373].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[383].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamRefereeHistoryConnection); i { case 0: return &v.state @@ -36258,7 +37896,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[374].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[384].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamRefereeHistoryRequest); i { case 0: return &v.state @@ -36270,7 +37908,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[375].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[385].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListTeamRefereeHistoryResponse); i { case 0: return &v.state @@ -36282,7 +37920,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[376].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[386].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFeesStatsRequest); i { case 0: return &v.state @@ -36294,7 +37932,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[377].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[387].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFeesStatsResponse); i { case 0: return &v.state @@ -36306,7 +37944,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[378].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[388].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFeesStatsForPartyRequest); i { case 0: return &v.state @@ -36318,7 +37956,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[379].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[389].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFeesStatsForPartyResponse); i { case 0: return &v.state @@ -36330,7 +37968,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[380].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[390].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCurrentVolumeDiscountProgramRequest); i { case 0: return &v.state @@ -36342,7 +37980,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[381].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[391].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetCurrentVolumeDiscountProgramResponse); i { case 0: return &v.state @@ -36354,7 +37992,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[382].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[392].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVolumeDiscountStatsRequest); i { case 0: return &v.state @@ -36366,7 +38004,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[383].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[393].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVolumeDiscountStatsResponse); i { case 0: return &v.state @@ -36378,7 +38016,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[384].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[394].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeDiscountStatsConnection); i { case 0: return &v.state @@ -36390,7 +38028,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[385].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[395].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeDiscountStatsEdge); i { case 0: return &v.state @@ -36402,7 +38040,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[386].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[396].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeDiscountStats); i { case 0: return &v.state @@ -36414,7 +38052,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[387].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[397].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VolumeDiscountProgram); i { case 0: return &v.state @@ -36426,7 +38064,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[388].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[398].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FeesStatsForParty); i { case 0: return &v.state @@ -36438,7 +38076,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[389].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[399].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveTransactionResultsRequest); i { case 0: return &v.state @@ -36450,7 +38088,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[390].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[400].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ObserveTransactionResultsResponse); i { case 0: return &v.state @@ -36462,7 +38100,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[391].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[401].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstimateTransferFeeRequest); i { case 0: return &v.state @@ -36474,7 +38112,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[392].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[402].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EstimateTransferFeeResponse); i { case 0: return &v.state @@ -36486,7 +38124,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[393].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[403].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTotalTransferFeeDiscountRequest); i { case 0: return &v.state @@ -36498,7 +38136,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[394].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[404].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTotalTransferFeeDiscountResponse); i { case 0: return &v.state @@ -36510,7 +38148,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[395].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[405].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListGamesRequest); i { case 0: return &v.state @@ -36522,7 +38160,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[396].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[406].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListGamesResponse); i { case 0: return &v.state @@ -36534,7 +38172,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[397].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[407].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GamesConnection); i { case 0: return &v.state @@ -36546,7 +38184,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[398].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[408].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GameEdge); i { case 0: return &v.state @@ -36558,7 +38196,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[399].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[409].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Game); i { case 0: return &v.state @@ -36570,7 +38208,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[400].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[410].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamGameEntities); i { case 0: return &v.state @@ -36582,7 +38220,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[401].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[411].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IndividualGameEntities); i { case 0: return &v.state @@ -36594,7 +38232,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[402].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[412].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamGameEntity); i { case 0: return &v.state @@ -36606,7 +38244,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[403].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[413].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeamGameParticipation); i { case 0: return &v.state @@ -36618,7 +38256,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[404].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[414].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IndividualGameEntity); i { case 0: return &v.state @@ -36630,7 +38268,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[405].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[415].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPartyMarginModesRequest); i { case 0: return &v.state @@ -36642,7 +38280,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[406].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[416].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPartyMarginModesResponse); i { case 0: return &v.state @@ -36654,7 +38292,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[407].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[417].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyMarginModesConnection); i { case 0: return &v.state @@ -36666,7 +38304,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[408].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[418].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyMarginModeEdge); i { case 0: return &v.state @@ -36678,7 +38316,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[409].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[419].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PartyMarginMode); i { case 0: return &v.state @@ -36690,7 +38328,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[410].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[420].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TimeWeightedNotionalPosition); i { case 0: return &v.state @@ -36702,7 +38340,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[411].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[421].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTimeWeightedNotionalPositionRequest); i { case 0: return &v.state @@ -36714,7 +38352,7 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } - file_data_node_api_v2_trading_data_proto_msgTypes[412].Exporter = func(v interface{}, i int) interface{} { + file_data_node_api_v2_trading_data_proto_msgTypes[422].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTimeWeightedNotionalPositionResponse); i { case 0: return &v.state @@ -36726,11 +38364,85 @@ func file_data_node_api_v2_trading_data_proto_init() { return nil } } + file_data_node_api_v2_trading_data_proto_msgTypes[423].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAMMsRequest); 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[424].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListAMMsResponse); 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[425].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMMConnection); 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[426].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMMEdge); 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[427].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EstimateAMMBoundsRequest); 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[428].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EstimateAMMBoundsResponse); 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{}{} file_data_node_api_v2_trading_data_proto_msgTypes[5].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[6].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[7].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[11].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[12].OneofWrappers = []interface{}{ (*ObserveAccountsResponse_Snapshot)(nil), (*ObserveAccountsResponse_Updates)(nil), @@ -36747,97 +38459,104 @@ func file_data_node_api_v2_trading_data_proto_init() { file_data_node_api_v2_trading_data_proto_msgTypes[30].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[31].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[35].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[38].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[42].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[43].OneofWrappers = []interface{}{ + file_data_node_api_v2_trading_data_proto_msgTypes[36].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[40].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[41].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[45].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[48].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[52].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[53].OneofWrappers = []interface{}{ (*ObservePositionsResponse_Snapshot)(nil), (*ObservePositionsResponse_Updates)(nil), } - file_data_node_api_v2_trading_data_proto_msgTypes[46].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[47].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[48].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[49].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[53].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[55].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[60].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[67].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[73].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[56].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[57].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[58].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[59].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[63].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[65].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[70].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[77].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[92].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[96].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[100].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[83].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[87].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[102].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[108].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[122].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[130].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[106].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[110].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[112].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[118].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[132].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[140].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[162].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[167].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[171].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[173].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[174].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[178].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[182].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[142].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[150].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[172].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[177].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[181].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[183].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[184].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[188].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[194].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[192].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[198].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[199].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[202].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[207].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[204].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[208].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[209].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[214].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[218].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[220].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[212].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[217].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[219].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[224].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[226].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[228].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[230].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[237].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[241].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[245].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[234].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[236].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[240].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[247].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[251].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[258].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[262].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[255].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[261].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[268].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[272].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[276].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[282].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[285].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[289].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[307].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[310].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[314].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[318].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[325].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[333].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[337].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[342].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[344].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[349].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[286].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[292].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[295].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[299].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[317].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[320].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[324].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[328].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[335].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[343].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[347].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[352].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[354].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[361].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[366].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[374].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[359].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[362].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[364].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[371].OneofWrappers = []interface{}{} file_data_node_api_v2_trading_data_proto_msgTypes[376].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[378].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[382].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[387].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[389].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[395].OneofWrappers = []interface{}{} - file_data_node_api_v2_trading_data_proto_msgTypes[399].OneofWrappers = []interface{}{ + file_data_node_api_v2_trading_data_proto_msgTypes[384].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[386].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[388].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[392].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[397].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[399].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[401].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[405].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[409].OneofWrappers = []interface{}{ (*Game_Team)(nil), (*Game_Individual)(nil), } - 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[415].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[419].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[421].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[423].OneofWrappers = []interface{}{} + file_data_node_api_v2_trading_data_proto_msgTypes[427].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: 429, 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..1dbb0e124d7 100644 --- a/protos/data-node/api/v2/trading_data.pb.gw.go +++ b/protos/data-node/api/v2/trading_data.pb.gw.go @@ -405,6 +405,78 @@ func local_request_TradingDataService_ListStopOrders_0(ctx context.Context, mars } +var ( + filter_TradingDataService_ListGameTeamScores_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_TradingDataService_ListGameTeamScores_0(ctx context.Context, marshaler runtime.Marshaler, client TradingDataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListGameTeamScoresRequest + 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_ListGameTeamScores_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListGameTeamScores(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_TradingDataService_ListGameTeamScores_0(ctx context.Context, marshaler runtime.Marshaler, server TradingDataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListGameTeamScoresRequest + 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_ListGameTeamScores_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListGameTeamScores(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_TradingDataService_ListGamePartyScores_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_TradingDataService_ListGamePartyScores_0(ctx context.Context, marshaler runtime.Marshaler, client TradingDataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListGamePartyScoresRequest + 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_ListGamePartyScores_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListGamePartyScores(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_TradingDataService_ListGamePartyScores_0(ctx context.Context, marshaler runtime.Marshaler, server TradingDataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListGamePartyScoresRequest + 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_ListGamePartyScores_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListGamePartyScores(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_TradingDataService_ListAllPositions_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -4219,6 +4291,58 @@ func local_request_TradingDataService_GetVolumeDiscountStats_0(ctx context.Conte } +func request_TradingDataService_GetPartyVestingStats_0(ctx context.Context, marshaler runtime.Marshaler, client TradingDataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetPartyVestingStatsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["party_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "party_id") + } + + protoReq.PartyId, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "party_id", err) + } + + msg, err := client.GetPartyVestingStats(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_TradingDataService_GetPartyVestingStats_0(ctx context.Context, marshaler runtime.Marshaler, server TradingDataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetPartyVestingStatsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["party_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "party_id") + } + + protoReq.PartyId, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "party_id", err) + } + + msg, err := server.GetPartyVestingStats(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_TradingDataService_ObserveTransactionResults_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -4427,6 +4551,78 @@ func local_request_TradingDataService_GetTimeWeightedNotionalPosition_0(ctx cont } +var ( + filter_TradingDataService_ListAMMs_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_TradingDataService_ListAMMs_0(ctx context.Context, marshaler runtime.Marshaler, client TradingDataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListAMMsRequest + 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_ListAMMs_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListAMMs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_TradingDataService_ListAMMs_0(ctx context.Context, marshaler runtime.Marshaler, server TradingDataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListAMMsRequest + 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_ListAMMs_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListAMMs(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_TradingDataService_EstimateAMMBounds_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_TradingDataService_EstimateAMMBounds_0(ctx context.Context, marshaler runtime.Marshaler, client TradingDataServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq EstimateAMMBoundsRequest + 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_EstimateAMMBounds_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EstimateAMMBounds(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_TradingDataService_EstimateAMMBounds_0(ctx context.Context, marshaler runtime.Marshaler, server TradingDataServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq EstimateAMMBoundsRequest + 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_EstimateAMMBounds_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EstimateAMMBounds(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_TradingDataService_ExportNetworkHistory_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -4636,6 +4832,52 @@ func RegisterTradingDataServiceHandlerServer(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_ListGameTeamScores_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/ListGameTeamScores", runtime.WithHTTPPathPattern("/api/v2/games/team-scores")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TradingDataService_ListGameTeamScores_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_ListGameTeamScores_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_TradingDataService_ListGamePartyScores_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/ListGamePartyScores", runtime.WithHTTPPathPattern("/api/v2/games/party-scores")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TradingDataService_ListGamePartyScores_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_ListGamePartyScores_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_TradingDataService_ListAllPositions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -6682,6 +6924,29 @@ func RegisterTradingDataServiceHandlerServer(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_GetPartyVestingStats_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/GetPartyVestingStats", runtime.WithHTTPPathPattern("/api/v2/party/vesting/stats/{party_id}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TradingDataService_GetPartyVestingStats_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_GetPartyVestingStats_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_TradingDataService_ObserveTransactionResults_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) @@ -6804,6 +7069,52 @@ func RegisterTradingDataServiceHandlerServer(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_ListAMMs_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/ListAMMs", runtime.WithHTTPPathPattern("/api/v2/amms")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TradingDataService_ListAMMs_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_ListAMMs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_TradingDataService_EstimateAMMBounds_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/EstimateAMMBounds", runtime.WithHTTPPathPattern("/api/v2/estimate/amm/bounds")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_TradingDataService_EstimateAMMBounds_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_EstimateAMMBounds_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) @@ -7032,6 +7343,46 @@ func RegisterTradingDataServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_ListGameTeamScores_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/ListGameTeamScores", runtime.WithHTTPPathPattern("/api/v2/games/team-scores")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TradingDataService_ListGameTeamScores_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_ListGameTeamScores_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_TradingDataService_ListGamePartyScores_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/ListGamePartyScores", runtime.WithHTTPPathPattern("/api/v2/games/party-scores")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TradingDataService_ListGamePartyScores_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_ListGamePartyScores_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_TradingDataService_ListAllPositions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -8992,6 +9343,26 @@ func RegisterTradingDataServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_GetPartyVestingStats_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/GetPartyVestingStats", runtime.WithHTTPPathPattern("/api/v2/party/vesting/stats/{party_id}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TradingDataService_GetPartyVestingStats_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_GetPartyVestingStats_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_TradingDataService_ObserveTransactionResults_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -9112,6 +9483,46 @@ func RegisterTradingDataServiceHandlerClient(ctx context.Context, mux *runtime.S }) + mux.Handle("GET", pattern_TradingDataService_ListAMMs_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/ListAMMs", runtime.WithHTTPPathPattern("/api/v2/amms")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TradingDataService_ListAMMs_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_ListAMMs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_TradingDataService_EstimateAMMBounds_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/EstimateAMMBounds", runtime.WithHTTPPathPattern("/api/v2/estimate/amm/bounds")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_TradingDataService_EstimateAMMBounds_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_EstimateAMMBounds_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() @@ -9154,6 +9565,10 @@ var ( pattern_TradingDataService_ListStopOrders_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v2", "stoporders"}, "")) + pattern_TradingDataService_ListGameTeamScores_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "games", "team-scores"}, "")) + + pattern_TradingDataService_ListGamePartyScores_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "games", "party-scores"}, "")) + pattern_TradingDataService_ListAllPositions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v2", "positions"}, "")) pattern_TradingDataService_ObservePositions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "stream", "positions"}, "")) @@ -9350,6 +9765,8 @@ var ( pattern_TradingDataService_GetVolumeDiscountStats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "volume-discount-programs", "stats"}, "")) + pattern_TradingDataService_GetPartyVestingStats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"api", "v2", "party", "vesting", "stats", "party_id"}, "")) + pattern_TradingDataService_ObserveTransactionResults_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "stream", "transaction-results"}, "")) pattern_TradingDataService_EstimateTransferFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "transfers", "estimate-fee"}, "")) @@ -9362,6 +9779,10 @@ 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_ListAMMs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v2", "amms"}, "")) + + pattern_TradingDataService_EstimateAMMBounds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"api", "v2", "estimate", "amm", "bounds"}, "")) + pattern_TradingDataService_ExportNetworkHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "networkhistory", "export"}, "")) ) @@ -9384,6 +9805,10 @@ var ( forward_TradingDataService_ListStopOrders_0 = runtime.ForwardResponseMessage + forward_TradingDataService_ListGameTeamScores_0 = runtime.ForwardResponseMessage + + forward_TradingDataService_ListGamePartyScores_0 = runtime.ForwardResponseMessage + forward_TradingDataService_ListAllPositions_0 = runtime.ForwardResponseMessage forward_TradingDataService_ObservePositions_0 = runtime.ForwardResponseStream @@ -9580,6 +10005,8 @@ var ( forward_TradingDataService_GetVolumeDiscountStats_0 = runtime.ForwardResponseMessage + forward_TradingDataService_GetPartyVestingStats_0 = runtime.ForwardResponseMessage + forward_TradingDataService_ObserveTransactionResults_0 = runtime.ForwardResponseStream forward_TradingDataService_EstimateTransferFee_0 = runtime.ForwardResponseMessage @@ -9592,5 +10019,9 @@ var ( forward_TradingDataService_GetTimeWeightedNotionalPosition_0 = runtime.ForwardResponseMessage + forward_TradingDataService_ListAMMs_0 = runtime.ForwardResponseMessage + + forward_TradingDataService_EstimateAMMBounds_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..c776bc9ad10 100644 --- a/protos/data-node/api/v2/trading_data_grpc.pb.go +++ b/protos/data-node/api/v2/trading_data_grpc.pb.go @@ -62,6 +62,14 @@ type TradingDataServiceClient interface { // // Get a list of stop orders that match the given filters ListStopOrders(ctx context.Context, in *ListStopOrdersRequest, opts ...grpc.CallOption) (*ListStopOrdersResponse, error) + // List game team scores + // + // Get a list of team scores for the given filters + ListGameTeamScores(ctx context.Context, in *ListGameTeamScoresRequest, opts ...grpc.CallOption) (*ListGameTeamScoresResponse, error) + // List game party scores + // + // Get a list of party scores for the given filters + ListGamePartyScores(ctx context.Context, in *ListGamePartyScoresRequest, opts ...grpc.CallOption) (*ListGamePartyScoresResponse, error) // Deprecated: Do not use. // Deprecated: List positions // @@ -160,15 +168,17 @@ type TradingDataServiceClient interface { GetNetworkLimits(ctx context.Context, in *GetNetworkLimitsRequest, opts ...grpc.CallOption) (*GetNetworkLimitsResponse, error) // List candle data // - // Get a list of candle data for a given candle ID. Candle IDs can be obtained by calling list-candle-intervals + // Get a list of candle data for a given candle ID. + // A candle ID encapsulates a market ID and candle interval. A list of available candle IDs, and therefore candle intervals can be found using the list-candle-intervals API. ListCandleData(ctx context.Context, in *ListCandleDataRequest, opts ...grpc.CallOption) (*ListCandleDataResponse, error) // Observe candle data // - // Subscribe to a stream of candle updates + // Subscribe to a stream of candle updates given a candle ID. + // A candle ID encapsulates a market ID and candle interval. A list of available candle IDs, and therefore candle intervals can be found using the list-candle-intervals API. ObserveCandleData(ctx context.Context, in *ObserveCandleDataRequest, opts ...grpc.CallOption) (TradingDataService_ObserveCandleDataClient, error) // List candle intervals // - // Get a list of all available intervals for a given market along with the corresponding candle ID + // Get a list of all available candle intervals for a given market along with the corresponding candle ID. ListCandleIntervals(ctx context.Context, in *ListCandleIntervalsRequest, opts ...grpc.CallOption) (*ListCandleIntervalsResponse, error) // List votes // @@ -562,6 +572,14 @@ 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 AMMs + // + // Get a list of AMM or filter by market ID, party ID or AMM ID + ListAMMs(ctx context.Context, in *ListAMMsRequest, opts ...grpc.CallOption) (*ListAMMsResponse, error) + // Estimate AMM bounds + // + // Get a list of AMMs or filter by market ID, party ID or AMM ID + EstimateAMMBounds(ctx context.Context, in *EstimateAMMBoundsRequest, opts ...grpc.CallOption) (*EstimateAMMBoundsResponse, error) // Export network history as CSV // // Export CSV table data from network history between two block heights. @@ -765,6 +783,24 @@ func (c *tradingDataServiceClient) ListStopOrders(ctx context.Context, in *ListS return out, nil } +func (c *tradingDataServiceClient) ListGameTeamScores(ctx context.Context, in *ListGameTeamScoresRequest, opts ...grpc.CallOption) (*ListGameTeamScoresResponse, error) { + out := new(ListGameTeamScoresResponse) + err := c.cc.Invoke(ctx, "/datanode.api.v2.TradingDataService/ListGameTeamScores", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tradingDataServiceClient) ListGamePartyScores(ctx context.Context, in *ListGamePartyScoresRequest, opts ...grpc.CallOption) (*ListGamePartyScoresResponse, error) { + out := new(ListGamePartyScoresResponse) + err := c.cc.Invoke(ctx, "/datanode.api.v2.TradingDataService/ListGamePartyScores", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // Deprecated: Do not use. func (c *tradingDataServiceClient) ListPositions(ctx context.Context, in *ListPositionsRequest, opts ...grpc.CallOption) (*ListPositionsResponse, error) { out := new(ListPositionsResponse) @@ -2079,6 +2115,24 @@ func (c *tradingDataServiceClient) GetTimeWeightedNotionalPosition(ctx context.C return out, nil } +func (c *tradingDataServiceClient) ListAMMs(ctx context.Context, in *ListAMMsRequest, opts ...grpc.CallOption) (*ListAMMsResponse, error) { + out := new(ListAMMsResponse) + err := c.cc.Invoke(ctx, "/datanode.api.v2.TradingDataService/ListAMMs", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tradingDataServiceClient) EstimateAMMBounds(ctx context.Context, in *EstimateAMMBoundsRequest, opts ...grpc.CallOption) (*EstimateAMMBoundsResponse, error) { + out := new(EstimateAMMBoundsResponse) + err := c.cc.Invoke(ctx, "/datanode.api.v2.TradingDataService/EstimateAMMBounds", 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 { @@ -2163,6 +2217,14 @@ type TradingDataServiceServer interface { // // Get a list of stop orders that match the given filters ListStopOrders(context.Context, *ListStopOrdersRequest) (*ListStopOrdersResponse, error) + // List game team scores + // + // Get a list of team scores for the given filters + ListGameTeamScores(context.Context, *ListGameTeamScoresRequest) (*ListGameTeamScoresResponse, error) + // List game party scores + // + // Get a list of party scores for the given filters + ListGamePartyScores(context.Context, *ListGamePartyScoresRequest) (*ListGamePartyScoresResponse, error) // Deprecated: Do not use. // Deprecated: List positions // @@ -2261,15 +2323,17 @@ type TradingDataServiceServer interface { GetNetworkLimits(context.Context, *GetNetworkLimitsRequest) (*GetNetworkLimitsResponse, error) // List candle data // - // Get a list of candle data for a given candle ID. Candle IDs can be obtained by calling list-candle-intervals + // Get a list of candle data for a given candle ID. + // A candle ID encapsulates a market ID and candle interval. A list of available candle IDs, and therefore candle intervals can be found using the list-candle-intervals API. ListCandleData(context.Context, *ListCandleDataRequest) (*ListCandleDataResponse, error) // Observe candle data // - // Subscribe to a stream of candle updates + // Subscribe to a stream of candle updates given a candle ID. + // A candle ID encapsulates a market ID and candle interval. A list of available candle IDs, and therefore candle intervals can be found using the list-candle-intervals API. ObserveCandleData(*ObserveCandleDataRequest, TradingDataService_ObserveCandleDataServer) error // List candle intervals // - // Get a list of all available intervals for a given market along with the corresponding candle ID + // Get a list of all available candle intervals for a given market along with the corresponding candle ID. ListCandleIntervals(context.Context, *ListCandleIntervalsRequest) (*ListCandleIntervalsResponse, error) // List votes // @@ -2663,6 +2727,14 @@ 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 AMMs + // + // Get a list of AMM or filter by market ID, party ID or AMM ID + ListAMMs(context.Context, *ListAMMsRequest) (*ListAMMsResponse, error) + // Estimate AMM bounds + // + // Get a list of AMMs or filter by market ID, party ID or AMM ID + EstimateAMMBounds(context.Context, *EstimateAMMBoundsRequest) (*EstimateAMMBoundsResponse, error) // Export network history as CSV // // Export CSV table data from network history between two block heights. @@ -2763,6 +2835,12 @@ func (UnimplementedTradingDataServiceServer) GetStopOrder(context.Context, *GetS func (UnimplementedTradingDataServiceServer) ListStopOrders(context.Context, *ListStopOrdersRequest) (*ListStopOrdersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListStopOrders not implemented") } +func (UnimplementedTradingDataServiceServer) ListGameTeamScores(context.Context, *ListGameTeamScoresRequest) (*ListGameTeamScoresResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListGameTeamScores not implemented") +} +func (UnimplementedTradingDataServiceServer) ListGamePartyScores(context.Context, *ListGamePartyScoresRequest) (*ListGamePartyScoresResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListGamePartyScores not implemented") +} func (UnimplementedTradingDataServiceServer) ListPositions(context.Context, *ListPositionsRequest) (*ListPositionsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListPositions not implemented") } @@ -3093,6 +3171,12 @@ 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) ListAMMs(context.Context, *ListAMMsRequest) (*ListAMMsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListAMMs not implemented") +} +func (UnimplementedTradingDataServiceServer) EstimateAMMBounds(context.Context, *EstimateAMMBoundsRequest) (*EstimateAMMBoundsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EstimateAMMBounds not implemented") +} func (UnimplementedTradingDataServiceServer) ExportNetworkHistory(*ExportNetworkHistoryRequest, TradingDataService_ExportNetworkHistoryServer) error { return status.Errorf(codes.Unimplemented, "method ExportNetworkHistory not implemented") } @@ -3280,6 +3364,42 @@ func _TradingDataService_ListStopOrders_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _TradingDataService_ListGameTeamScores_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListGameTeamScoresRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TradingDataServiceServer).ListGameTeamScores(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/datanode.api.v2.TradingDataService/ListGameTeamScores", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TradingDataServiceServer).ListGameTeamScores(ctx, req.(*ListGameTeamScoresRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TradingDataService_ListGamePartyScores_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListGamePartyScoresRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TradingDataServiceServer).ListGamePartyScores(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/datanode.api.v2.TradingDataService/ListGamePartyScores", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TradingDataServiceServer).ListGamePartyScores(ctx, req.(*ListGamePartyScoresRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TradingDataService_ListPositions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListPositionsRequest) if err := dec(in); err != nil { @@ -5307,6 +5427,42 @@ func _TradingDataService_GetTimeWeightedNotionalPosition_Handler(srv interface{} return interceptor(ctx, in, info, handler) } +func _TradingDataService_ListAMMs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListAMMsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TradingDataServiceServer).ListAMMs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/datanode.api.v2.TradingDataService/ListAMMs", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TradingDataServiceServer).ListAMMs(ctx, req.(*ListAMMsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TradingDataService_EstimateAMMBounds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EstimateAMMBoundsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TradingDataServiceServer).EstimateAMMBounds(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/datanode.api.v2.TradingDataService/EstimateAMMBounds", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TradingDataServiceServer).EstimateAMMBounds(ctx, req.(*EstimateAMMBoundsRequest)) + } + 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 { @@ -5381,6 +5537,14 @@ var TradingDataService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListStopOrders", Handler: _TradingDataService_ListStopOrders_Handler, }, + { + MethodName: "ListGameTeamScores", + Handler: _TradingDataService_ListGameTeamScores_Handler, + }, + { + MethodName: "ListGamePartyScores", + Handler: _TradingDataService_ListGamePartyScores_Handler, + }, { MethodName: "ListPositions", Handler: _TradingDataService_ListPositions_Handler, @@ -5765,6 +5929,14 @@ var TradingDataService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetTimeWeightedNotionalPosition", Handler: _TradingDataService_GetTimeWeightedNotionalPosition_Handler, }, + { + MethodName: "ListAMMs", + Handler: _TradingDataService_ListAMMs_Handler, + }, + { + MethodName: "EstimateAMMBounds", + Handler: _TradingDataService_EstimateAMMBounds_Handler, + }, { MethodName: "Ping", Handler: _TradingDataService_Ping_Handler, diff --git a/protos/embed_test.go b/protos/embed_test.go index 5581a990eeb..a215325ff74 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 := 119 assert.Len(t, bindings.HTTP.Rules, wantCount) diff --git a/protos/sources/blockexplorer/api/v1/blockexplorer.proto b/protos/sources/blockexplorer/api/v1/blockexplorer.proto index f551d1c16ab..86a7652101f 100644 --- a/protos/sources/blockexplorer/api/v1/blockexplorer.proto +++ b/protos/sources/blockexplorer/api/v1/blockexplorer.proto @@ -11,7 +11,7 @@ option go_package = "code.vegaprotocol.io/vega/protos/blockexplorer/api/v1"; option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { info: { title: "Vega block explorer APIs"; - version: "v0.76.1"; + version: "v0.77.0"; } schemes: [ HTTP, diff --git a/protos/sources/data-node/api/v2/trading_data.proto b/protos/sources/data-node/api/v2/trading_data.proto index 98df40439f4..5118f83125d 100644 --- a/protos/sources/data-node/api/v2/trading_data.proto +++ b/protos/sources/data-node/api/v2/trading_data.proto @@ -17,7 +17,7 @@ option go_package = "code.vegaprotocol.io/vega/protos/data-node/api/v2"; option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { info: { title: "Vega data node APIs"; - version: "v0.76.1"; + version: "v0.77.0"; } schemes: [ HTTP, @@ -103,6 +103,20 @@ service TradingDataService { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Orders"}; } + // List game team scores + // + // Get a list of team scores for the given filters + rpc ListGameTeamScores(ListGameTeamScoresRequest) returns (ListGameTeamScoresResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Games"}; + } + + // List game party scores + // + // Get a list of party scores for the given filters + rpc ListGamePartyScores(ListGamePartyScoresRequest) returns (ListGamePartyScoresResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Games"}; + } + // Deprecated: List positions // // Get a list of positions by party's public key using cursor based pagination @@ -246,21 +260,23 @@ service TradingDataService { // List candle data // - // Get a list of candle data for a given candle ID. Candle IDs can be obtained by calling list-candle-intervals + // Get a list of candle data for a given candle ID. + // A candle ID encapsulates a market ID and candle interval. A list of available candle IDs, and therefore candle intervals can be found using the list-candle-intervals API. rpc ListCandleData(ListCandleDataRequest) returns (ListCandleDataResponse) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Candles"}; } // Observe candle data // - // Subscribe to a stream of candle updates + // Subscribe to a stream of candle updates given a candle ID. + // A candle ID encapsulates a market ID and candle interval. A list of available candle IDs, and therefore candle intervals can be found using the list-candle-intervals API. rpc ObserveCandleData(ObserveCandleDataRequest) returns (stream ObserveCandleDataResponse) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Candles"}; } // List candle intervals // - // Get a list of all available intervals for a given market along with the corresponding candle ID + // Get a list of all available candle intervals for a given market along with the corresponding candle ID. rpc ListCandleIntervals(ListCandleIntervalsRequest) returns (ListCandleIntervalsResponse) { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Candles"}; } @@ -937,6 +953,20 @@ service TradingDataService { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "Positions"}; } + // List AMMs + // + // Get a list of AMM or filter by market ID, party ID or AMM ID + rpc ListAMMs(ListAMMsRequest) returns (ListAMMsResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "AMMs"}; + } + + // Estimate AMM bounds + // + // Get a list of AMMs or filter by market ID, party ID or AMM ID + rpc EstimateAMMBounds(EstimateAMMBoundsRequest) returns (EstimateAMMBoundsResponse) { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {tags: "AMMs"}; + } + // Export network history as CSV // // Export CSV table data from network history between two block heights. @@ -1078,6 +1108,10 @@ message GetPartyVestingStatsResponse { uint64 epoch_seq = 3; // The balance of the party, in quantum. string quantum_balance = 4; + // Bonus multiplier applied on the reward, summed across all derived accounts. + string summed_reward_bonus_multiplier = 5; + // The balance of the party and derived keys, in quantum. + string summed_quantum_balance = 6; } // Request sent to list the vesting and locked balances for a party @@ -1118,6 +1152,9 @@ message AccountBalance { string market_id = 5; // Account type of this account. vega.AccountType type = 6; + // Parent party ID of the account. + // This field is optional and is used in cases where the account is derived from another party's account. + optional string parent_party_id = 7; } // Request that is sent when listing accounts. @@ -1126,6 +1163,9 @@ message ListAccountsRequest { AccountFilter filter = 1; // Optional pagination control. optional Pagination pagination = 2; + // Whether to return all derived parties from AMMs for the given party. + // If used, party ID is required. + optional bool include_derived_parties = 3; } // Response that is received from listing accounts query. @@ -1160,6 +1200,9 @@ message ObserveAccountsRequest { string asset = 3; // Account type to subscribe to, required field. vega.AccountType type = 4; + // Whether to return all derived parties from AMMs for the given party. + // If used, party ID is required. + optional bool include_derived_parties = 5; } // Response that is received when subscribing to a stream of accounts. @@ -1316,6 +1359,88 @@ message GetStopOrderResponse { vega.events.v1.StopOrderEvent order = 1; } +// Request that is sent when executing a query for a list of team game scores. +message ListGameTeamScoresRequest { + // Optional pagination control. + optional Pagination pagination = 1; + // Team games filter contains all filtering conditions and values that are applied to the team games score listing. + optional GameTeamScoresFilter filter = 2; +} + +message GameTeamScoresFilter { + // Restrict game scores to the given ones. + repeated string game_ids = 1; + // Restrict game scores to those for the given teams. + repeated string team_ids = 2; + // Restrict game scores to those from a given epoch. + optional uint64 epoch_from = 3; + // Restrict game scores to those up to a given epoch. + optional uint64 epoch_to = 4; +} + +// Response received from the query for getting a list of game scores for teams. +message ListGameTeamScoresResponse { + // Page of team game scores data and corresponding page information. + GameTeamScoresConnection team_scores = 1; +} + +// Page of team game scores data and corresponding page information. +message GameTeamScoresConnection { + // Page of orders and their corresponding cursors. + repeated GameTeamScoresEdge edges = 1; + // Page information that is used for fetching further pages. + PageInfo page_info = 2; +} + +message GameTeamScoresEdge { + // Data associated with an order submitted to a Vega node. + vega.events.v1.GameTeamScore node = 1; + // Cursor that can be used to fetch further pages. + string cursor = 2; +} + +// Request that is sent when executing a query for a list of party game scores. +message ListGamePartyScoresRequest { + // Optional pagination control. + optional Pagination pagination = 1; + // Party games filter contains all filtering conditions and values that are applied to the party games score listing. + optional GamePartyScoresFilter filter = 2; +} + +message GamePartyScoresFilter { + // Restrict game scores to those in the given games. + repeated string game_ids = 1; + // Restrict game scores to the parties in the given teams. + repeated string team_ids = 2; + // Restrict game scores to those relating to the given parties. + repeated string party_ids = 3; + // Restrict game scores to those from a given epoch. + optional uint64 epoch_from = 4; + // Restrict game scores to those up to a given epoch. + optional uint64 epoch_to = 5; +} + +// Response received from the query for getting a list of game scores for teams. +message ListGamePartyScoresResponse { + // Page of party game scores data and corresponding page information. + GamePartyScoresConnection party_scores = 1; +} + +// Page of party game scores data and corresponding page information. +message GamePartyScoresConnection { + // Page of orders and their corresponding cursors. + repeated GamePartyScoresEdge edges = 1; + // Page information that is used for fetching further pages. + PageInfo page_info = 2; +} + +message GamePartyScoresEdge { + // Data associated with an order submitted to a Vega node. + vega.events.v1.GamePartyScore node = 1; + // Cursor that can be used to fetch further pages. + string cursor = 2; +} + // Request that is sent when executing a query for a list of stop orders. message ListStopOrdersRequest { // Optional pagination control. @@ -1429,6 +1554,9 @@ message ObservePositionsRequest { optional string party_id = 1; // Restrict position updates to those related to the given markets. optional string market_id = 2; + // Whether to return all derived parties from AMMs for the given party. + // If used, party ID is required. + optional bool include_derived_parties = 3; } // Response received from a positions subscription request @@ -2595,6 +2723,10 @@ message ListRewardsRequest { optional string team_id = 6; // Filter for rewards paid if the party participated in the given game optional string game_id = 7; + // Whether to return all derived parties from AMMs for the given party. + optional bool include_derived_parties = 8; + // Filter the rewards by market ID. + optional string market_id = 9; } // Response for listing reward details for a single party @@ -2627,6 +2759,9 @@ message ListRewardSummariesRequest { optional string asset_id = 2; // Pagination controls. optional Pagination pagination = 3; + // Whether to return rewards for all derived parties from AMMs for the given party. + // If used, party ID is required. + optional bool include_derived_parties = 8; } // Response from listing reward details in for a single party @@ -2982,6 +3117,12 @@ message ListPaidLiquidityFeesRequest { repeated string party_ids = 4; // Pagination controls. optional Pagination pagination = 5; + // Whether to return all derived parties from AMMs for the given party. If used, party ID is required. + optional bool include_derived_parties = 6; + // Restrict paid liquidity fees to those from a given epoch. + optional uint64 epoch_from = 7; + // Restrict paid liquidity fees to those up to a given epoch. + optional uint64 epoch_to = 8; } // Paid liquidity fees response. @@ -4461,6 +4602,10 @@ message GetFeesStatsRequest { optional uint64 epoch_seq = 3; // Restrict fee statistics to those for the given party. optional string party_id = 4; + // Restrict fee statistics to epoch range starting with epoch from. + optional uint64 epoch_from = 5; + // Restrict fee statistics to epoch range ending with epoch to. + optional uint64 epoch_to = 6; } // Response that is sent when requesting fees statistics. @@ -4607,6 +4752,9 @@ message EstimateTransferFeeRequest { string amount = 4; // Asset ID for the asset associated with the transaction. string asset_id = 5; + // AMM public key, if assets are being transferred from an AMM key to the AMM owner's public key. + // The `from_account` must be the owner of this AMM key. + optional string from_amm_key = 6; } // Results of estimation of transfer fee and the fee discount @@ -4844,3 +4992,74 @@ message GetTimeWeightedNotionalPositionResponse { // Time weighted notional position for the party and asset. TimeWeightedNotionalPosition time_weighted_notional_position = 1; } + +message ListAMMsRequest { + // AMM ID to filter for. If party ID or market ID is provided, the ID filter is ignored. + optional string id = 1; + // Party ID to filter for. + optional string party_id = 2; + // Market ID to filter for. If party ID is provided, the market filter is ignored + optional string market_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. + optional string amm_party_id = 4; + // Filter for AMMs with the given status. This filter will be ignored if any of the other + // filters have been set. + optional vega.events.v1.AMM.Status status = 5; + // Pagination controls. + optional Pagination pagination = 6; +} + +message ListAMMsResponse { + // Page of AMM data and corresponding page information. + AMMConnection amms = 1; +} + +message AMMConnection { + // Page of AMM data and the corresponding cursors. + repeated AMMEdge edges = 1; + // Page information that is used for fetching further pages. + PageInfo page_info = 2; +} + +message AMMEdge { + // AMM pool data. + vega.events.v1.AMM node = 1; + // Cursor that can be used to fetch further pages. + string cursor = 2; +} + +message EstimateAMMBoundsRequest { + // Base price of the AMM pool, the price is an integer, for example `123456` is a correctly + // formatted price of `1.23456` assuming market configured to 5 decimal places. + string base_price = 1; + // Upper price of the AMM pool, the price is an integer, for example `123456` is a correctly + // formatted price of `1.23456` assuming market configured to 5 decimal places. + optional string upper_price = 2; + // Lower price of the AMM pool, the price is an integer, for example `123456` is a correctly + // formatted price of `1.23456` assuming market configured to 5 decimal places. + optional string lower_price = 3; + // Leverage at the upper price of the AMM pool. + optional string leverage_at_upper_price = 4; + // Leverage at the lower price of the AMM pool. + optional string leverage_at_lower_price = 5; + // Amount of the asset that the party is willing to commit to the AMM pool. + string commitment_amount = 6; + // Market ID to estimate the AMM for. + string market_id = 7; +} + +message EstimateAMMBoundsResponse { + // Theoretical volume at the top of the upper bound. + string position_size_at_upper = 1; + // Theoretical volume at the top of the lower bound. + string position_size_at_lower = 2; + // Loss of commitment at the upper bound. + string loss_on_commitment_at_upper = 3; + // Loss of commitment at the lower bound. + string loss_on_commitment_at_lower = 4; + // Estimated price above upper bound at which the commitment will be lost. + string liquidation_price_at_upper = 5; + // Estimated price below the lower bound at which the commitment will be lost. + string liquidation_price_at_lower = 6; +} diff --git a/protos/sources/data-node/grpc-rest-bindings.yml b/protos/sources/data-node/grpc-rest-bindings.yml index 60d5fec7d7b..bd1ddcc4509 100644 --- a/protos/sources/data-node/grpc-rest-bindings.yml +++ b/protos/sources/data-node/grpc-rest-bindings.yml @@ -79,6 +79,8 @@ http: get: "/api/v2/successor_markets/{market_id}" - selector: datanode.api.v2.TradingDataService.GetPartyActivityStreak get: "/api/v2/party/activity/streak/{party_id}" + - selector: datanode.api.v2.TradingDataService.GetPartyVestingStats + get: "/api/v2/party/vesting/stats/{party_id}" - selector: datanode.api.v2.TradingDataService.GetParty get: "/api/v2/party/{party_id}" - selector: datanode.api.v2.TradingDataService.ListParties @@ -209,6 +211,14 @@ http: get: "/api/v2/margin-modes" - selector: datanode.api.v2.TradingDataService.GetTimeWeightedNotionalPosition get: "/api/v2/time-weighted-notional-position" + - selector: datanode.api.v2.TradingDataService.ListGamePartyScores + get: "/api/v2/games/party-scores" + - selector: datanode.api.v2.TradingDataService.ListGameTeamScores + get: "/api/v2/games/team-scores" + - selector: datanode.api.v2.TradingDataService.ListAMMs + get: "/api/v2/amms" + - selector: datanode.api.v2.TradingDataService.EstimateAMMBounds + get: "/api/v2/estimate/amm/bounds" # websockets diff --git a/protos/sources/vega/api/v1/core.proto b/protos/sources/vega/api/v1/core.proto index a06f3221ab6..7b2a8f13b70 100644 --- a/protos/sources/vega/api/v1/core.proto +++ b/protos/sources/vega/api/v1/core.proto @@ -12,7 +12,7 @@ option go_package = "code.vegaprotocol.io/vega/protos/vega/api/v1"; option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { info: { title: "Vega core APIs"; - version: "v0.76.1"; + version: "v0.77.0"; } schemes: [ HTTP, diff --git a/protos/sources/vega/api/v1/corestate.proto b/protos/sources/vega/api/v1/corestate.proto index 956a98a9aee..102ee662f05 100644 --- a/protos/sources/vega/api/v1/corestate.proto +++ b/protos/sources/vega/api/v1/corestate.proto @@ -13,7 +13,7 @@ option go_package = "code.vegaprotocol.io/vega/protos/vega/api/v1"; option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { info: { title: "Vega core state APIs"; - version: "v0.76.1"; + version: "v0.77.0"; } schemes: [ HTTP, diff --git a/protos/sources/vega/chain_events.proto b/protos/sources/vega/chain_events.proto index 179fb75b98f..49e038edd27 100644 --- a/protos/sources/vega/chain_events.proto +++ b/protos/sources/vega/chain_events.proto @@ -4,6 +4,18 @@ package vega; option go_package = "code.vegaprotocol.io/vega/protos/vega"; +// Heartbeat represents that the ERC20 bridge is being watched even though no events happened. +message ERC20Heartbeat { + // Contract address that is being listened to + string contract_address = 1; + // Last Ethereum block height that was checked for events + uint64 block_height = 2; + // Ethereum block time in Unix seconds. + uint64 block_time = 3; + // Source chain for this chain event. + string source_chain_id = 6; +} + // Result of calling an arbitrary Ethereum contract method message EthContractCallEvent { // ID of the data source spec that triggered this contract call. diff --git a/protos/sources/vega/checkpoint/v1/checkpoint.proto b/protos/sources/vega/checkpoint/v1/checkpoint.proto index 58c9ab12af3..e352e8e9438 100644 --- a/protos/sources/vega/checkpoint/v1/checkpoint.proto +++ b/protos/sources/vega/checkpoint/v1/checkpoint.proto @@ -146,6 +146,7 @@ message ScheduledTransferAtTime { message RecurringTransfers { repeated vega.events.v1.Transfer recurring_transfers = 1; + int64 next_metric_update = 2; } message GovernanceTransfer { @@ -242,6 +243,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..0dab1fef613 100644 --- a/protos/sources/vega/commands/v1/commands.proto +++ b/protos/sources/vega/commands/v1/commands.proto @@ -304,6 +304,12 @@ message Transfer { string amount = 5; // Reference to be attached to the transfer. string reference = 6; + // AMM key from which assets are to be transferred, if applicable. + // The submitter of the transaction must be the owner of this AMM key. + // If provided, the 'from_account_type' must be REWARDS_VESTED, and the asset in this account + // must match the asset specified in the transfer. + optional string from = 7; + // Specific details of the transfer. oneof kind { // Details of a one-off transfer that is executed once at a specified time. @@ -428,3 +434,78 @@ message UpdatePartyProfile { // Support a maximum of 10 entries. repeated vega.Metadata metadata = 2; } + +// Command to create an automated market maker for a given market. +message SubmitAMM { + // Market ID for which to create an AMM. + string market_id = 1; + // Amount to be committed to the AMM. + string commitment_amount = 2; + // Slippage tolerance used for rebasing the AMM if its base price crosses with existing order + string slippage_tolerance = 3; + // Concentrated liquidity parameters defining the shape of the AMM's volume curves. + 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 { + // Price at which the AMM will stop quoting sell volume. If not supplied the AMM will never hold a short position. + optional string upper_bound = 1; + // Price at which the AMM will stop quoting buy volume. If not supplied the AMM will never hold a long position. + optional string lower_bound = 2; + // Price that the AMM will quote as its "fair price" when its position is zero. + string base = 3; + // Leverage at upper bound. If not set the markets risk-factors will be used to calculate leverage. + optional string leverage_at_upper_bound = 4; + // Leverage at lower bound. If not set the markets risk-factors will be used to calculate leverage. + optional string leverage_at_lower_bound = 5; + } +} + +// Command to amend an existing automated market maker on a market. +message AmendAMM { + // Market ID for the AMM to be amended. + string market_id = 1; + // Amount to be committed to the AMM. If not supplied the commitment will remain unchanged. + optional string commitment_amount = 2; + // Slippage tolerance for rebasing position when updating the AMM. + string slippage_tolerance = 3; + // Concentrated liquidity parameters defining the shape of the AMM's volume curves. If not supplied the parameters will remain unchanged. + optional ConcentratedLiquidityParameters concentrated_liquidity_parameters = 4; + // Nominated liquidity fee factor, which is an input to the calculation of taker fees on the market. If not supplied the proposed fee will remain unchanged. + optional string proposed_fee = 5; + // Liquidity parameters that define the size and range of the AMM's tradeable volume. + message ConcentratedLiquidityParameters { + // Price at which the AMM will stop quoting sell volume. If not supplied the AMM will never hold a short position. + optional string upper_bound = 1; + // Price at which the AMM will stop quoting buy volume. If not supplied the AMM will never hold a long position. + optional string lower_bound = 2; + // Price that the AMM will quote as its "fair price" when its position is zero. + string base = 3; + // Leverage at upper bound. If not set the markets risk-factors will be used to calculate leverage. + optional string leverage_at_upper_bound = 4; + // Leverage at lower bound. If not set the markets risk-factors will be used to calculate leverage. + optional string leverage_at_lower_bound = 5; + } +} + +// Command to cancel an automated market maker 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; +} + +// Internal transactions used to convey delayed transactions to be included in the next block. +message DelayedTransactionsWrapper { + repeated bytes transactions = 1; + uint64 height = 2; +} diff --git a/protos/sources/vega/commands/v1/transaction.proto b/protos/sources/vega/commands/v1/transaction.proto index 43373827555..052daee95ff 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. @@ -89,6 +96,8 @@ message InputData { IssueSignatures issue_signatures = 2010; // Command to submit external oracle data. OracleDataSubmission oracle_data_submission = 3001; + // Internal transactions used to convey delayed transactions to be included in the next block. + DelayedTransactionsWrapper delayed_transactions_wrapper = 4000; } } diff --git a/protos/sources/vega/commands/v1/validator_commands.proto b/protos/sources/vega/commands/v1/validator_commands.proto index 24581d3f247..abd42307647 100644 --- a/protos/sources/vega/commands/v1/validator_commands.proto +++ b/protos/sources/vega/commands/v1/validator_commands.proto @@ -89,6 +89,8 @@ message NodeVote { TYPE_GOVERNANCE_VALIDATE_ASSET = 12; // Node vote for an Ethereum contract call result TYPE_ETHEREUM_CONTRACT_CALL_RESULT = 13; + // Node vote for an Ethereum chain event heartbeat. + TYPE_ETHEREUM_HEARTBEAT = 14; } } @@ -137,6 +139,8 @@ message ChainEvent { vega.ERC20MultiSigEvent erc20_multisig = 1006; // Ethereum contract call event. vega.EthContractCallEvent contract_call = 1007; + // Heartbeat showing evidence that a contract is being listened to. + vega.ERC20Heartbeat heartbeat = 1008; } } diff --git a/protos/sources/vega/events/v1/events.proto b/protos/sources/vega/events/v1/events.proto index fc9efbf3e9d..6e64b764a94 100644 --- a/protos/sources/vega/events/v1/events.proto +++ b/protos/sources/vega/events/v1/events.proto @@ -31,6 +31,82 @@ message TimeWeightedNotionalPositionUpdated { string time_weighted_notional_position = 5; } +message AMM { + // ID of the AMM. + string id = 1; + // Party ID of the owner of the AMM. + string party_id = 2; + // Market ID that the AMM provides liquidity for. + string market_id = 3; + // Party ID that the AMM operates as. + string amm_party_id = 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; + // Nominated liquidity fee factor, which is an input to the calculation of taker fees on the market. + string proposed_fee = 9; + optional Curve lower_curve = 10; + optional Curve upper_curve = 11; + + enum Status { + STATUS_UNSPECIFIED = 0; + // AMM is active on the market and is posting tradable volume. + 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 its owner. + 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_AMM_FOR_MARKET = 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; + // Commitment amount was below the network wide minimum, or its price bounds are too wide, such that the volume is spread thinly creating zero-volume price-levels. + STATUS_REASON_COMMITMENT_TOO_LOW = 6; + // AMM was unable to rebase its fair-price such that it does not cross with existing orders. + 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 AMM. + string base = 1; + // Upper price bound configuration for the AMM. If unset, the AMM will never hold a short position. + optional string lower_bound = 2; + // Lower price bound configuration for the AMM. If unset, the AMM will never hold a long position. + optional string upper_bound = 3; + // Leverage at upper bounds. + optional string leverage_at_upper_bound = 4; + // Leverage at lower bounds. + optional string leverage_at_lower_bound = 5; + } + + message Curve { + // Virtual liquidity for the given AMM curve. + string virtual_liquidity = 1; + // Maximum tradable volume on the AMM curve. + string theoretical_position = 2; + } +} + // Summary of the vesting and locked balances for an epoch message VestingBalancesSummary { // Epoch for which these balances are valid. @@ -101,6 +177,10 @@ message PartyVestingStats { string reward_bonus_multiplier = 2; // The balance of the party, in quantum. string quantum_balance = 3; + // Bonus multiplier applied on the reward, summed across all derived accounts. + string summed_reward_bonus_multiplier = 4; + // The balance of the party and derived keys, in quantum. + string summed_quantum_balance = 5; } // Fees rewards and discounts paid / received per parties during an epoch @@ -349,6 +429,7 @@ message RecurringGovernanceTransfer { uint64 start_epoch = 1; optional uint64 end_epoch = 2; optional DispatchStrategy dispatch_strategy = 3; + string factor = 4; } // StakeLinking - an event notifying of stake being deposited or removed for a given party @@ -543,6 +624,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 @@ -1136,6 +1220,51 @@ message TeamMemberStats { string notional_volume = 2; } +// Scores per party per game with eligibility context. +message GamePartyScore { + // Game ID. + string game_id = 1; + // The party ID. + string party = 2; + // Team the party belongs to. Unset if the party is not part of a team. + optional string team_id = 3; + // Epoch when these scores were generated. + int64 epoch = 4; + // Timestamp in Unix nanoseconds when these scores were generated. + int64 time = 5; + // Party's current score in the game. + string score = 6; + // Party's current staking balance. Only populated if the game has a requirement for it. + string staking_balance = 7; + // Party's current open volume. Only populated if the game has a requirement for it. + string open_volume = 8; + // Total fees paid by the party during the relevant period. + string total_fees_paid = 9; + // If the party is eligible for a reward for this game based on the current information. + bool is_eligible = 10; + // If the party is a member of a team, this is their relative position in the sorting order of the team. + // Empty if not a team, or if the party is not eligible. + optional uint64 rank = 11; +} + +message GameTeamScore { + // Game ID. + string game_id = 1; + // Team ID + string team_id = 2; + // Epoch when these scores were generated. + int64 epoch = 3; + // Timestamp in Unix nanoseconds when these scores were generated. + int64 time = 4; + // Team's current collective score in the game. + string score = 5; +} + +message GameScores { + repeated GameTeamScore team_scores = 1; + repeated GamePartyScore party_scores = 2; +} + // Bus event type is used to specify a type of event // It has 2 styles of event: // Single values (e.g. BUS_EVENT_TYPE_ORDER) where they represent one data item @@ -1355,6 +1484,12 @@ enum BusEventType { // Event containing the IDs of orders cancelled by a party on a market. BUS_EVENT_TYPE_CANCELLED_ORDERS = 89; + // Event containing the near realtime game scores for parties and teams. + BUS_EVENT_TYPE_GAME_SCORES = 90; + + // Event use to notify for an AMM update. + BUS_EVENT_TYPE_AMM = 91; + // Event indicating a market related event, for example when a market opens BUS_EVENT_TYPE_MARKET = 101; // Event used to report failed transactions back to a user, this is excluded from the ALL type @@ -1542,6 +1677,10 @@ 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 on near realtime game scores for parties and teams. + GameScores game_scores = 188; + // Event notifying of AMM updates. + AMM amm = 189; // Market tick events MarketEvent market = 1001; diff --git a/protos/sources/vega/governance.proto b/protos/sources/vega/governance.proto index 21196ffbf39..8ecd32f7890 100644 --- a/protos/sources/vega/governance.proto +++ b/protos/sources/vega/governance.proto @@ -29,6 +29,8 @@ message FutureProduct { vega.DataSourceDefinition data_source_spec_for_trading_termination = 4; // Binding between the data source spec and the settlement data. DataSourceSpecToFutureBinding data_source_spec_binding = 5; + // If set, this product creates a capped future market. + optional FutureCap cap = 6; } // Perpetual product configuration @@ -105,6 +107,8 @@ message NewSpotMarketConfiguration { LiquidityFeeSettings liquidity_fee_settings = 8; // The market tick size defines the minimum change in quote price for the market string tick_size = 9; + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + bool enable_transaction_reordering = 10; } // Configuration for a new futures market on Vega @@ -148,6 +152,8 @@ message NewMarketConfiguration { CompositePriceConfiguration mark_price_configuration = 15; // The market tick size defines the minimum change in quote price for the market string tick_size = 16; + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + bool enable_transaction_reordering = 17; } // New spot market on Vega @@ -221,6 +227,8 @@ message UpdateMarketConfiguration { CompositePriceConfiguration mark_price_configuration = 11; // The market tick size defines the minimum change in quote price for the market string tick_size = 12; + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + bool enable_transaction_reordering = 13; } // Configuration to update a spot market on Vega @@ -246,6 +254,8 @@ message UpdateSpotMarketConfiguration { string tick_size = 6; // Specifies the name and code of the spot instrument. UpdateSpotInstrumentConfiguration instrument = 7; + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + bool enable_transaction_reordering = 8; } message UpdateSpotInstrumentConfiguration { @@ -845,4 +855,7 @@ message RecurringTransfer { optional uint64 end_epoch = 2; // Optional parameter defining how a transfer is dispatched. optional vega.DispatchStrategy dispatch_strategy = 3; + // Factor that the initial transfer amount is multiplied by for each epoch that it is executed. + // For example if the initial transfer amount is 1000 and the factor is 0.5, then the amounts transferred per epoch will be 1000, 500, 250, 125, etc. + string factor = 4; } diff --git a/protos/sources/vega/markets.proto b/protos/sources/vega/markets.proto index 686a0c68c48..b662e92033a 100644 --- a/protos/sources/vega/markets.proto +++ b/protos/sources/vega/markets.proto @@ -42,6 +42,17 @@ message Future { // Binding between the data spec and the data source. DataSourceSpecToFutureBinding data_source_spec_binding = 5; + // If set, this product represents a capped future market. + optional FutureCap cap = 6; +} + +message FutureCap { + // Set the maximum price for orders, and settlement data in market decimals. + string max_price = 1; + // If set to true, the settlement price must either be zero, or equal to the max price. + optional bool binary_settlement = 2; + // If set to true, positions must be fully collateralised so there is no default risk for any party. + optional bool fully_collateralised = 3; } // Perpetual product definition @@ -132,6 +143,16 @@ message LogNormalRiskModel { double tau = 2; // Risk model parameters for log normal. LogNormalModelParams params = 3; + // And optional override for the risk factor calculated by the risk model. + optional RiskFactorOverride risk_factor_override = 4; +} + +// Risk factor override to control stable leverage +message RiskFactorOverride { + // Short Risk factor value. + string short = 1; + // Long Risk factor value. + string long = 2; } // Risk model parameters for log normal @@ -182,6 +203,8 @@ message ScalingFactors { message MarginCalculator { // Scaling factors for margin calculation. ScalingFactors scaling_factors = 1; + // If set to true, positions must be fully collateralised so there is no default risk for any party (capped futures). + optional bool fully_collateralised = 2; } // Tradable Instrument definition @@ -334,6 +357,8 @@ message Market { TRADING_MODE_NO_TRADING = 5; // Special auction mode triggered via governance TRADING_MODE_SUSPENDED_VIA_GOVERNANCE = 6; + // Auction triggered globally by long block + TRADING_MODE_LONG_BLOCK_AUCTION = 7; // Note: If adding an enum value, add a matching entry in: // - gateway/graphql/helpers_enum.go @@ -387,6 +412,8 @@ message Market { CompositePriceConfiguration mark_price_configuration = 20; // The market tick size defines the minimum change in quote price for the market string tick_size = 21; + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + bool enable_transaction_reordering = 22; } // Time stamps for important times about creating, enacting etc the market diff --git a/protos/sources/vega/snapshot/v1/snapshot.proto b/protos/sources/vega/snapshot/v1/snapshot.proto index 26186f26056..8dcdaacc343 100644 --- a/protos/sources/vega/snapshot/v1/snapshot.proto +++ b/protos/sources/vega/snapshot/v1/snapshot.proto @@ -148,6 +148,8 @@ message Payload { EthOracleVerifierMisc eth_oracle_verifier_misc = 85; BankingEVMBridgeStates banking_evm_bridge_states = 86; EVMMultisigTopologies evm_multisig_topologies = 87; + TxCache tx_cache = 88; + EVMFwdHeartbeats evm_fwd_heartbeats = 89; } } @@ -299,6 +301,7 @@ message BankingAssetActions { message BankingRecurringTransfers { vega.checkpoint.v1.RecurringTransfers recurring_transfers = 1; + int64 next_metric_update = 2; } message BankingScheduledTransfers { @@ -551,6 +554,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 +562,43 @@ message PartyMarginFactor { string margin_factor = 2; } +message AmmState { + repeated StringMapEntry sqrter = 1; + repeated StringMapEntry amm_party_ids = 2; + repeated PoolMapEntry pools = 3; +} + +message PoolMapEntry { + message Curve { + string l = 1; + string high = 2; + string low = 3; + string pv = 4; + bool empty = 5; + } + + message Pool { + string id = 1; + string amm_party_id = 2; + string commitment = 3; + vega.events.v1.AMM.ConcentratedLiquidityParameters parameters = 4; + string asset = 5; + string market = 6; + Curve lower = 7; + Curve upper = 8; + vega.events.v1.AMM.Status status = 9; + string proposed_fee = 10; + } + + string party = 1; + Pool pool = 2; +} + +message StringMapEntry { + string key = 1; + string value = 2; +} + // eventually support multiple products message Product { oneof type { @@ -705,6 +746,7 @@ message AppState { string chain_id = 4; string protocol_version = 5; bool protocol_upgrade = 6; + int64 prev_block_time = 7; } // EpochState details @@ -761,6 +803,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 { @@ -1368,8 +1411,45 @@ message PartyProfile { string party_id = 1; string alias = 2; repeated vega.Metadata metadata = 3; + repeated string derived_keys = 4; +} + +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; +} + +message DelayedTx { + repeated bytes tx = 1; + uint64 height = 2; +} + +message TxCache { + repeated DelayedTx txs = 1; +} + +message EVMFwdPendingHeartbeat { + uint64 block_height = 1; + uint64 block_time = 2; + string contract_address = 3; + string chain_id = 4; +} + +message EVMFwdLastSeen { + string chain_id = 1; + string contract_address = 2; + uint64 block_height = 3; +} + +message EVMFwdHeartbeats { + repeated EVMFwdPendingHeartbeat pending_heartbeats = 1; + repeated EVMFwdLastSeen last_seen = 2; } diff --git a/protos/sources/vega/vega.proto b/protos/sources/vega/vega.proto index 7b0f51a4708..29ed5b7c4ec 100644 --- a/protos/sources/vega/vega.proto +++ b/protos/sources/vega/vega.proto @@ -15,6 +15,8 @@ message PartyProfile { // Metadata to associate to a party, in a key/value format where the key // describes the type of metadata in the value field. repeated vega.Metadata metadata = 3; + // Derived keys for the party. + repeated string derived_keys = 4; } // Generic structure holding a key/value pair. @@ -236,6 +238,8 @@ enum AuctionTrigger { AUCTION_TRIGGER_UNABLE_TO_DEPLOY_LP_ORDERS = 6 [deprecated = true]; // Market is suspended and put into auction via governance AUCTION_TRIGGER_GOVERNANCE_SUSPENSION = 7; + // Market is suspended in response to a long block + AUCTION_TRIGGER_LONG_BLOCK = 8; } // Pegged reference defines which price point a pegged order is linked to - meaning @@ -534,7 +538,8 @@ enum OrderError { ORDER_ERROR_PEGGED_ORDERS_NOT_ALLOWED_IN_ISOLATED_MARGIN_MODE = 52; // Order price does not respect market's required tick size ORDER_ERROR_PRICE_NOT_IN_TICK_SIZE = 53; - + // Order price exceeds the max price of the capped future market + ORDER_ERROR_PRICE_MUST_BE_LESS_THAN_OR_EQUAL_TO_MAX_PRICE = 54; // Note: If adding an enum value, add a matching entry in: // - proto/errors.go (func Error) // - gateway/graphql/schema.graphql (enum RejectionReason) @@ -661,6 +666,10 @@ message PriceLevel { uint64 number_of_orders = 2; // Volume at the price level. uint64 volume = 3; + // Volume of AMM's at the price level. + uint64 amm_volume = 4; + // Estimated AMM volume at the price level. + uint64 amm_volume_estimated = 5; } // Represents market depth or order book data for the specified market on Vega @@ -1046,6 +1055,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 general account. + TRANSFER_TYPE_AMM_LOW = 49; + // Transfer from an AMM's general account to their owner's general account. + TRANSFER_TYPE_AMM_HIGH = 50; + // Transfer releasing an AMM's general account upon closure. + TRANSFER_TYPE_AMM_RELEASE = 51; } // Represents a financial transfer within Vega @@ -1100,6 +1115,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 { @@ -1415,6 +1432,8 @@ message PriceMonitoringBounds { PriceMonitoringTrigger trigger = 3; // Reference price used to calculate the valid price range. This field is an unsigned integer scaled to the market's decimal places. string reference_price = 4; + // Has this bound been triggered yet or is it still active. + bool active = 5; } // Represents Vega domain specific error information over gRPC/Protobuf @@ -1457,6 +1476,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 @@ -1568,6 +1589,8 @@ message EthereumConfig { EthereumContractConfig token_vesting_contract = 6; // Contract configuration of the multisig control contract for this Ethereum network. EthereumContractConfig multisig_control_contract = 7; + // Approximate block time of the EVM chain as a duration e.g. 12s, 250ms. + string block_time = 8; } // EVM Chain configuration details. @@ -1971,3 +1994,15 @@ enum MarginMode { // Isolated margin mode - margin for any newly opened position volume is transferred to the margin account when the trade is executed MARGIN_MODE_ISOLATED_MARGIN = 2; } + +message LongBlockAuction { + // Threshold for a long block. + string threshold = 1; + // Auction duration for the given threshold. + string duration = 2; +} + +message LongBlockAuctionDurationTable { + // Slice of thresholds and durations for corresponding auctions. + repeated LongBlockAuction threshold_and_duration = 1; +} 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/api/v1/core.pb.go b/protos/vega/api/v1/core.pb.go index 631b0676f57..8b3070b38a8 100644 --- a/protos/vega/api/v1/core.pb.go +++ b/protos/vega/api/v1/core.pb.go @@ -2796,7 +2796,7 @@ var file_vega_api_v1_core_proto_rawDesc = []byte{ 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x92, 0x41, 0x34, 0x12, 0x19, 0x0a, 0x0e, 0x56, 0x65, 0x67, 0x61, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x41, 0x50, - 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x36, 0x2e, 0x31, 0x1a, 0x13, 0x6c, 0x62, 0x2e, + 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x37, 0x2e, 0x30, 0x1a, 0x13, 0x6c, 0x62, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x78, 0x79, 0x7a, 0x2a, 0x02, 0x01, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } diff --git a/protos/vega/api/v1/corestate.pb.go b/protos/vega/api/v1/corestate.pb.go index 1556db4ec39..e01454b38b9 100644 --- a/protos/vega/api/v1/corestate.pb.go +++ b/protos/vega/api/v1/corestate.pb.go @@ -1511,8 +1511,8 @@ var file_vega_api_v1_corestate_proto_rawDesc = []byte{ 0x63, 0x6f, 0x6c, 0x2e, 0x69, 0x6f, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x92, 0x41, 0x3a, 0x12, 0x1f, 0x0a, 0x14, 0x56, 0x65, 0x67, 0x61, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x36, - 0x2e, 0x31, 0x1a, 0x13, 0x6c, 0x62, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x6e, 0x65, 0x74, 0x2e, 0x76, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x41, 0x50, 0x49, 0x73, 0x32, 0x07, 0x76, 0x30, 0x2e, 0x37, 0x37, + 0x2e, 0x30, 0x1a, 0x13, 0x6c, 0x62, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x6e, 0x65, 0x74, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x78, 0x79, 0x7a, 0x2a, 0x02, 0x01, 0x02, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } diff --git a/protos/vega/chain_events.pb.go b/protos/vega/chain_events.pb.go index 0552d76e84d..6ca9c0861e1 100644 --- a/protos/vega/chain_events.pb.go +++ b/protos/vega/chain_events.pb.go @@ -20,6 +20,82 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Heartbeat represents that the ERC20 bridge is being watched even though no events happened. +type ERC20Heartbeat struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Contract address that is being listened to + ContractAddress string `protobuf:"bytes,1,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` + // Last Ethereum block height that was checked for events + BlockHeight uint64 `protobuf:"varint,2,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` + // Ethereum block time in Unix seconds. + BlockTime uint64 `protobuf:"varint,3,opt,name=block_time,json=blockTime,proto3" json:"block_time,omitempty"` + // Source chain for this chain event. + SourceChainId string `protobuf:"bytes,6,opt,name=source_chain_id,json=sourceChainId,proto3" json:"source_chain_id,omitempty"` +} + +func (x *ERC20Heartbeat) Reset() { + *x = ERC20Heartbeat{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_chain_events_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ERC20Heartbeat) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ERC20Heartbeat) ProtoMessage() {} + +func (x *ERC20Heartbeat) ProtoReflect() protoreflect.Message { + mi := &file_vega_chain_events_proto_msgTypes[0] + 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 ERC20Heartbeat.ProtoReflect.Descriptor instead. +func (*ERC20Heartbeat) Descriptor() ([]byte, []int) { + return file_vega_chain_events_proto_rawDescGZIP(), []int{0} +} + +func (x *ERC20Heartbeat) GetContractAddress() string { + if x != nil { + return x.ContractAddress + } + return "" +} + +func (x *ERC20Heartbeat) GetBlockHeight() uint64 { + if x != nil { + return x.BlockHeight + } + return 0 +} + +func (x *ERC20Heartbeat) GetBlockTime() uint64 { + if x != nil { + return x.BlockTime + } + return 0 +} + +func (x *ERC20Heartbeat) GetSourceChainId() string { + if x != nil { + return x.SourceChainId + } + return "" +} + // Result of calling an arbitrary Ethereum contract method type EthContractCallEvent struct { state protoimpl.MessageState @@ -45,7 +121,7 @@ type EthContractCallEvent struct { func (x *EthContractCallEvent) Reset() { *x = EthContractCallEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[0] + mi := &file_vega_chain_events_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -58,7 +134,7 @@ func (x *EthContractCallEvent) String() string { func (*EthContractCallEvent) ProtoMessage() {} func (x *EthContractCallEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[0] + mi := &file_vega_chain_events_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -71,7 +147,7 @@ func (x *EthContractCallEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use EthContractCallEvent.ProtoReflect.Descriptor instead. func (*EthContractCallEvent) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{0} + return file_vega_chain_events_proto_rawDescGZIP(), []int{1} } func (x *EthContractCallEvent) GetSpecId() string { @@ -140,7 +216,7 @@ type BuiltinAssetDeposit struct { func (x *BuiltinAssetDeposit) Reset() { *x = BuiltinAssetDeposit{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[1] + mi := &file_vega_chain_events_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -153,7 +229,7 @@ func (x *BuiltinAssetDeposit) String() string { func (*BuiltinAssetDeposit) ProtoMessage() {} func (x *BuiltinAssetDeposit) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[1] + mi := &file_vega_chain_events_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -166,7 +242,7 @@ func (x *BuiltinAssetDeposit) ProtoReflect() protoreflect.Message { // Deprecated: Use BuiltinAssetDeposit.ProtoReflect.Descriptor instead. func (*BuiltinAssetDeposit) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{1} + return file_vega_chain_events_proto_rawDescGZIP(), []int{2} } func (x *BuiltinAssetDeposit) GetVegaAssetId() string { @@ -207,7 +283,7 @@ type BuiltinAssetWithdrawal struct { func (x *BuiltinAssetWithdrawal) Reset() { *x = BuiltinAssetWithdrawal{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[2] + mi := &file_vega_chain_events_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -220,7 +296,7 @@ func (x *BuiltinAssetWithdrawal) String() string { func (*BuiltinAssetWithdrawal) ProtoMessage() {} func (x *BuiltinAssetWithdrawal) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[2] + mi := &file_vega_chain_events_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -233,7 +309,7 @@ func (x *BuiltinAssetWithdrawal) ProtoReflect() protoreflect.Message { // Deprecated: Use BuiltinAssetWithdrawal.ProtoReflect.Descriptor instead. func (*BuiltinAssetWithdrawal) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{2} + return file_vega_chain_events_proto_rawDescGZIP(), []int{3} } func (x *BuiltinAssetWithdrawal) GetVegaAssetId() string { @@ -273,7 +349,7 @@ type BuiltinAssetEvent struct { func (x *BuiltinAssetEvent) Reset() { *x = BuiltinAssetEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[3] + mi := &file_vega_chain_events_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -286,7 +362,7 @@ func (x *BuiltinAssetEvent) String() string { func (*BuiltinAssetEvent) ProtoMessage() {} func (x *BuiltinAssetEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[3] + mi := &file_vega_chain_events_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -299,7 +375,7 @@ func (x *BuiltinAssetEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use BuiltinAssetEvent.ProtoReflect.Descriptor instead. func (*BuiltinAssetEvent) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{3} + return file_vega_chain_events_proto_rawDescGZIP(), []int{4} } func (m *BuiltinAssetEvent) GetAction() isBuiltinAssetEvent_Action { @@ -356,7 +432,7 @@ type ERC20AssetList struct { func (x *ERC20AssetList) Reset() { *x = ERC20AssetList{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[4] + mi := &file_vega_chain_events_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -369,7 +445,7 @@ func (x *ERC20AssetList) String() string { func (*ERC20AssetList) ProtoMessage() {} func (x *ERC20AssetList) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[4] + mi := &file_vega_chain_events_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -382,7 +458,7 @@ func (x *ERC20AssetList) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20AssetList.ProtoReflect.Descriptor instead. func (*ERC20AssetList) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{4} + return file_vega_chain_events_proto_rawDescGZIP(), []int{5} } func (x *ERC20AssetList) GetVegaAssetId() string { @@ -412,7 +488,7 @@ type ERC20AssetDelist struct { func (x *ERC20AssetDelist) Reset() { *x = ERC20AssetDelist{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[5] + mi := &file_vega_chain_events_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -425,7 +501,7 @@ func (x *ERC20AssetDelist) String() string { func (*ERC20AssetDelist) ProtoMessage() {} func (x *ERC20AssetDelist) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[5] + mi := &file_vega_chain_events_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -438,7 +514,7 @@ func (x *ERC20AssetDelist) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20AssetDelist.ProtoReflect.Descriptor instead. func (*ERC20AssetDelist) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{5} + return file_vega_chain_events_proto_rawDescGZIP(), []int{6} } func (x *ERC20AssetDelist) GetVegaAssetId() string { @@ -466,7 +542,7 @@ type ERC20AssetLimitsUpdated struct { func (x *ERC20AssetLimitsUpdated) Reset() { *x = ERC20AssetLimitsUpdated{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[6] + mi := &file_vega_chain_events_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -479,7 +555,7 @@ func (x *ERC20AssetLimitsUpdated) String() string { func (*ERC20AssetLimitsUpdated) ProtoMessage() {} func (x *ERC20AssetLimitsUpdated) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[6] + mi := &file_vega_chain_events_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -492,7 +568,7 @@ func (x *ERC20AssetLimitsUpdated) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20AssetLimitsUpdated.ProtoReflect.Descriptor instead. func (*ERC20AssetLimitsUpdated) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{6} + return file_vega_chain_events_proto_rawDescGZIP(), []int{7} } func (x *ERC20AssetLimitsUpdated) GetVegaAssetId() string { @@ -542,7 +618,7 @@ type ERC20Deposit struct { func (x *ERC20Deposit) Reset() { *x = ERC20Deposit{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[7] + mi := &file_vega_chain_events_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -555,7 +631,7 @@ func (x *ERC20Deposit) String() string { func (*ERC20Deposit) ProtoMessage() {} func (x *ERC20Deposit) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[7] + mi := &file_vega_chain_events_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -568,7 +644,7 @@ func (x *ERC20Deposit) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20Deposit.ProtoReflect.Descriptor instead. func (*ERC20Deposit) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{7} + return file_vega_chain_events_proto_rawDescGZIP(), []int{8} } func (x *ERC20Deposit) GetVegaAssetId() string { @@ -616,7 +692,7 @@ type ERC20Withdrawal struct { func (x *ERC20Withdrawal) Reset() { *x = ERC20Withdrawal{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[8] + mi := &file_vega_chain_events_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -629,7 +705,7 @@ func (x *ERC20Withdrawal) String() string { func (*ERC20Withdrawal) ProtoMessage() {} func (x *ERC20Withdrawal) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[8] + mi := &file_vega_chain_events_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -642,7 +718,7 @@ func (x *ERC20Withdrawal) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20Withdrawal.ProtoReflect.Descriptor instead. func (*ERC20Withdrawal) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{8} + return file_vega_chain_events_proto_rawDescGZIP(), []int{9} } func (x *ERC20Withdrawal) GetVegaAssetId() string { @@ -695,7 +771,7 @@ type ERC20Event struct { func (x *ERC20Event) Reset() { *x = ERC20Event{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[9] + mi := &file_vega_chain_events_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -708,7 +784,7 @@ func (x *ERC20Event) String() string { func (*ERC20Event) ProtoMessage() {} func (x *ERC20Event) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[9] + mi := &file_vega_chain_events_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -721,7 +797,7 @@ func (x *ERC20Event) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20Event.ProtoReflect.Descriptor instead. func (*ERC20Event) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{9} + return file_vega_chain_events_proto_rawDescGZIP(), []int{10} } func (x *ERC20Event) GetIndex() uint64 { @@ -873,7 +949,7 @@ type ERC20SignerAdded struct { func (x *ERC20SignerAdded) Reset() { *x = ERC20SignerAdded{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[10] + mi := &file_vega_chain_events_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -886,7 +962,7 @@ func (x *ERC20SignerAdded) String() string { func (*ERC20SignerAdded) ProtoMessage() {} func (x *ERC20SignerAdded) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[10] + mi := &file_vega_chain_events_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -899,7 +975,7 @@ func (x *ERC20SignerAdded) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20SignerAdded.ProtoReflect.Descriptor instead. func (*ERC20SignerAdded) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{10} + return file_vega_chain_events_proto_rawDescGZIP(), []int{11} } func (x *ERC20SignerAdded) GetNewSigner() string { @@ -942,7 +1018,7 @@ type ERC20SignerRemoved struct { func (x *ERC20SignerRemoved) Reset() { *x = ERC20SignerRemoved{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[11] + mi := &file_vega_chain_events_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -955,7 +1031,7 @@ func (x *ERC20SignerRemoved) String() string { func (*ERC20SignerRemoved) ProtoMessage() {} func (x *ERC20SignerRemoved) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[11] + mi := &file_vega_chain_events_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -968,7 +1044,7 @@ func (x *ERC20SignerRemoved) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20SignerRemoved.ProtoReflect.Descriptor instead. func (*ERC20SignerRemoved) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{11} + return file_vega_chain_events_proto_rawDescGZIP(), []int{12} } func (x *ERC20SignerRemoved) GetOldSigner() string { @@ -1011,7 +1087,7 @@ type ERC20ThresholdSet struct { func (x *ERC20ThresholdSet) Reset() { *x = ERC20ThresholdSet{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[12] + mi := &file_vega_chain_events_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1024,7 +1100,7 @@ func (x *ERC20ThresholdSet) String() string { func (*ERC20ThresholdSet) ProtoMessage() {} func (x *ERC20ThresholdSet) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[12] + mi := &file_vega_chain_events_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1037,7 +1113,7 @@ func (x *ERC20ThresholdSet) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20ThresholdSet.ProtoReflect.Descriptor instead. func (*ERC20ThresholdSet) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{12} + return file_vega_chain_events_proto_rawDescGZIP(), []int{13} } func (x *ERC20ThresholdSet) GetNewThreshold() uint32 { @@ -1086,7 +1162,7 @@ type ERC20MultiSigEvent struct { func (x *ERC20MultiSigEvent) Reset() { *x = ERC20MultiSigEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[13] + mi := &file_vega_chain_events_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1099,7 +1175,7 @@ func (x *ERC20MultiSigEvent) String() string { func (*ERC20MultiSigEvent) ProtoMessage() {} func (x *ERC20MultiSigEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[13] + mi := &file_vega_chain_events_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1112,7 +1188,7 @@ func (x *ERC20MultiSigEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ERC20MultiSigEvent.ProtoReflect.Descriptor instead. func (*ERC20MultiSigEvent) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{13} + return file_vega_chain_events_proto_rawDescGZIP(), []int{14} } func (x *ERC20MultiSigEvent) GetIndex() uint64 { @@ -1212,7 +1288,7 @@ type StakingEvent struct { func (x *StakingEvent) Reset() { *x = StakingEvent{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[14] + mi := &file_vega_chain_events_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1225,7 +1301,7 @@ func (x *StakingEvent) String() string { func (*StakingEvent) ProtoMessage() {} func (x *StakingEvent) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[14] + mi := &file_vega_chain_events_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1238,7 +1314,7 @@ func (x *StakingEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use StakingEvent.ProtoReflect.Descriptor instead. func (*StakingEvent) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{14} + return file_vega_chain_events_proto_rawDescGZIP(), []int{15} } func (x *StakingEvent) GetIndex() uint64 { @@ -1325,7 +1401,7 @@ type StakeDeposited struct { func (x *StakeDeposited) Reset() { *x = StakeDeposited{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[15] + mi := &file_vega_chain_events_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1338,7 +1414,7 @@ func (x *StakeDeposited) String() string { func (*StakeDeposited) ProtoMessage() {} func (x *StakeDeposited) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[15] + mi := &file_vega_chain_events_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1351,7 +1427,7 @@ func (x *StakeDeposited) ProtoReflect() protoreflect.Message { // Deprecated: Use StakeDeposited.ProtoReflect.Descriptor instead. func (*StakeDeposited) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{15} + return file_vega_chain_events_proto_rawDescGZIP(), []int{16} } func (x *StakeDeposited) GetEthereumAddress() string { @@ -1402,7 +1478,7 @@ type StakeRemoved struct { func (x *StakeRemoved) Reset() { *x = StakeRemoved{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[16] + mi := &file_vega_chain_events_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1415,7 +1491,7 @@ func (x *StakeRemoved) String() string { func (*StakeRemoved) ProtoMessage() {} func (x *StakeRemoved) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[16] + mi := &file_vega_chain_events_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1428,7 +1504,7 @@ func (x *StakeRemoved) ProtoReflect() protoreflect.Message { // Deprecated: Use StakeRemoved.ProtoReflect.Descriptor instead. func (*StakeRemoved) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{16} + return file_vega_chain_events_proto_rawDescGZIP(), []int{17} } func (x *StakeRemoved) GetEthereumAddress() string { @@ -1473,7 +1549,7 @@ type StakeTotalSupply struct { func (x *StakeTotalSupply) Reset() { *x = StakeTotalSupply{} if protoimpl.UnsafeEnabled { - mi := &file_vega_chain_events_proto_msgTypes[17] + mi := &file_vega_chain_events_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1486,7 +1562,7 @@ func (x *StakeTotalSupply) String() string { func (*StakeTotalSupply) ProtoMessage() {} func (x *StakeTotalSupply) ProtoReflect() protoreflect.Message { - mi := &file_vega_chain_events_proto_msgTypes[17] + mi := &file_vega_chain_events_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1499,7 +1575,7 @@ func (x *StakeTotalSupply) ProtoReflect() protoreflect.Message { // Deprecated: Use StakeTotalSupply.ProtoReflect.Descriptor instead. func (*StakeTotalSupply) Descriptor() ([]byte, []int) { - return file_vega_chain_events_proto_rawDescGZIP(), []int{17} + return file_vega_chain_events_proto_rawDescGZIP(), []int{18} } func (x *StakeTotalSupply) GetTokenAddress() string { @@ -1521,203 +1597,214 @@ var File_vega_chain_events_proto protoreflect.FileDescriptor var file_vega_chain_events_proto_rawDesc = []byte{ 0x0a, 0x17, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x76, 0x65, 0x67, 0x61, 0x22, - 0x8d, 0x02, 0x0a, 0x14, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, - 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x70, 0x65, 0x63, 0x49, - 0x64, 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, 0x63, 0x6b, 0x48, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 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, 0x2b, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x48, - 0x01, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x22, - 0x6c, 0x0a, 0x13, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, - 0x65, 0x67, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 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, 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, 0x6f, 0x0a, - 0x16, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x5f, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 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, 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, 0x96, - 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, - 0xe9, 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, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x3f, 0x0a, 0x0a, - 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x48, - 0x00, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x42, 0x08, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x57, 0x0a, 0x0e, 0x45, 0x52, 0x43, 0x32, 0x30, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, - 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, - 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x36, 0x0a, 0x10, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, - 0x6c, 0x69, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x67, - 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x22, 0xcd, 0x01, 0x0a, 0x17, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x67, - 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x69, 0x66, 0x65, 0x74, - 0x69, 0x6d, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x0c, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, - 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, - 0x17, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x96, 0x01, 0x0a, 0x0f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, - 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, - 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0xe6, - 0x03, 0x0a, 0x0a, 0x45, 0x52, 0x43, 0x32, 0x30, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x69, - 0x73, 0x74, 0x18, 0xe9, 0x07, 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, 0x48, - 0x00, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0c, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0xea, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x64, 0x65, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x77, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x52, 0x0a, 0x14, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xed, 0x07, - 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, 0x48, 0x00, 0x52, 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0e, 0x62, 0x72, 0x69, - 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x18, 0xee, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x70, - 0x70, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0e, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x72, 0x65, - 0x73, 0x75, 0x6d, 0x65, 0x64, 0x18, 0xef, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0d, - 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x42, 0x08, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x66, 0x0a, 0x10, 0x45, 0x52, 0x43, 0x32, 0x30, - 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, - 0x65, 0x77, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6e, 0x65, 0x77, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, - 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0xa5, 0x01, 0x0a, 0x0e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 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, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x22, - 0x68, 0x0a, 0x12, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x69, 0x67, - 0x6e, 0x65, 0x72, 0x18, 0x01, 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, 0x02, 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, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x6d, 0x0a, 0x11, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x12, 0x23, - 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, - 0x01, 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, 0x02, 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, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xa8, 0x02, 0x0a, 0x12, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x3f, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x80, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x40, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x65, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, - 0x48, 0x00, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x48, 0x00, - 0x52, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x3c, - 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0xeb, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, - 0x6b, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x48, 0x00, 0x52, - 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x42, 0x08, 0x0a, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9a, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x6b, 0x65, - 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 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, 0x22, 0x98, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x64, 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, 0x22, 0x5a, - 0x0a, 0x10, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, - 0x6c, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 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, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x26, 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x45, 0x74, 0x68, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x70, 0x65, 0x63, 0x49, 0x64, 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, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 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, 0x2b, + 0x0a, 0x0f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x48, 0x01, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x09, 0x68, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, + 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x22, 0x6c, 0x0a, 0x13, 0x42, 0x75, 0x69, 0x6c, 0x74, + 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x22, + 0x0a, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x49, 0x64, 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, 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, 0x6f, 0x0a, 0x16, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, + 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x49, 0x64, 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, 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, 0x96, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x74, + 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x07, + 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0xe9, 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, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x12, 0x3f, 0x0a, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x61, 0x6c, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x61, 0x6c, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x57, 0x0a, 0x0e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x36, 0x0a, 0x10, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0d, + 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, + 0x22, 0xcd, 0x01, 0x0a, 0x17, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0d, + 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x65, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x69, 0x66, 0x65, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6c, 0x69, 0x66, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x22, 0xaa, 0x01, 0x0a, 0x0c, 0x45, 0x52, 0x43, 0x32, 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x45, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x96, 0x01, + 0x0a, 0x0f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x12, 0x22, 0x0a, 0x0d, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x67, 0x61, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x45, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, + 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0xe6, 0x03, 0x0a, 0x0a, 0x45, 0x52, 0x43, 0x32, 0x30, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x0a, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x18, 0xe9, 0x07, 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, 0x48, 0x00, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x6c, + 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x69, + 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0xeb, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x45, 0x52, 0x43, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x48, + 0x00, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x52, 0x0a, + 0x14, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xed, 0x07, 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, 0x48, 0x00, 0x52, 0x12, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x28, 0x0a, 0x0e, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, + 0x70, 0x65, 0x64, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x72, + 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0e, 0x62, + 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x18, 0xef, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x75, 0x6d, 0x65, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x66, 0x0a, 0x10, 0x45, 0x52, 0x43, 0x32, 0x30, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x77, 0x53, 0x69, 0x67, 0x6e, + 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 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, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x68, 0x0a, 0x12, 0x45, 0x52, 0x43, 0x32, 0x30, + 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x18, 0x01, 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, 0x02, 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, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, + 0x65, 0x22, 0x6d, 0x0a, 0x11, 0x45, 0x52, 0x43, 0x32, 0x30, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 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, 0x02, 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, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, + 0x22, 0xa8, 0x02, 0x0a, 0x12, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, + 0x69, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, + 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x3c, + 0x0a, 0x0c, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0xe9, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x48, 0x00, 0x52, + 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x42, 0x0a, 0x0e, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0xea, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, + 0x32, 0x30, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x48, + 0x00, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, + 0x12, 0x3f, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x65, + 0x74, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x45, 0x52, 0x43, 0x32, 0x30, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, + 0x74, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, + 0x74, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x80, 0x02, 0x0a, 0x0c, + 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x40, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x44, + 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x0d, 0x73, 0x74, + 0x61, 0x6b, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, + 0x75, 0x70, 0x70, 0x6c, 0x79, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, + 0x70, 0x70, 0x6c, 0x79, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9a, + 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, + 0x64, 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, 0x22, 0x98, 0x01, 0x0a, 0x0c, + 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 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, 0x22, 0x5a, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, + 0x6c, 0x79, 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 ( @@ -1732,41 +1819,42 @@ func file_vega_chain_events_proto_rawDescGZIP() []byte { return file_vega_chain_events_proto_rawDescData } -var file_vega_chain_events_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_vega_chain_events_proto_msgTypes = make([]protoimpl.MessageInfo, 19) var file_vega_chain_events_proto_goTypes = []interface{}{ - (*EthContractCallEvent)(nil), // 0: vega.EthContractCallEvent - (*BuiltinAssetDeposit)(nil), // 1: vega.BuiltinAssetDeposit - (*BuiltinAssetWithdrawal)(nil), // 2: vega.BuiltinAssetWithdrawal - (*BuiltinAssetEvent)(nil), // 3: vega.BuiltinAssetEvent - (*ERC20AssetList)(nil), // 4: vega.ERC20AssetList - (*ERC20AssetDelist)(nil), // 5: vega.ERC20AssetDelist - (*ERC20AssetLimitsUpdated)(nil), // 6: vega.ERC20AssetLimitsUpdated - (*ERC20Deposit)(nil), // 7: vega.ERC20Deposit - (*ERC20Withdrawal)(nil), // 8: vega.ERC20Withdrawal - (*ERC20Event)(nil), // 9: vega.ERC20Event - (*ERC20SignerAdded)(nil), // 10: vega.ERC20SignerAdded - (*ERC20SignerRemoved)(nil), // 11: vega.ERC20SignerRemoved - (*ERC20ThresholdSet)(nil), // 12: vega.ERC20ThresholdSet - (*ERC20MultiSigEvent)(nil), // 13: vega.ERC20MultiSigEvent - (*StakingEvent)(nil), // 14: vega.StakingEvent - (*StakeDeposited)(nil), // 15: vega.StakeDeposited - (*StakeRemoved)(nil), // 16: vega.StakeRemoved - (*StakeTotalSupply)(nil), // 17: vega.StakeTotalSupply + (*ERC20Heartbeat)(nil), // 0: vega.ERC20Heartbeat + (*EthContractCallEvent)(nil), // 1: vega.EthContractCallEvent + (*BuiltinAssetDeposit)(nil), // 2: vega.BuiltinAssetDeposit + (*BuiltinAssetWithdrawal)(nil), // 3: vega.BuiltinAssetWithdrawal + (*BuiltinAssetEvent)(nil), // 4: vega.BuiltinAssetEvent + (*ERC20AssetList)(nil), // 5: vega.ERC20AssetList + (*ERC20AssetDelist)(nil), // 6: vega.ERC20AssetDelist + (*ERC20AssetLimitsUpdated)(nil), // 7: vega.ERC20AssetLimitsUpdated + (*ERC20Deposit)(nil), // 8: vega.ERC20Deposit + (*ERC20Withdrawal)(nil), // 9: vega.ERC20Withdrawal + (*ERC20Event)(nil), // 10: vega.ERC20Event + (*ERC20SignerAdded)(nil), // 11: vega.ERC20SignerAdded + (*ERC20SignerRemoved)(nil), // 12: vega.ERC20SignerRemoved + (*ERC20ThresholdSet)(nil), // 13: vega.ERC20ThresholdSet + (*ERC20MultiSigEvent)(nil), // 14: vega.ERC20MultiSigEvent + (*StakingEvent)(nil), // 15: vega.StakingEvent + (*StakeDeposited)(nil), // 16: vega.StakeDeposited + (*StakeRemoved)(nil), // 17: vega.StakeRemoved + (*StakeTotalSupply)(nil), // 18: vega.StakeTotalSupply } var file_vega_chain_events_proto_depIdxs = []int32{ - 1, // 0: vega.BuiltinAssetEvent.deposit:type_name -> vega.BuiltinAssetDeposit - 2, // 1: vega.BuiltinAssetEvent.withdrawal:type_name -> vega.BuiltinAssetWithdrawal - 4, // 2: vega.ERC20Event.asset_list:type_name -> vega.ERC20AssetList - 5, // 3: vega.ERC20Event.asset_delist:type_name -> vega.ERC20AssetDelist - 7, // 4: vega.ERC20Event.deposit:type_name -> vega.ERC20Deposit - 8, // 5: vega.ERC20Event.withdrawal:type_name -> vega.ERC20Withdrawal - 6, // 6: vega.ERC20Event.asset_limits_updated:type_name -> vega.ERC20AssetLimitsUpdated - 10, // 7: vega.ERC20MultiSigEvent.signer_added:type_name -> vega.ERC20SignerAdded - 11, // 8: vega.ERC20MultiSigEvent.signer_removed:type_name -> vega.ERC20SignerRemoved - 12, // 9: vega.ERC20MultiSigEvent.threshold_set:type_name -> vega.ERC20ThresholdSet - 15, // 10: vega.StakingEvent.stake_deposited:type_name -> vega.StakeDeposited - 16, // 11: vega.StakingEvent.stake_removed:type_name -> vega.StakeRemoved - 17, // 12: vega.StakingEvent.total_supply:type_name -> vega.StakeTotalSupply + 2, // 0: vega.BuiltinAssetEvent.deposit:type_name -> vega.BuiltinAssetDeposit + 3, // 1: vega.BuiltinAssetEvent.withdrawal:type_name -> vega.BuiltinAssetWithdrawal + 5, // 2: vega.ERC20Event.asset_list:type_name -> vega.ERC20AssetList + 6, // 3: vega.ERC20Event.asset_delist:type_name -> vega.ERC20AssetDelist + 8, // 4: vega.ERC20Event.deposit:type_name -> vega.ERC20Deposit + 9, // 5: vega.ERC20Event.withdrawal:type_name -> vega.ERC20Withdrawal + 7, // 6: vega.ERC20Event.asset_limits_updated:type_name -> vega.ERC20AssetLimitsUpdated + 11, // 7: vega.ERC20MultiSigEvent.signer_added:type_name -> vega.ERC20SignerAdded + 12, // 8: vega.ERC20MultiSigEvent.signer_removed:type_name -> vega.ERC20SignerRemoved + 13, // 9: vega.ERC20MultiSigEvent.threshold_set:type_name -> vega.ERC20ThresholdSet + 16, // 10: vega.StakingEvent.stake_deposited:type_name -> vega.StakeDeposited + 17, // 11: vega.StakingEvent.stake_removed:type_name -> vega.StakeRemoved + 18, // 12: vega.StakingEvent.total_supply:type_name -> vega.StakeTotalSupply 13, // [13:13] is the sub-list for method output_type 13, // [13:13] is the sub-list for method input_type 13, // [13:13] is the sub-list for extension type_name @@ -1781,7 +1869,7 @@ func file_vega_chain_events_proto_init() { } if !protoimpl.UnsafeEnabled { file_vega_chain_events_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EthContractCallEvent); i { + switch v := v.(*ERC20Heartbeat); i { case 0: return &v.state case 1: @@ -1793,7 +1881,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuiltinAssetDeposit); i { + switch v := v.(*EthContractCallEvent); i { case 0: return &v.state case 1: @@ -1805,7 +1893,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuiltinAssetWithdrawal); i { + switch v := v.(*BuiltinAssetDeposit); i { case 0: return &v.state case 1: @@ -1817,7 +1905,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuiltinAssetEvent); i { + switch v := v.(*BuiltinAssetWithdrawal); i { case 0: return &v.state case 1: @@ -1829,7 +1917,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20AssetList); i { + switch v := v.(*BuiltinAssetEvent); i { case 0: return &v.state case 1: @@ -1841,7 +1929,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20AssetDelist); i { + switch v := v.(*ERC20AssetList); i { case 0: return &v.state case 1: @@ -1853,7 +1941,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20AssetLimitsUpdated); i { + switch v := v.(*ERC20AssetDelist); i { case 0: return &v.state case 1: @@ -1865,7 +1953,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20Deposit); i { + switch v := v.(*ERC20AssetLimitsUpdated); i { case 0: return &v.state case 1: @@ -1877,7 +1965,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20Withdrawal); i { + switch v := v.(*ERC20Deposit); i { case 0: return &v.state case 1: @@ -1889,7 +1977,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20Event); i { + switch v := v.(*ERC20Withdrawal); i { case 0: return &v.state case 1: @@ -1901,7 +1989,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20SignerAdded); i { + switch v := v.(*ERC20Event); i { case 0: return &v.state case 1: @@ -1913,7 +2001,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20SignerRemoved); i { + switch v := v.(*ERC20SignerAdded); i { case 0: return &v.state case 1: @@ -1925,7 +2013,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20ThresholdSet); i { + switch v := v.(*ERC20SignerRemoved); i { case 0: return &v.state case 1: @@ -1937,7 +2025,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ERC20MultiSigEvent); i { + switch v := v.(*ERC20ThresholdSet); i { case 0: return &v.state case 1: @@ -1949,7 +2037,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakingEvent); i { + switch v := v.(*ERC20MultiSigEvent); i { case 0: return &v.state case 1: @@ -1961,7 +2049,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakeDeposited); i { + switch v := v.(*StakingEvent); i { case 0: return &v.state case 1: @@ -1973,7 +2061,7 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StakeRemoved); i { + switch v := v.(*StakeDeposited); i { case 0: return &v.state case 1: @@ -1985,6 +2073,18 @@ func file_vega_chain_events_proto_init() { } } file_vega_chain_events_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StakeRemoved); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_chain_events_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StakeTotalSupply); i { case 0: return &v.state @@ -1997,12 +2097,12 @@ func file_vega_chain_events_proto_init() { } } } - file_vega_chain_events_proto_msgTypes[0].OneofWrappers = []interface{}{} - file_vega_chain_events_proto_msgTypes[3].OneofWrappers = []interface{}{ + file_vega_chain_events_proto_msgTypes[1].OneofWrappers = []interface{}{} + file_vega_chain_events_proto_msgTypes[4].OneofWrappers = []interface{}{ (*BuiltinAssetEvent_Deposit)(nil), (*BuiltinAssetEvent_Withdrawal)(nil), } - file_vega_chain_events_proto_msgTypes[9].OneofWrappers = []interface{}{ + file_vega_chain_events_proto_msgTypes[10].OneofWrappers = []interface{}{ (*ERC20Event_AssetList)(nil), (*ERC20Event_AssetDelist)(nil), (*ERC20Event_Deposit)(nil), @@ -2011,12 +2111,12 @@ func file_vega_chain_events_proto_init() { (*ERC20Event_BridgeStopped)(nil), (*ERC20Event_BridgeResumed)(nil), } - file_vega_chain_events_proto_msgTypes[13].OneofWrappers = []interface{}{ + file_vega_chain_events_proto_msgTypes[14].OneofWrappers = []interface{}{ (*ERC20MultiSigEvent_SignerAdded)(nil), (*ERC20MultiSigEvent_SignerRemoved)(nil), (*ERC20MultiSigEvent_ThresholdSet)(nil), } - file_vega_chain_events_proto_msgTypes[14].OneofWrappers = []interface{}{ + file_vega_chain_events_proto_msgTypes[15].OneofWrappers = []interface{}{ (*StakingEvent_StakeDeposited)(nil), (*StakingEvent_StakeRemoved)(nil), (*StakingEvent_TotalSupply)(nil), @@ -2027,7 +2127,7 @@ func file_vega_chain_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_chain_events_proto_rawDesc, NumEnums: 0, - NumMessages: 18, + NumMessages: 19, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/checkpoint/v1/checkpoint.pb.go b/protos/vega/checkpoint/v1/checkpoint.pb.go index bbc882dde38..6eb47b7eff3 100644 --- a/protos/vega/checkpoint/v1/checkpoint.pb.go +++ b/protos/vega/checkpoint/v1/checkpoint.pb.go @@ -1258,6 +1258,7 @@ type RecurringTransfers struct { unknownFields protoimpl.UnknownFields RecurringTransfers []*v1.Transfer `protobuf:"bytes,1,rep,name=recurring_transfers,json=recurringTransfers,proto3" json:"recurring_transfers,omitempty"` + NextMetricUpdate int64 `protobuf:"varint,2,opt,name=next_metric_update,json=nextMetricUpdate,proto3" json:"next_metric_update,omitempty"` } func (x *RecurringTransfers) Reset() { @@ -1299,6 +1300,13 @@ func (x *RecurringTransfers) GetRecurringTransfers() []*v1.Transfer { return nil } +func (x *RecurringTransfers) GetNextMetricUpdate() int64 { + if x != nil { + return x.NextMetricUpdate + } + return 0 +} + type GovernanceTransfer struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1997,6 +2005,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 +2194,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 @@ -3618,280 +3634,285 @@ var file_vega_checkpoint_v1_checkpoint_proto_rawDesc = []byte{ 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0x5f, 0x0a, 0x12, 0x52, - 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x73, 0x12, 0x49, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x12, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, - 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0xd1, 0x01, 0x0a, - 0x12, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 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, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x18, 0x02, 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, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4e, 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x22, 0x88, 0x01, 0x0a, 0x21, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x6f, - 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 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, 0x12, 0x44, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, - 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0xae, 0x06, 0x0a, 0x07, - 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x57, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, - 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x57, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x12, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x69, - 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x12, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0d, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 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, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x1b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, - 0x6e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6e, 0x52, 0x65, 0x66, 0x73, 0x12, 0x76, 0x0a, - 0x1c, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x64, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x19, 0x67, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x41, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x6c, 0x0a, 0x1e, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, - 0x6e, 0x67, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x1c, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x12, + 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x73, 0x12, 0x49, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x12, 0x72, 0x65, 0x63, 0x75, 0x72, + 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, + 0x12, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x78, 0x74, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x12, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x16, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, - 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x14, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x42, - 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, - 0x79, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x19, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x61, 0x72, 0x79, 0x45, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x80, 0x01, 0x0a, - 0x0b, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x76, 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, 0x63, - 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, - 0x6e, 0x64, 0x65, 0x78, 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, - 0xaa, 0x02, 0x0a, 0x0a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x4b, - 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x01, 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, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5a, 0x0a, 0x15, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x13, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x73, 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, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, - 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, 0x22, 0xee, 0x02, 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, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 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, 0x03, 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, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x04, 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, - 0x05, 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, 0x12, 0x32, 0x0a, 0x15, 0x68, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x30, 0x0a, 0x14, 0x68, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, - 0x69, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x08, 0x52, 0x12, 0x68, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x67, 0x73, 0x22, 0x6b, 0x0a, - 0x07, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 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, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, - 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6c, 0x61, 0x73, - 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x65, 0x65, 0x6e, 0x22, 0xd2, 0x01, 0x0a, 0x0f, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x42, - 0x0a, 0x07, 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, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x73, 0x12, 0x53, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, - 0x73, 0x65, 0x74, 0x18, 0x02, 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, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x65, 0x65, 0x6e, 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, 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, 0x9e, 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, - 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x4d, 0x0a, 0x13, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, - 0x65, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 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, 0x52, 0x11, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, - 0x65, 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x52, 0x0d, 0x6d, 0x61, - 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x07, 0x6c, - 0x70, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, + 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x02, 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, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, + 0x65, 0x77, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, + 0x88, 0x01, 0x0a, 0x21, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, + 0x74, 0x54, 0x69, 0x6d, 0x65, 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, 0x12, 0x44, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, + 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, + 0x09, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0xae, 0x06, 0x0a, 0x07, 0x42, + 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x57, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0f, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, + 0x57, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 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, 0x52, 0x06, 0x6c, 0x70, 0x46, - 0x65, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x50, 0x61, 0x69, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, - 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x54, 0x6f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x58, 0x0a, 0x16, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0a, 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, 0x54, - 0x57, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x14, 0x74, - 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x16, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x0b, 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, 0x54, 0x57, 0x4e, 0x6f, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x14, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x42, 0x0a, - 0x0c, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 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, 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x61, 0x0a, 0x1b, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, - 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, - 0x18, 0x0d, 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, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x18, 0x6d, 0x61, 0x6b, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x59, 0x0a, 0x17, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, - 0x65, 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, + 0x31, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x73, 0x52, 0x12, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x14, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x69, 0x64, + 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x12, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 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, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x3c, 0x0a, 0x1b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, + 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, + 0x1b, 0x0a, 0x09, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x72, 0x65, 0x66, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x65, 0x6e, 0x52, 0x65, 0x66, 0x73, 0x12, 0x76, 0x0a, 0x1c, + 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x64, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x19, 0x67, 0x6f, 0x76, 0x65, 0x72, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x41, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x6c, 0x0a, 0x1e, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, + 0x67, 0x5f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x52, 0x1c, 0x72, 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, 0x73, 0x12, 0x55, 0x0a, 0x16, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, + 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x14, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x42, 0x72, + 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, + 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x19, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x61, 0x72, 0x79, 0x45, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x80, 0x01, 0x0a, 0x0b, + 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x76, 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, 0x63, 0x6b, + 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, + 0x64, 0x65, 0x78, 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, 0xaa, + 0x02, 0x0a, 0x0a, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x4b, 0x0a, + 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x01, 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, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x5a, 0x0a, 0x15, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x13, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x73, 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, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 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, 0x22, 0xee, 0x02, 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, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 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, 0x03, 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, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x04, 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, 0x05, + 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, 0x12, 0x32, 0x0a, 0x15, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x65, + 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x69, + 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x08, 0x52, 0x12, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x69, 0x67, 0x73, 0x22, 0x6b, 0x0a, 0x07, + 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, + 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 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, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, + 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x73, 0x65, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x65, 0x65, 0x6e, 0x22, 0xd2, 0x01, 0x0a, 0x0f, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x42, 0x0a, + 0x07, 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, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, + 0x73, 0x12, 0x53, 0x0a, 0x0d, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x73, + 0x65, 0x74, 0x18, 0x02, 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, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x65, 0x65, 0x6e, 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, 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, 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, 0x14, + 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x12, 0x4d, 0x0a, 0x13, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, + 0x65, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 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, + 0x52, 0x11, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, + 0x76, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x0f, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, + 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x52, 0x0d, 0x6d, 0x61, 0x6b, + 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x07, 0x6c, 0x70, + 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x52, 0x06, 0x6c, 0x70, 0x46, 0x65, + 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x12, 0x1d, + 0x0a, 0x0a, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x50, 0x61, 0x69, 0x64, 0x12, 0x21, 0x0a, + 0x0c, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x72, 0x61, 0x64, 0x65, 0x64, + 0x12, 0x26, 0x0a, 0x0f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x79, + 0x54, 0x6f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x58, 0x0a, 0x16, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0a, 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, 0x54, 0x57, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x14, 0x74, 0x69, + 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x58, 0x0a, 0x16, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x0b, 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, 0x54, 0x57, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x14, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x12, 0x42, 0x0a, 0x0c, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 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, 0x0b, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x61, 0x0a, 0x1b, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, + 0x0d, 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, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x14, 0x6d, 0x61, 0x6b, 0x65, 0x72, - 0x46, 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x4a, 0x0a, 0x0f, 0x6c, 0x70, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x0f, 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, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x0d, 0x6c, 0x70, - 0x46, 0x65, 0x65, 0x73, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x7d, 0x0a, 0x23, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 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, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x1f, 0x74, 0x69, 0x6d, 0x65, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x7f, 0x0a, 0x23, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x18, 0x6d, 0x61, 0x6b, 0x65, 0x72, + 0x46, 0x65, 0x65, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x59, 0x0a, 0x17, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, + 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x0e, + 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, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, + 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x14, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x46, + 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x4a, + 0x0a, 0x0f, 0x6c, 0x70, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x18, 0x0f, 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, 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, 0x52, 0x1f, 0x74, 0x69, 0x6d, 0x65, - 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x14, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x18, 0x12, 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, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x12, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, 0x66, 0x65, 0x65, - 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x52, 0x09, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x46, 0x65, 0x65, - 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x6c, 0x70, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x66, 0x65, 0x65, - 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x52, 0x0a, 0x6c, 0x70, 0x50, 0x61, 0x69, 0x64, 0x46, 0x65, - 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x15, 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, 0x0f, 0x72, - 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x12, 0x5e, - 0x0a, 0x18, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x73, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x16, 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, 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, + 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x52, 0x0d, 0x6c, 0x70, 0x46, + 0x65, 0x65, 0x73, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x7d, 0x0a, 0x23, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 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, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x1f, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x7f, 0x0a, 0x23, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 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, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x1f, 0x74, 0x69, 0x6d, 0x65, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x56, 0x0a, 0x14, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x18, 0x12, 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, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x12, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x44, 0x61, 0x74, 0x61, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, 0x66, 0x65, 0x65, 0x73, + 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x52, 0x09, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x46, 0x65, 0x65, 0x73, + 0x12, 0x3f, 0x0a, 0x0c, 0x6c, 0x70, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x73, + 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 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, 0x52, 0x0a, 0x6c, 0x70, 0x50, 0x61, 0x69, 0x64, 0x46, 0x65, 0x65, + 0x73, 0x12, 0x4a, 0x0a, 0x10, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x73, 0x18, 0x15, 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, 0x0f, 0x72, 0x65, + 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x12, 0x5e, 0x0a, + 0x18, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x16, 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, 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, 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, diff --git a/protos/vega/commands/v1/commands.pb.go b/protos/vega/commands/v1/commands.pb.go index 70e8011c901..ef91d6a6ef0 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 @@ -1617,6 +1668,11 @@ type Transfer struct { Amount string `protobuf:"bytes,5,opt,name=amount,proto3" json:"amount,omitempty"` // Reference to be attached to the transfer. Reference string `protobuf:"bytes,6,opt,name=reference,proto3" json:"reference,omitempty"` + // AMM key from which assets are to be transferred, if applicable. + // The submitter of the transaction must be the owner of this AMM key. + // If provided, the 'from_account_type' must be REWARDS_VESTED, and the asset in this account + // must match the asset specified in the transfer. + From *string `protobuf:"bytes,7,opt,name=from,proto3,oneof" json:"from,omitempty"` // Specific details of the transfer. // // Types that are assignable to Kind: @@ -1700,6 +1756,13 @@ func (x *Transfer) GetReference() string { return "" } +func (x *Transfer) GetFrom() string { + if x != nil && x.From != nil { + return *x.From + } + return "" +} + func (m *Transfer) GetKind() isTransfer_Kind { if m != nil { return m.Kind @@ -2281,6 +2344,290 @@ func (x *UpdatePartyProfile) GetMetadata() []*vega.Metadata { return nil } +// Command to create an automated market maker for a given market. +type SubmitAMM struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Market ID for which to create an AMM. + MarketId string `protobuf:"bytes,1,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` + // Amount to be committed to the AMM. + CommitmentAmount string `protobuf:"bytes,2,opt,name=commitment_amount,json=commitmentAmount,proto3" json:"commitment_amount,omitempty"` + // Slippage tolerance used for rebasing the AMM if its base price crosses with existing order + SlippageTolerance string `protobuf:"bytes,3,opt,name=slippage_tolerance,json=slippageTolerance,proto3" json:"slippage_tolerance,omitempty"` + // Concentrated liquidity parameters defining the shape of the AMM's volume curves. + 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 amend an existing automated market maker on a market. +type AmendAMM struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Market ID for the AMM 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 AMM. If not supplied the commitment will remain unchanged. + CommitmentAmount *string `protobuf:"bytes,2,opt,name=commitment_amount,json=commitmentAmount,proto3,oneof" json:"commitment_amount,omitempty"` + // Slippage tolerance for rebasing position when updating the AMM. + SlippageTolerance string `protobuf:"bytes,3,opt,name=slippage_tolerance,json=slippageTolerance,proto3" json:"slippage_tolerance,omitempty"` + // Concentrated liquidity parameters defining the shape of the AMM's volume curves. If not supplied the parameters will remain unchanged. + 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. If not supplied the proposed fee will remain unchanged. + 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 cancel an automated market maker 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 +} + +// Internal transactions used to convey delayed transactions to be included in the next block. +type DelayedTransactionsWrapper struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Transactions [][]byte `protobuf:"bytes,1,rep,name=transactions,proto3" json:"transactions,omitempty"` + Height uint64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` +} + +func (x *DelayedTransactionsWrapper) Reset() { + *x = DelayedTransactionsWrapper{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_commands_v1_commands_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DelayedTransactionsWrapper) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DelayedTransactionsWrapper) ProtoMessage() {} + +func (x *DelayedTransactionsWrapper) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DelayedTransactionsWrapper.ProtoReflect.Descriptor instead. +func (*DelayedTransactionsWrapper) Descriptor() ([]byte, []int) { + return file_vega_commands_v1_commands_proto_rawDescGZIP(), []int{32} +} + +func (x *DelayedTransactionsWrapper) GetTransactions() [][]byte { + if x != nil { + return x.Transactions + } + return nil +} + +func (x *DelayedTransactionsWrapper) GetHeight() uint64 { + if x != nil { + return x.Height + } + return 0 +} + type CreateReferralSet_Team struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2303,7 +2650,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[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2316,7 +2663,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[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2390,7 +2737,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[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2403,7 +2750,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[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2454,6 +2801,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 + + // Price at which the AMM will stop quoting sell volume. If not supplied 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"` + // Price at which the AMM will stop quoting buy volume. If not supplied 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"` + // Price that the AMM will quote as its "fair price" when its position is zero. + Base string `protobuf:"bytes,3,opt,name=base,proto3" json:"base,omitempty"` + // Leverage at upper bound. If not set the markets risk-factors will be used to calculate leverage. + LeverageAtUpperBound *string `protobuf:"bytes,4,opt,name=leverage_at_upper_bound,json=leverageAtUpperBound,proto3,oneof" json:"leverage_at_upper_bound,omitempty"` + // Leverage at lower bound. If not set the markets risk-factors will be used to calculate leverage. + LeverageAtLowerBound *string `protobuf:"bytes,5,opt,name=leverage_at_lower_bound,json=leverageAtLowerBound,proto3,oneof" json:"leverage_at_lower_bound,omitempty"` +} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) Reset() { + *x = SubmitAMM_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 *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[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 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) GetLeverageAtUpperBound() string { + if x != nil && x.LeverageAtUpperBound != nil { + return *x.LeverageAtUpperBound + } + return "" +} + +func (x *SubmitAMM_ConcentratedLiquidityParameters) GetLeverageAtLowerBound() string { + if x != nil && x.LeverageAtLowerBound != nil { + return *x.LeverageAtLowerBound + } + 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 + + // Price at which the AMM will stop quoting sell volume. If not supplied 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"` + // Price at which the AMM will stop quoting buy volume. If not supplied 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"` + // Price that the AMM will quote as its "fair price" when its position is zero. + Base string `protobuf:"bytes,3,opt,name=base,proto3" json:"base,omitempty"` + // Leverage at upper bound. If not set the markets risk-factors will be used to calculate leverage. + LeverageAtUpperBound *string `protobuf:"bytes,4,opt,name=leverage_at_upper_bound,json=leverageAtUpperBound,proto3,oneof" json:"leverage_at_upper_bound,omitempty"` + // Leverage at lower bound. If not set the markets risk-factors will be used to calculate leverage. + LeverageAtLowerBound *string `protobuf:"bytes,5,opt,name=leverage_at_lower_bound,json=leverageAtLowerBound,proto3,oneof" json:"leverage_at_lower_bound,omitempty"` +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) Reset() { + *x = AmendAMM_ConcentratedLiquidityParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_commands_v1_commands_proto_msgTypes[36] + 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[36] + 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 { + return x.Base + } + return "" +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) GetLeverageAtUpperBound() string { + if x != nil && x.LeverageAtUpperBound != nil { + return *x.LeverageAtUpperBound + } + return "" +} + +func (x *AmendAMM_ConcentratedLiquidityParameters) GetLeverageAtLowerBound() string { + if x != nil && x.LeverageAtLowerBound != nil { + return *x.LeverageAtLowerBound + } + return "" +} + var File_vega_commands_v1_commands_proto protoreflect.FileDescriptor var file_vega_commands_v1_commands_proto_rawDesc = []byte{ @@ -2720,7 +3237,7 @@ var file_vega_commands_v1_commands_proto_rawDesc = []byte{ 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x4e, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x41, 0x54, 0x5f, 0x45, 0x4e, 0x44, 0x5f, 0x4f, 0x46, 0x5f, 0x45, 0x50, 0x4f, 0x43, 0x48, - 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0xea, 0x02, 0x0a, 0x08, 0x54, 0x72, 0x61, + 0x10, 0x02, 0x22, 0x04, 0x08, 0x03, 0x10, 0x03, 0x22, 0x8c, 0x03, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x11, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, @@ -2734,100 +3251,205 @@ var file_vega_commands_v1_commands_proto_rawDesc = []byte{ 0x61, 0x73, 0x73, 0x65, 0x74, 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, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x6f, - 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x65, 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, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x06, 0x6f, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x12, 0x43, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, - 0x72, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 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, 0x42, 0x06, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 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, 0x31, 0x0a, 0x0e, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 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, 0x22, 0xaf, 0x01, - 0x0a, 0x0f, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, - 0x37, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 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, 0x4b, 0x69, - 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x6f, - 0x64, 0x65, 0x49, 0x64, 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, - 0xac, 0x02, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x74, 0x65, 0x61, 0x6d, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x41, - 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 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, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x88, 0x01, - 0x01, 0x1a, 0xb1, 0x01, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, - 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, - 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x88, - 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x0d, 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, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, - 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x22, 0xda, - 0x02, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 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, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x41, 0x0a, - 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 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, - 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x88, 0x01, 0x01, - 0x1a, 0xcf, 0x01, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x88, - 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, - 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, - 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, - 0x73, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, + 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x66, + 0x72, 0x6f, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x66, 0x72, 0x6f, + 0x6d, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x5f, 0x6f, 0x66, 0x66, 0x18, + 0x65, 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, 0x6e, 0x65, 0x4f, 0x66, 0x66, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x6e, 0x65, 0x4f, 0x66, + 0x66, 0x12, 0x43, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x66, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 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, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x42, 0x07, + 0x0a, 0x05, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 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, 0x31, 0x0a, 0x0e, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 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, 0x22, + 0xaf, 0x01, 0x0a, 0x0f, 0x49, 0x73, 0x73, 0x75, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, + 0x72, 0x12, 0x37, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x23, 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, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 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, 0xac, 0x02, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x74, 0x65, + 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x54, 0x65, 0x61, 0x6d, + 0x12, 0x41, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 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, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, + 0x88, 0x01, 0x01, 0x1a, 0xb1, 0x01, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, + 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, + 0x6c, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x0d, + 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, 0x0e, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x76, 0x61, - 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x6c, 0x6f, 0x73, - 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x23, 0x0a, 0x11, 0x41, - 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x22, 0x1a, 0x0a, 0x08, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x12, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 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, + 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x65, 0x61, 0x6d, + 0x22, 0xda, 0x02, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 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, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, 0x74, 0x65, 0x61, + 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x54, 0x65, 0x61, 0x6d, 0x12, + 0x41, 0x0a, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 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, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x88, + 0x01, 0x01, 0x1a, 0xcf, 0x01, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x17, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x72, + 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x4c, 0x69, 0x73, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0b, 0x0a, + 0x09, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x23, 0x0a, + 0x11, 0x41, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x43, 0x6f, + 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x22, 0x1a, 0x0a, 0x08, 0x4a, 0x6f, 0x69, 0x6e, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, + 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 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, 0x22, 0x85, 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, 0xd1, 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, 0x3a, + 0x0a, 0x17, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, + 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x02, 0x52, 0x14, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x41, 0x74, 0x55, 0x70, 0x70, + 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x6c, 0x65, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x14, 0x6c, + 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 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, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0xdf, + 0x05, 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, + 0xd1, 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, 0x3a, 0x0a, 0x17, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x14, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x41, 0x74, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x3a, 0x0a, 0x17, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6c, + 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x03, 0x52, 0x14, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 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, 0x1a, 0x0a, 0x18, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, 0x65, + 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x65, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 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, 0x22, 0x58, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x61, 0x79, + 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0c, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 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 +3464,113 @@ 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, 37) 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 + (*DelayedTransactionsWrapper)(nil), // 35: vega.commands.v1.DelayedTransactionsWrapper + (*CreateReferralSet_Team)(nil), // 36: vega.commands.v1.CreateReferralSet.Team + (*UpdateReferralSet_Team)(nil), // 37: vega.commands.v1.UpdateReferralSet.Team + (*SubmitAMM_ConcentratedLiquidityParameters)(nil), // 38: vega.commands.v1.SubmitAMM.ConcentratedLiquidityParameters + (*AmendAMM_ConcentratedLiquidityParameters)(nil), // 39: vega.commands.v1.AmendAMM.ConcentratedLiquidityParameters + (vega.StopOrder_ExpiryStrategy)(0), // 40: vega.StopOrder.ExpiryStrategy + (vega.StopOrder_SizeOverrideSetting)(0), // 41: vega.StopOrder.SizeOverrideSetting + (*vega.StopOrder_SizeOverrideValue)(nil), // 42: vega.StopOrder.SizeOverrideValue + (vega.Side)(0), // 43: vega.Side + (vega.Order_TimeInForce)(0), // 44: vega.Order.TimeInForce + (vega.Order_Type)(0), // 45: vega.Order.Type + (*vega.PeggedOrder)(nil), // 46: vega.PeggedOrder + (vega.PeggedReference)(0), // 47: vega.PeggedReference + (*vega.WithdrawExt)(nil), // 48: vega.WithdrawExt + (*vega.ProposalTerms)(nil), // 49: vega.ProposalTerms + (*vega.ProposalRationale)(nil), // 50: vega.ProposalRationale + (*vega.BatchProposalTermsChange)(nil), // 51: vega.BatchProposalTermsChange + (vega.Vote_Value)(0), // 52: vega.Vote.Value + (vega.AccountType)(0), // 53: vega.AccountType + (*vega.DispatchStrategy)(nil), // 54: vega.DispatchStrategy + (NodeSignatureKind)(0), // 55: vega.commands.v1.NodeSignatureKind + (*vega.Metadata)(nil), // 56: 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 + 40, // 9: vega.commands.v1.StopOrderSetup.expiry_strategy:type_name -> vega.StopOrder.ExpiryStrategy + 41, // 10: vega.commands.v1.StopOrderSetup.size_override_setting:type_name -> vega.StopOrder.SizeOverrideSetting + 42, // 11: vega.commands.v1.StopOrderSetup.size_override_value:type_name -> vega.StopOrder.SizeOverrideValue + 43, // 12: vega.commands.v1.OrderSubmission.side:type_name -> vega.Side + 44, // 13: vega.commands.v1.OrderSubmission.time_in_force:type_name -> vega.Order.TimeInForce + 45, // 14: vega.commands.v1.OrderSubmission.type:type_name -> vega.Order.Type + 46, // 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 + 44, // 18: vega.commands.v1.OrderAmendment.time_in_force:type_name -> vega.Order.TimeInForce + 47, // 19: vega.commands.v1.OrderAmendment.pegged_reference:type_name -> vega.PeggedReference + 48, // 20: vega.commands.v1.WithdrawSubmission.ext:type_name -> vega.WithdrawExt + 49, // 21: vega.commands.v1.ProposalSubmission.terms:type_name -> vega.ProposalTerms + 50, // 22: vega.commands.v1.ProposalSubmission.rationale:type_name -> vega.ProposalRationale + 51, // 23: vega.commands.v1.BatchProposalSubmissionTerms.changes:type_name -> vega.BatchProposalTermsChange + 17, // 24: vega.commands.v1.BatchProposalSubmission.terms:type_name -> vega.commands.v1.BatchProposalSubmissionTerms + 50, // 25: vega.commands.v1.BatchProposalSubmission.rationale:type_name -> vega.ProposalRationale + 52, // 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 + 53, // 28: vega.commands.v1.Transfer.from_account_type:type_name -> vega.AccountType + 53, // 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 + 54, // 32: vega.commands.v1.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy + 55, // 33: vega.commands.v1.IssueSignatures.kind:type_name -> vega.commands.v1.NodeSignatureKind + 36, // 34: vega.commands.v1.CreateReferralSet.team:type_name -> vega.commands.v1.CreateReferralSet.Team + 37, // 35: vega.commands.v1.UpdateReferralSet.team:type_name -> vega.commands.v1.UpdateReferralSet.Team + 56, // 36: vega.commands.v1.UpdatePartyProfile.metadata:type_name -> vega.Metadata + 38, // 37: vega.commands.v1.SubmitAMM.concentrated_liquidity_parameters:type_name -> vega.commands.v1.SubmitAMM.ConcentratedLiquidityParameters + 39, // 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 +3929,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 +3941,54 @@ 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.(*DelayedTransactionsWrapper); 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.(*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[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateReferralSet_Team); i { case 0: return &v.state @@ -3320,6 +4000,30 @@ func file_vega_commands_v1_commands_proto_init() { return nil } } + file_vega_commands_v1_commands_proto_msgTypes[35].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[36].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 +4041,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[33].OneofWrappers = []interface{}{} + file_vega_commands_v1_commands_proto_msgTypes[34].OneofWrappers = []interface{}{} + file_vega_commands_v1_commands_proto_msgTypes[35].OneofWrappers = []interface{}{} + file_vega_commands_v1_commands_proto_msgTypes[36].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: 37, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/commands/v1/transaction.pb.go b/protos/vega/commands/v1/transaction.pb.go index ad0e30c0c87..0b419fcf368 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 @@ -121,6 +124,7 @@ type InputData struct { // *InputData_ProtocolUpgradeProposal // *InputData_IssueSignatures // *InputData_OracleDataSubmission + // *InputData_DelayedTransactionsWrapper Command isInputData_Command `protobuf_oneof:"command"` } @@ -345,6 +349,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 @@ -415,6 +440,13 @@ func (x *InputData) GetOracleDataSubmission() *OracleDataSubmission { return nil } +func (x *InputData) GetDelayedTransactionsWrapper() *DelayedTransactionsWrapper { + if x, ok := x.GetCommand().(*InputData_DelayedTransactionsWrapper); ok { + return x.DelayedTransactionsWrapper + } + return nil +} + type isInputData_Command interface { isInputData_Command() } @@ -539,6 +571,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"` @@ -589,6 +636,11 @@ type InputData_OracleDataSubmission struct { OracleDataSubmission *OracleDataSubmission `protobuf:"bytes,3001,opt,name=oracle_data_submission,json=oracleDataSubmission,proto3,oneof"` } +type InputData_DelayedTransactionsWrapper struct { + // Internal transactions used to convey delayed transactions to be included in the next block. + DelayedTransactionsWrapper *DelayedTransactionsWrapper `protobuf:"bytes,4000,opt,name=delayed_transactions_wrapper,json=delayedTransactionsWrapper,proto3,oneof"` +} + func (*InputData_OrderSubmission) isInputData_Command() {} func (*InputData_OrderCancellation) isInputData_Command() {} @@ -637,6 +689,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() {} @@ -657,6 +715,8 @@ func (*InputData_IssueSignatures) isInputData_Command() {} func (*InputData_OracleDataSubmission) isInputData_Command() {} +func (*InputData_DelayedTransactionsWrapper) isInputData_Command() {} + // Transaction containing a command that can be sent to instruct the network to execute an action. // A transaction contains a byte string representation of the input data which must then be signed, with the signature added to the transaction. type Transaction struct { @@ -854,7 +914,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, 0xfd, 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 +1054,112 @@ 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, 0x12, 0x71, 0x0a, 0x1c, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x18, 0xa0, 0x1f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x1a, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 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 +1205,21 @@ 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 + (*DelayedTransactionsWrapper)(nil), // 41: vega.commands.v1.DelayedTransactionsWrapper + (*Signature)(nil), // 42: 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 +1246,28 @@ 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.InputData.delayed_transactions_wrapper:type_name -> vega.commands.v1.DelayedTransactionsWrapper + 42, // 38: vega.commands.v1.Transaction.signature:type_name -> vega.commands.v1.Signature + 0, // 39: vega.commands.v1.Transaction.version:type_name -> vega.commands.v1.TxVersion + 3, // 40: vega.commands.v1.Transaction.pow:type_name -> vega.commands.v1.ProofOfWork + 41, // [41:41] is the sub-list for method output_type + 41, // [41:41] is the sub-list for method input_type + 41, // [41:41] is the sub-list for extension type_name + 41, // [41:41] is the sub-list for extension extendee + 0, // [0:41] is the sub-list for field type_name } func init() { file_vega_commands_v1_transaction_proto_init() } @@ -1256,6 +1342,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), @@ -1266,6 +1355,7 @@ func file_vega_commands_v1_transaction_proto_init() { (*InputData_ProtocolUpgradeProposal)(nil), (*InputData_IssueSignatures)(nil), (*InputData_OracleDataSubmission)(nil), + (*InputData_DelayedTransactionsWrapper)(nil), } file_vega_commands_v1_transaction_proto_msgTypes[1].OneofWrappers = []interface{}{ (*Transaction_Address)(nil), diff --git a/protos/vega/commands/v1/validator_commands.pb.go b/protos/vega/commands/v1/validator_commands.pb.go index 603f0b67345..7ad36560f4b 100644 --- a/protos/vega/commands/v1/validator_commands.pb.go +++ b/protos/vega/commands/v1/validator_commands.pb.go @@ -117,6 +117,8 @@ const ( NodeVote_TYPE_GOVERNANCE_VALIDATE_ASSET NodeVote_Type = 12 // Node vote for an Ethereum contract call result NodeVote_TYPE_ETHEREUM_CONTRACT_CALL_RESULT NodeVote_Type = 13 + // Node vote for an Ethereum chain event heartbeat. + NodeVote_TYPE_ETHEREUM_HEARTBEAT NodeVote_Type = 14 ) // Enum value maps for NodeVote_Type. @@ -136,6 +138,7 @@ var ( 11: "TYPE_SIGNER_THRESHOLD_SET", 12: "TYPE_GOVERNANCE_VALIDATE_ASSET", 13: "TYPE_ETHEREUM_CONTRACT_CALL_RESULT", + 14: "TYPE_ETHEREUM_HEARTBEAT", } NodeVote_Type_value = map[string]int32{ "TYPE_UNSPECIFIED": 0, @@ -152,6 +155,7 @@ var ( "TYPE_SIGNER_THRESHOLD_SET": 11, "TYPE_GOVERNANCE_VALIDATE_ASSET": 12, "TYPE_ETHEREUM_CONTRACT_CALL_RESULT": 13, + "TYPE_ETHEREUM_HEARTBEAT": 14, } ) @@ -560,6 +564,7 @@ type ChainEvent struct { // *ChainEvent_StakingEvent // *ChainEvent_Erc20Multisig // *ChainEvent_ContractCall + // *ChainEvent_Heartbeat Event isChainEvent_Event `protobuf_oneof:"event"` } @@ -651,6 +656,13 @@ func (x *ChainEvent) GetContractCall() *vega.EthContractCallEvent { return nil } +func (x *ChainEvent) GetHeartbeat() *vega.ERC20Heartbeat { + if x, ok := x.GetEvent().(*ChainEvent_Heartbeat); ok { + return x.Heartbeat + } + return nil +} + type isChainEvent_Event interface { isChainEvent_Event() } @@ -680,6 +692,11 @@ type ChainEvent_ContractCall struct { ContractCall *vega.EthContractCallEvent `protobuf:"bytes,1007,opt,name=contract_call,json=contractCall,proto3,oneof"` } +type ChainEvent_Heartbeat struct { + // Heartbeat showing evidence that a contract is being listened to. + Heartbeat *vega.ERC20Heartbeat `protobuf:"bytes,1008,opt,name=heartbeat,proto3,oneof"` +} + func (*ChainEvent_Builtin) isChainEvent_Event() {} func (*ChainEvent_Erc20) isChainEvent_Event() {} @@ -690,6 +707,8 @@ func (*ChainEvent_Erc20Multisig) isChainEvent_Event() {} func (*ChainEvent_ContractCall) isChainEvent_Event() {} +func (*ChainEvent_Heartbeat) isChainEvent_Event() {} + // A validator command sent manually that allows a node operator to indicate to the network that their node's Vega key will be rotated. type KeyRotateSubmission struct { state protoimpl.MessageState @@ -1015,13 +1034,13 @@ var file_vega_commands_v1_validator_commands_proto_rawDesc = []byte{ 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xe8, 0x03, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x56, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x85, 0x04, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x6f, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 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, 0x2e, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x82, 0x03, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x9f, 0x03, 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, 0x18, 0x0a, 0x14, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4b, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, @@ -1045,99 +1064,105 @@ var file_vega_commands_v1_validator_commands_proto_rawDesc = []byte{ 0x43, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, 0x0c, 0x12, 0x26, 0x0a, 0x22, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x5f, 0x43, 0x41, - 0x4c, 0x4c, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x10, 0x0d, 0x4a, 0x04, 0x08, 0x01, 0x10, - 0x02, 0x22, 0x6a, 0x0a, 0x0d, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x73, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x23, 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, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xf5, 0x02, - 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x0a, 0x05, - 0x74, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, - 0x69, 0x6e, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x12, 0x29, 0x0a, - 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, 0x12, 0x3a, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x6b, - 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0e, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, - 0x69, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x72, 0x63, 0x32, 0x30, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0xef, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x42, 0x07, 0x0a, 0x05, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x06, 0x08, 0xeb, 0x07, 0x10, 0xec, 0x07, 0x4a, 0x06, 0x08, - 0xec, 0x07, 0x10, 0xed, 0x07, 0x22, 0xb4, 0x01, 0x0a, 0x13, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, - 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, - 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x50, 0x75, 0x62, - 0x4b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 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, 0x2f, 0x0a, 0x14, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x68, - 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, 0x22, 0x83, 0x02, 0x0a, - 0x1b, 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, 0x21, 0x0a, 0x0c, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x4c, 0x4c, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x10, 0x0d, 0x12, 0x1b, 0x0a, 0x17, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x45, 0x55, 0x4d, 0x5f, 0x48, 0x45, 0x41, + 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x0e, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x6a, + 0x0a, 0x0d, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x73, 0x69, + 0x67, 0x12, 0x37, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x23, 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, + 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0xac, 0x03, 0x0a, 0x0a, 0x43, + 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x13, 0x0a, 0x05, 0x74, 0x78, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x78, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x18, + 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x75, + 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x72, + 0x63, 0x32, 0x30, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, + 0x65, 0x72, 0x63, 0x32, 0x30, 0x12, 0x3a, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x42, 0x0a, 0x0e, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x73, 0x69, 0x67, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x69, 0x67, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x72, 0x63, 0x32, 0x30, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0xef, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x35, 0x0a, 0x09, 0x68, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0xf0, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x52, 0x43, 0x32, 0x30, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x09, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, + 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x06, 0x08, 0xeb, 0x07, 0x10, 0xec, + 0x07, 0x4a, 0x06, 0x08, 0xec, 0x07, 0x10, 0xed, 0x07, 0x22, 0xb4, 0x01, 0x0a, 0x13, 0x4b, 0x65, + 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x29, 0x0a, 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21, 0x0a, 0x0c, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, - 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 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, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x05, 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, - 0x11, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x22, 0x4d, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x34, 0x0a, 0x08, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x22, 0x75, 0x0a, 0x17, 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, 0x2a, 0x97, 0x02, 0x0a, 0x11, 0x4e, 0x6f, 0x64, - 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x23, - 0x0a, 0x1f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, - 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, - 0x5f, 0x4e, 0x45, 0x57, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, - 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x53, - 0x53, 0x45, 0x54, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x41, 0x4c, 0x10, 0x02, - 0x12, 0x33, 0x0a, 0x2f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, - 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, - 0x4c, 0x54, 0x49, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x41, 0x44, - 0x44, 0x45, 0x44, 0x10, 0x03, 0x12, 0x35, 0x0a, 0x31, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, - 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x52, 0x43, - 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, - 0x45, 0x52, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, - 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, - 0x10, 0x05, 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, + 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, + 0x2f, 0x0a, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x48, 0x61, 0x73, 0x68, + 0x22, 0x83, 0x02, 0x0a, 0x1b, 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, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x77, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 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, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, + 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x4a, 0x0a, 0x12, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x05, 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, 0x11, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x4d, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, + 0x34, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x22, 0x75, 0x0a, 0x17, 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, 0x2a, 0x97, 0x02, 0x0a, + 0x11, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x1f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, + 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x4e, 0x4f, 0x44, 0x45, 0x5f, + 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, + 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x45, 0x57, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x4e, 0x4f, + 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, + 0x41, 0x4c, 0x10, 0x02, 0x12, 0x33, 0x0a, 0x2f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, + 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x52, 0x43, 0x32, + 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x53, 0x49, 0x47, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x45, + 0x52, 0x5f, 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x03, 0x12, 0x35, 0x0a, 0x31, 0x4e, 0x4f, 0x44, + 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x53, 0x49, 0x47, 0x5f, + 0x53, 0x49, 0x47, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x04, + 0x12, 0x24, 0x0a, 0x20, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, + 0x52, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x55, 0x50, + 0x44, 0x41, 0x54, 0x45, 0x10, 0x05, 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 ( @@ -1172,7 +1197,8 @@ var file_vega_commands_v1_validator_commands_proto_goTypes = []interface{}{ (*vega.StakingEvent)(nil), // 14: vega.StakingEvent (*vega.ERC20MultiSigEvent)(nil), // 15: vega.ERC20MultiSigEvent (*vega.EthContractCallEvent)(nil), // 16: vega.EthContractCallEvent - (*vega.StateValueProposal)(nil), // 17: vega.StateValueProposal + (*vega.ERC20Heartbeat)(nil), // 17: vega.ERC20Heartbeat + (*vega.StateValueProposal)(nil), // 18: vega.StateValueProposal } var file_vega_commands_v1_validator_commands_proto_depIdxs = []int32{ 11, // 0: vega.commands.v1.ValidatorHeartbeat.ethereum_signature:type_name -> vega.commands.v1.Signature @@ -1186,13 +1212,14 @@ var file_vega_commands_v1_validator_commands_proto_depIdxs = []int32{ 14, // 8: vega.commands.v1.ChainEvent.staking_event:type_name -> vega.StakingEvent 15, // 9: vega.commands.v1.ChainEvent.erc20_multisig:type_name -> vega.ERC20MultiSigEvent 16, // 10: vega.commands.v1.ChainEvent.contract_call:type_name -> vega.EthContractCallEvent - 11, // 11: vega.commands.v1.EthereumKeyRotateSubmission.ethereum_signature:type_name -> vega.commands.v1.Signature - 17, // 12: vega.commands.v1.StateVariableProposal.proposal:type_name -> vega.StateValueProposal - 13, // [13:13] is the sub-list for method output_type - 13, // [13:13] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 17, // 11: vega.commands.v1.ChainEvent.heartbeat:type_name -> vega.ERC20Heartbeat + 11, // 12: vega.commands.v1.EthereumKeyRotateSubmission.ethereum_signature:type_name -> vega.commands.v1.Signature + 18, // 13: vega.commands.v1.StateVariableProposal.proposal:type_name -> vega.StateValueProposal + 14, // [14:14] is the sub-list for method output_type + 14, // [14:14] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_vega_commands_v1_validator_commands_proto_init() } @@ -1317,6 +1344,7 @@ func file_vega_commands_v1_validator_commands_proto_init() { (*ChainEvent_StakingEvent)(nil), (*ChainEvent_Erc20Multisig)(nil), (*ChainEvent_ContractCall)(nil), + (*ChainEvent_Heartbeat)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/protos/vega/errors.go b/protos/vega/errors.go index 3e3294d0a71..60b3be0dd7f 100644 --- a/protos/vega/errors.go +++ b/protos/vega/errors.go @@ -126,6 +126,8 @@ func (err OrderError) Error() string { return "OrderError: pegged orders not allowed in isolated margin mode" case OrderError_ORDER_ERROR_PRICE_NOT_IN_TICK_SIZE: return "OrderError: price not in tick size" + case OrderError_ORDER_ERROR_PRICE_MUST_BE_LESS_THAN_OR_EQUAL_TO_MAX_PRICE: + return "OrderError: price exceeds max price" default: return "invalid OrderError" } diff --git a/protos/vega/events/v1/events.pb.go b/protos/vega/events/v1/events.pb.go index 6481d218ee8..f984d189437 100644 --- a/protos/vega/events/v1/events.pb.go +++ b/protos/vega/events/v1/events.pb.go @@ -264,6 +264,10 @@ 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 containing the near realtime game scores for parties and teams. + BusEventType_BUS_EVENT_TYPE_GAME_SCORES BusEventType = 90 + // Event use to notify for an AMM update. + BusEventType_BUS_EVENT_TYPE_AMM BusEventType = 91 // 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 +367,8 @@ 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_GAME_SCORES", + 91: "BUS_EVENT_TYPE_AMM", 101: "BUS_EVENT_TYPE_MARKET", 201: "BUS_EVENT_TYPE_TX_ERROR", } @@ -457,6 +463,8 @@ 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_GAME_SCORES": 90, + "BUS_EVENT_TYPE_AMM": 91, "BUS_EVENT_TYPE_MARKET": 101, "BUS_EVENT_TYPE_TX_ERROR": 201, } @@ -489,6 +497,140 @@ func (BusEventType) EnumDescriptor() ([]byte, []int) { return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1} } +type AMM_Status int32 + +const ( + AMM_STATUS_UNSPECIFIED AMM_Status = 0 + // AMM is active on the market and is posting tradable volume. + AMM_STATUS_ACTIVE AMM_Status = 1 + // AMM submission was rejected. + AMM_STATUS_REJECTED AMM_Status = 2 + // AMM has been cancelled by the owner and is no longer trading. + AMM_STATUS_CANCELLED AMM_Status = 3 + // AMM has been stopped by the network and is no longer trading. + AMM_STATUS_STOPPED AMM_Status = 4 + // AMM will only trade such that it will reduce its position. + AMM_STATUS_REDUCE_ONLY AMM_Status = 5 +) + +// Enum value maps for AMM_Status. +var ( + AMM_Status_name = map[int32]string{ + 0: "STATUS_UNSPECIFIED", + 1: "STATUS_ACTIVE", + 2: "STATUS_REJECTED", + 3: "STATUS_CANCELLED", + 4: "STATUS_STOPPED", + 5: "STATUS_REDUCE_ONLY", + } + AMM_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 AMM_Status) Enum() *AMM_Status { + p := new(AMM_Status) + *p = x + return p +} + +func (x AMM_Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AMM_Status) Descriptor() protoreflect.EnumDescriptor { + return file_vega_events_v1_events_proto_enumTypes[2].Descriptor() +} + +func (AMM_Status) Type() protoreflect.EnumType { + return &file_vega_events_v1_events_proto_enumTypes[2] +} + +func (x AMM_Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AMM_Status.Descriptor instead. +func (AMM_Status) EnumDescriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1, 0} +} + +type AMM_StatusReason int32 + +const ( + AMM_STATUS_REASON_UNSPECIFIED AMM_StatusReason = 0 + // AMM was cancelled by its owner. + AMM_STATUS_REASON_CANCELLED_BY_PARTY AMM_StatusReason = 1 + // Party does not have enough funds in their general account to meet the AMM's commitment. + AMM_STATUS_REASON_CANNOT_FILL_COMMITMENT AMM_StatusReason = 2 + // Party already has an AMM operating on this market and cannot create another one. + AMM_STATUS_REASON_PARTY_ALREADY_OWNS_AMM_FOR_MARKET AMM_StatusReason = 3 + // AMM was liquidated and stopped by the network. + AMM_STATUS_REASON_PARTY_CLOSED_OUT AMM_StatusReason = 4 + // AMM was stopped by the network because the market it operated in was closed. + AMM_STATUS_REASON_MARKET_CLOSED AMM_StatusReason = 5 + // Commitment amount was below the network wide minimum, or its price bounds are too wide, such that the volume is spread thinly creating zero-volume price-levels. + AMM_STATUS_REASON_COMMITMENT_TOO_LOW AMM_StatusReason = 6 + // AMM was unable to rebase its fair-price such that it does not cross with existing orders. + AMM_STATUS_REASON_CANNOT_REBASE AMM_StatusReason = 7 +) + +// Enum value maps for AMM_StatusReason. +var ( + AMM_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_AMM_FOR_MARKET", + 4: "STATUS_REASON_PARTY_CLOSED_OUT", + 5: "STATUS_REASON_MARKET_CLOSED", + 6: "STATUS_REASON_COMMITMENT_TOO_LOW", + 7: "STATUS_REASON_CANNOT_REBASE", + } + AMM_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_AMM_FOR_MARKET": 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 AMM_StatusReason) Enum() *AMM_StatusReason { + p := new(AMM_StatusReason) + *p = x + return p +} + +func (x AMM_StatusReason) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AMM_StatusReason) Descriptor() protoreflect.EnumDescriptor { + return file_vega_events_v1_events_proto_enumTypes[3].Descriptor() +} + +func (AMM_StatusReason) Type() protoreflect.EnumType { + return &file_vega_events_v1_events_proto_enumTypes[3] +} + +func (x AMM_StatusReason) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AMM_StatusReason.Descriptor instead. +func (AMM_StatusReason) EnumDescriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1, 1} +} + type FundingPeriodDataPoint_Source int32 const ( @@ -525,11 +667,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 +680,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 +732,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 +745,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 +784,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 +797,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 +840,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 +853,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 +889,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 +902,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 +994,142 @@ func (x *TimeWeightedNotionalPositionUpdated) GetTimeWeightedNotionalPosition() return "" } +type AMM struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // ID of the AMM. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Party ID of the owner of the AMM. + PartyId string `protobuf:"bytes,2,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + // Market ID that the AMM provides liquidity for. + MarketId string `protobuf:"bytes,3,opt,name=market_id,json=marketId,proto3" json:"market_id,omitempty"` + // Party ID that the AMM operates as. + AmmPartyId string `protobuf:"bytes,4,opt,name=amm_party_id,json=ammPartyId,proto3" json:"amm_party_id,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 *AMM_ConcentratedLiquidityParameters `protobuf:"bytes,6,opt,name=parameters,proto3" json:"parameters,omitempty"` + // Current status of the AMM. + Status AMM_Status `protobuf:"varint,7,opt,name=status,proto3,enum=vega.events.v1.AMM_Status" json:"status,omitempty"` + // Reason for the AMM's current status. + StatusReason AMM_StatusReason `protobuf:"varint,8,opt,name=status_reason,json=statusReason,proto3,enum=vega.events.v1.AMM_StatusReason" json:"status_reason,omitempty"` + // Nominated liquidity fee factor, which is an input to the calculation of taker fees on the market. + ProposedFee string `protobuf:"bytes,9,opt,name=proposed_fee,json=proposedFee,proto3" json:"proposed_fee,omitempty"` + LowerCurve *AMM_Curve `protobuf:"bytes,10,opt,name=lower_curve,json=lowerCurve,proto3,oneof" json:"lower_curve,omitempty"` + UpperCurve *AMM_Curve `protobuf:"bytes,11,opt,name=upper_curve,json=upperCurve,proto3,oneof" json:"upper_curve,omitempty"` +} + +func (x *AMM) Reset() { + *x = AMM{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_events_v1_events_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMM) ProtoMessage() {} + +func (x *AMM) 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 AMM.ProtoReflect.Descriptor instead. +func (*AMM) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1} +} + +func (x *AMM) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AMM) GetPartyId() string { + if x != nil { + return x.PartyId + } + return "" +} + +func (x *AMM) GetMarketId() string { + if x != nil { + return x.MarketId + } + return "" +} + +func (x *AMM) GetAmmPartyId() string { + if x != nil { + return x.AmmPartyId + } + return "" +} + +func (x *AMM) GetCommitment() string { + if x != nil { + return x.Commitment + } + return "" +} + +func (x *AMM) GetParameters() *AMM_ConcentratedLiquidityParameters { + if x != nil { + return x.Parameters + } + return nil +} + +func (x *AMM) GetStatus() AMM_Status { + if x != nil { + return x.Status + } + return AMM_STATUS_UNSPECIFIED +} + +func (x *AMM) GetStatusReason() AMM_StatusReason { + if x != nil { + return x.StatusReason + } + return AMM_STATUS_REASON_UNSPECIFIED +} + +func (x *AMM) GetProposedFee() string { + if x != nil { + return x.ProposedFee + } + return "" +} + +func (x *AMM) GetLowerCurve() *AMM_Curve { + if x != nil { + return x.LowerCurve + } + return nil +} + +func (x *AMM) GetUpperCurve() *AMM_Curve { + if x != nil { + return x.UpperCurve + } + return nil +} + // Summary of the vesting and locked balances for an epoch type VestingBalancesSummary struct { state protoimpl.MessageState @@ -867,7 +1145,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 +1158,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 +1171,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 +1205,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 +1218,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 +1231,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 +1272,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 +1285,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 +1298,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 +1337,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 +1350,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 +1363,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 +1395,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 +1408,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 +1421,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 +1455,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 +1468,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 +1481,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 +1520,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 +1533,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 +1546,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 { @@ -1297,12 +1575,16 @@ type PartyVestingStats struct { RewardBonusMultiplier string `protobuf:"bytes,2,opt,name=reward_bonus_multiplier,json=rewardBonusMultiplier,proto3" json:"reward_bonus_multiplier,omitempty"` // The balance of the party, in quantum. QuantumBalance string `protobuf:"bytes,3,opt,name=quantum_balance,json=quantumBalance,proto3" json:"quantum_balance,omitempty"` + // Bonus multiplier applied on the reward, summed across all derived accounts. + SummedRewardBonusMultiplier string `protobuf:"bytes,4,opt,name=summed_reward_bonus_multiplier,json=summedRewardBonusMultiplier,proto3" json:"summed_reward_bonus_multiplier,omitempty"` + // The balance of the party and derived keys, in quantum. + SummedQuantumBalance string `protobuf:"bytes,5,opt,name=summed_quantum_balance,json=summedQuantumBalance,proto3" json:"summed_quantum_balance,omitempty"` } 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 +1597,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 +1610,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 { @@ -1352,6 +1634,20 @@ func (x *PartyVestingStats) GetQuantumBalance() string { return "" } +func (x *PartyVestingStats) GetSummedRewardBonusMultiplier() string { + if x != nil { + return x.SummedRewardBonusMultiplier + } + return "" +} + +func (x *PartyVestingStats) GetSummedQuantumBalance() string { + if x != nil { + return x.SummedQuantumBalance + } + return "" +} + // Fees rewards and discounts paid / received per parties during an epoch type FeesStats struct { state protoimpl.MessageState @@ -1383,7 +1679,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 +1692,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 +1705,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 +1793,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 +1806,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 +1819,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 +1851,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 +1864,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 +1877,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 +1911,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 +1924,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 +1937,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 +1990,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 +2003,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 +2016,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 +2109,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 +2122,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 +2135,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 +2209,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 +2222,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 +2235,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 +2269,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 +2282,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 +2295,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 +2342,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 +2355,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 +2368,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 +2425,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 +2438,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 +2451,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 +2494,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 +2507,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 +2520,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 +2593,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 +2606,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 +2619,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 +2662,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 +2675,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 +2688,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 +2771,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 +2784,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 +2797,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 +2958,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 +2971,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 +2984,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 +3005,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 +3018,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 +3031,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 +3055,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 +3068,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 +3081,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 { @@ -2824,12 +3120,13 @@ type RecurringGovernanceTransfer struct { StartEpoch uint64 `protobuf:"varint,1,opt,name=start_epoch,json=startEpoch,proto3" json:"start_epoch,omitempty"` EndEpoch *uint64 `protobuf:"varint,2,opt,name=end_epoch,json=endEpoch,proto3,oneof" json:"end_epoch,omitempty"` DispatchStrategy *vega.DispatchStrategy `protobuf:"bytes,3,opt,name=dispatch_strategy,json=dispatchStrategy,proto3,oneof" json:"dispatch_strategy,omitempty"` + Factor string `protobuf:"bytes,4,opt,name=factor,proto3" json:"factor,omitempty"` } 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 +3139,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 +3152,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 { @@ -2879,6 +3176,13 @@ func (x *RecurringGovernanceTransfer) GetDispatchStrategy() *vega.DispatchStrate return nil } +func (x *RecurringGovernanceTransfer) GetFactor() string { + if x != nil { + return x.Factor + } + return "" +} + // StakeLinking - an event notifying of stake being deposited or removed for a given party // These events are emitted for every Staking deposit or removed accepted by the network type StakeLinking struct { @@ -2915,7 +3219,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 +3232,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 +3245,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 +3351,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 +3364,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 +3377,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 +3461,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 +3474,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 +3487,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 +3559,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 +3572,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 +3585,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 +3620,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 +3633,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 +3646,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 +3676,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 +3689,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 +3702,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 +3794,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 +3807,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 +3820,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 +3894,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 +3907,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 +3920,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 +3967,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 +3980,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 +3993,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 +4028,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 +4041,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 +4054,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 +4103,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 +4116,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 +4129,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 +4202,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 +4218,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 +4231,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 +4244,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 +4478,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 +4640,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 +4710,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 +4769,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 +4782,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 +4795,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 +5070,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 +5083,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 +5096,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 +5127,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 +5140,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 +5153,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 +5204,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 +5217,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 +5230,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 +5259,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 +5272,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 +5285,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 +5333,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 +5346,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 +5359,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 +5400,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 +5413,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 +5426,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 +5471,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 +5484,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 +5497,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 +5553,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 +5566,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 +5579,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 +5626,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 +5639,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 +5652,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 +5725,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 +5738,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 +5751,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 +5798,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 +5811,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 +5824,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 +5861,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 +5874,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 +5887,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 +5926,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 +5939,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 +5952,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 +5995,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 +6008,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 +6021,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 +6110,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 +6123,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 +6136,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 +6256,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 +6269,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 +6282,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 +6360,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 +6373,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 +6386,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 +6436,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 +6449,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 +6462,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 +6511,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 +6524,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 +6537,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 +6582,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 +6595,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 +6608,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 +6646,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 +6659,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 +6672,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 +6708,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 +6721,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 +6734,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 +6756,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 +6769,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 +6782,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 +6804,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 +6817,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 +6830,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 +6859,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 +6872,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 +6885,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 +6930,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 +6943,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 +6956,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 +6989,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 +7002,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 +7015,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 +7067,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 +7080,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 +7093,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 +7181,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 +7194,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 +7207,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 +7273,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 +7286,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 +7299,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 +7355,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 +7368,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 +7381,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 +7430,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 +7443,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 +7456,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 +7516,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 +7529,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 +7542,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 +7624,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 +7637,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 +7650,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 +7692,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 +7705,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 +7718,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 +7765,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 +7778,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 +7791,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 +7831,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 +7844,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 +7857,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 +7899,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 +7912,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 +7925,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 +7972,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 +7985,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 +7998,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 +8038,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 +8051,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 +8064,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 +8106,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 +8119,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 +8132,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 +8183,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 +8196,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 +8209,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 +8271,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 +8284,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 +8297,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 +8361,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 +8374,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 +8387,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 +8412,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 +8425,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 +8438,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 { @@ -8106,37 +8452,297 @@ func (x *TeamsStatsUpdated) GetStats() []*TeamStats { if x != nil { return x.Stats } - return nil + return nil +} + +type TeamStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The unique identifier of the team. + TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Statistics for each team member. + MembersStats []*TeamMemberStats `protobuf:"bytes,2,rep,name=members_stats,json=membersStats,proto3" json:"members_stats,omitempty"` +} + +func (x *TeamStats) Reset() { + *x = TeamStats{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_events_v1_events_proto_msgTypes[86] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TeamStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeamStats) ProtoMessage() {} + +func (x *TeamStats) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeamStats.ProtoReflect.Descriptor instead. +func (*TeamStats) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{86} +} + +func (x *TeamStats) GetTeamId() string { + if x != nil { + return x.TeamId + } + return "" +} + +func (x *TeamStats) GetMembersStats() []*TeamMemberStats { + if x != nil { + return x.MembersStats + } + return nil +} + +type TeamMemberStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The party ID of the team member. + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + // Team members' notional volume for the epoch. + NotionalVolume string `protobuf:"bytes,2,opt,name=notional_volume,json=notionalVolume,proto3" json:"notional_volume,omitempty"` +} + +func (x *TeamMemberStats) Reset() { + *x = TeamMemberStats{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_events_v1_events_proto_msgTypes[87] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TeamMemberStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TeamMemberStats) ProtoMessage() {} + +func (x *TeamMemberStats) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TeamMemberStats.ProtoReflect.Descriptor instead. +func (*TeamMemberStats) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{87} +} + +func (x *TeamMemberStats) GetPartyId() string { + if x != nil { + return x.PartyId + } + return "" +} + +func (x *TeamMemberStats) GetNotionalVolume() string { + if x != nil { + return x.NotionalVolume + } + return "" +} + +// Scores per party per game with eligibility context. +type GamePartyScore struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Game ID. + GameId string `protobuf:"bytes,1,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"` + // The party ID. + Party string `protobuf:"bytes,2,opt,name=party,proto3" json:"party,omitempty"` + // Team the party belongs to. Unset if the party is not part of a team. + TeamId *string `protobuf:"bytes,3,opt,name=team_id,json=teamId,proto3,oneof" json:"team_id,omitempty"` + // Epoch when these scores were generated. + Epoch int64 `protobuf:"varint,4,opt,name=epoch,proto3" json:"epoch,omitempty"` + // Timestamp in Unix nanoseconds when these scores were generated. + Time int64 `protobuf:"varint,5,opt,name=time,proto3" json:"time,omitempty"` + // Party's current score in the game. + Score string `protobuf:"bytes,6,opt,name=score,proto3" json:"score,omitempty"` + // Party's current staking balance. Only populated if the game has a requirement for it. + StakingBalance string `protobuf:"bytes,7,opt,name=staking_balance,json=stakingBalance,proto3" json:"staking_balance,omitempty"` + // Party's current open volume. Only populated if the game has a requirement for it. + OpenVolume string `protobuf:"bytes,8,opt,name=open_volume,json=openVolume,proto3" json:"open_volume,omitempty"` + // Total fees paid by the party during the relevant period. + TotalFeesPaid string `protobuf:"bytes,9,opt,name=total_fees_paid,json=totalFeesPaid,proto3" json:"total_fees_paid,omitempty"` + // If the party is eligible for a reward for this game based on the current information. + IsEligible bool `protobuf:"varint,10,opt,name=is_eligible,json=isEligible,proto3" json:"is_eligible,omitempty"` + // If the party is a member of a team, this is their relative position in the sorting order of the team. + // Empty if not a team, or if the party is not eligible. + Rank *uint64 `protobuf:"varint,11,opt,name=rank,proto3,oneof" json:"rank,omitempty"` +} + +func (x *GamePartyScore) Reset() { + *x = GamePartyScore{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_events_v1_events_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GamePartyScore) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GamePartyScore) ProtoMessage() {} + +func (x *GamePartyScore) ProtoReflect() protoreflect.Message { + 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 { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GamePartyScore.ProtoReflect.Descriptor instead. +func (*GamePartyScore) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{88} +} + +func (x *GamePartyScore) GetGameId() string { + if x != nil { + return x.GameId + } + return "" +} + +func (x *GamePartyScore) GetParty() string { + if x != nil { + return x.Party + } + return "" +} + +func (x *GamePartyScore) GetTeamId() string { + if x != nil && x.TeamId != nil { + return *x.TeamId + } + return "" +} + +func (x *GamePartyScore) GetEpoch() int64 { + if x != nil { + return x.Epoch + } + return 0 +} + +func (x *GamePartyScore) GetTime() int64 { + if x != nil { + return x.Time + } + return 0 +} + +func (x *GamePartyScore) GetScore() string { + if x != nil { + return x.Score + } + return "" +} + +func (x *GamePartyScore) GetStakingBalance() string { + if x != nil { + return x.StakingBalance + } + return "" +} + +func (x *GamePartyScore) GetOpenVolume() string { + if x != nil { + return x.OpenVolume + } + return "" +} + +func (x *GamePartyScore) GetTotalFeesPaid() string { + if x != nil { + return x.TotalFeesPaid + } + return "" +} + +func (x *GamePartyScore) GetIsEligible() bool { + if x != nil { + return x.IsEligible + } + return false +} + +func (x *GamePartyScore) GetRank() uint64 { + if x != nil && x.Rank != nil { + return *x.Rank + } + return 0 } -type TeamStats struct { +type GameTeamScore struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The unique identifier of the team. - TeamId string `protobuf:"bytes,1,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` - // Statistics for each team member. - MembersStats []*TeamMemberStats `protobuf:"bytes,2,rep,name=members_stats,json=membersStats,proto3" json:"members_stats,omitempty"` + // Game ID. + GameId string `protobuf:"bytes,1,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"` + // Team ID + TeamId string `protobuf:"bytes,2,opt,name=team_id,json=teamId,proto3" json:"team_id,omitempty"` + // Epoch when these scores were generated. + Epoch int64 `protobuf:"varint,3,opt,name=epoch,proto3" json:"epoch,omitempty"` + // Timestamp in Unix nanoseconds when these scores were generated. + Time int64 `protobuf:"varint,4,opt,name=time,proto3" json:"time,omitempty"` + // Team's current collective score in the game. + Score string `protobuf:"bytes,5,opt,name=score,proto3" json:"score,omitempty"` } -func (x *TeamStats) Reset() { - *x = TeamStats{} +func (x *GameTeamScore) Reset() { + *x = GameTeamScore{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[85] + mi := &file_vega_events_v1_events_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TeamStats) String() string { +func (x *GameTeamScore) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TeamStats) ProtoMessage() {} +func (*GameTeamScore) ProtoMessage() {} -func (x *TeamStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[85] +func (x *GameTeamScore) 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 { @@ -8147,53 +8753,72 @@ func (x *TeamStats) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TeamStats.ProtoReflect.Descriptor instead. -func (*TeamStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{85} +// Deprecated: Use GameTeamScore.ProtoReflect.Descriptor instead. +func (*GameTeamScore) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{89} } -func (x *TeamStats) GetTeamId() string { +func (x *GameTeamScore) GetGameId() string { + if x != nil { + return x.GameId + } + return "" +} + +func (x *GameTeamScore) GetTeamId() string { if x != nil { return x.TeamId } return "" } -func (x *TeamStats) GetMembersStats() []*TeamMemberStats { +func (x *GameTeamScore) GetEpoch() int64 { if x != nil { - return x.MembersStats + return x.Epoch } - return nil + return 0 } -type TeamMemberStats struct { +func (x *GameTeamScore) GetTime() int64 { + if x != nil { + return x.Time + } + return 0 +} + +func (x *GameTeamScore) GetScore() string { + if x != nil { + return x.Score + } + return "" +} + +type GameScores struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The party ID of the team member. - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` - // Team members' notional volume for the epoch. - NotionalVolume string `protobuf:"bytes,2,opt,name=notional_volume,json=notionalVolume,proto3" json:"notional_volume,omitempty"` + TeamScores []*GameTeamScore `protobuf:"bytes,1,rep,name=team_scores,json=teamScores,proto3" json:"team_scores,omitempty"` + PartyScores []*GamePartyScore `protobuf:"bytes,2,rep,name=party_scores,json=partyScores,proto3" json:"party_scores,omitempty"` } -func (x *TeamMemberStats) Reset() { - *x = TeamMemberStats{} +func (x *GameScores) Reset() { + *x = GameScores{} if protoimpl.UnsafeEnabled { - mi := &file_vega_events_v1_events_proto_msgTypes[86] + mi := &file_vega_events_v1_events_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *TeamMemberStats) String() string { +func (x *GameScores) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TeamMemberStats) ProtoMessage() {} +func (*GameScores) ProtoMessage() {} -func (x *TeamMemberStats) ProtoReflect() protoreflect.Message { - mi := &file_vega_events_v1_events_proto_msgTypes[86] +func (x *GameScores) ProtoReflect() protoreflect.Message { + 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 { @@ -8204,23 +8829,23 @@ func (x *TeamMemberStats) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TeamMemberStats.ProtoReflect.Descriptor instead. -func (*TeamMemberStats) Descriptor() ([]byte, []int) { - return file_vega_events_v1_events_proto_rawDescGZIP(), []int{86} +// Deprecated: Use GameScores.ProtoReflect.Descriptor instead. +func (*GameScores) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{90} } -func (x *TeamMemberStats) GetPartyId() string { +func (x *GameScores) GetTeamScores() []*GameTeamScore { if x != nil { - return x.PartyId + return x.TeamScores } - return "" + return nil } -func (x *TeamMemberStats) GetNotionalVolume() string { +func (x *GameScores) GetPartyScores() []*GamePartyScore { if x != nil { - return x.NotionalVolume + return x.PartyScores } - return "" + return nil } // Bus event is a container for event bus events emitted by Vega @@ -8323,6 +8948,8 @@ type BusEvent struct { // *BusEvent_TeamsStatsUpdated // *BusEvent_TimeWeightedNotionalPositionUpdated // *BusEvent_CancelledOrders + // *BusEvent_GameScores + // *BusEvent_Amm // *BusEvent_Market // *BusEvent_TxErrEvent Event isBusEvent_Event `protobuf_oneof:"event"` @@ -8335,7 +8962,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[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8348,7 +8975,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[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8361,7 +8988,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{91} } func (x *BusEvent) GetId() string { @@ -8994,6 +9621,20 @@ func (x *BusEvent) GetCancelledOrders() *CancelledOrders { return nil } +func (x *BusEvent) GetGameScores() *GameScores { + if x, ok := x.GetEvent().(*BusEvent_GameScores); ok { + return x.GameScores + } + return nil +} + +func (x *BusEvent) GetAmm() *AMM { + if x, ok := x.GetEvent().(*BusEvent_Amm); ok { + return x.Amm + } + return nil +} + func (x *BusEvent) GetMarket() *MarketEvent { if x, ok := x.GetEvent().(*BusEvent_Market); ok { return x.Market @@ -9463,6 +10104,16 @@ type BusEvent_CancelledOrders struct { CancelledOrders *CancelledOrders `protobuf:"bytes,187,opt,name=cancelled_orders,json=cancelledOrders,proto3,oneof"` } +type BusEvent_GameScores struct { + // Event notifying on near realtime game scores for parties and teams. + GameScores *GameScores `protobuf:"bytes,188,opt,name=game_scores,json=gameScores,proto3,oneof"` +} + +type BusEvent_Amm struct { + // Event notifying of AMM updates. + Amm *AMM `protobuf:"bytes,189,opt,name=amm,proto3,oneof"` +} + type BusEvent_Market struct { // Market tick events Market *MarketEvent `protobuf:"bytes,1001,opt,name=market,proto3,oneof"` @@ -9645,10 +10296,156 @@ func (*BusEvent_TimeWeightedNotionalPositionUpdated) isBusEvent_Event() {} func (*BusEvent_CancelledOrders) isBusEvent_Event() {} +func (*BusEvent_GameScores) isBusEvent_Event() {} + +func (*BusEvent_Amm) 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 AMM_ConcentratedLiquidityParameters struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Base price bound configuration for the AMM. + Base string `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` + // Upper price bound configuration for the AMM. If unset, the AMM will never hold a short position. + LowerBound *string `protobuf:"bytes,2,opt,name=lower_bound,json=lowerBound,proto3,oneof" json:"lower_bound,omitempty"` + // Lower price bound configuration for the AMM. If unset, the AMM will never hold a long position. + UpperBound *string `protobuf:"bytes,3,opt,name=upper_bound,json=upperBound,proto3,oneof" json:"upper_bound,omitempty"` + // Leverage at upper bounds. + LeverageAtUpperBound *string `protobuf:"bytes,4,opt,name=leverage_at_upper_bound,json=leverageAtUpperBound,proto3,oneof" json:"leverage_at_upper_bound,omitempty"` + // Leverage at lower bounds. + LeverageAtLowerBound *string `protobuf:"bytes,5,opt,name=leverage_at_lower_bound,json=leverageAtLowerBound,proto3,oneof" json:"leverage_at_lower_bound,omitempty"` +} + +func (x *AMM_ConcentratedLiquidityParameters) Reset() { + *x = AMM_ConcentratedLiquidityParameters{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_events_v1_events_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMM_ConcentratedLiquidityParameters) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMM_ConcentratedLiquidityParameters) ProtoMessage() {} + +func (x *AMM_ConcentratedLiquidityParameters) ProtoReflect() protoreflect.Message { + mi := &file_vega_events_v1_events_proto_msgTypes[92] + 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 AMM_ConcentratedLiquidityParameters.ProtoReflect.Descriptor instead. +func (*AMM_ConcentratedLiquidityParameters) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1, 0} +} + +func (x *AMM_ConcentratedLiquidityParameters) GetBase() string { + if x != nil { + return x.Base + } + return "" +} + +func (x *AMM_ConcentratedLiquidityParameters) GetLowerBound() string { + if x != nil && x.LowerBound != nil { + return *x.LowerBound + } + return "" +} + +func (x *AMM_ConcentratedLiquidityParameters) GetUpperBound() string { + if x != nil && x.UpperBound != nil { + return *x.UpperBound + } + return "" +} + +func (x *AMM_ConcentratedLiquidityParameters) GetLeverageAtUpperBound() string { + if x != nil && x.LeverageAtUpperBound != nil { + return *x.LeverageAtUpperBound + } + return "" +} + +func (x *AMM_ConcentratedLiquidityParameters) GetLeverageAtLowerBound() string { + if x != nil && x.LeverageAtLowerBound != nil { + return *x.LeverageAtLowerBound + } + return "" +} + +type AMM_Curve struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Virtual liquidity for the given AMM curve. + VirtualLiquidity string `protobuf:"bytes,1,opt,name=virtual_liquidity,json=virtualLiquidity,proto3" json:"virtual_liquidity,omitempty"` + // Maximum tradable volume on the AMM curve. + TheoreticalPosition string `protobuf:"bytes,2,opt,name=theoretical_position,json=theoreticalPosition,proto3" json:"theoretical_position,omitempty"` +} + +func (x *AMM_Curve) Reset() { + *x = AMM_Curve{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_events_v1_events_proto_msgTypes[93] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AMM_Curve) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AMM_Curve) ProtoMessage() {} + +func (x *AMM_Curve) ProtoReflect() protoreflect.Message { + mi := &file_vega_events_v1_events_proto_msgTypes[93] + 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 AMM_Curve.ProtoReflect.Descriptor instead. +func (*AMM_Curve) Descriptor() ([]byte, []int) { + return file_vega_events_v1_events_proto_rawDescGZIP(), []int{1, 1} +} + +func (x *AMM_Curve) GetVirtualLiquidity() string { + if x != nil { + return x.VirtualLiquidity + } + return "" +} + +func (x *AMM_Curve) GetTheoreticalPosition() string { + if x != nil { + return x.TheoreticalPosition + } + return "" +} + type TransactionResult_SuccessDetails struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9658,7 +10455,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[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9671,7 +10468,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[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9684,7 +10481,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 +10496,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[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9712,7 +10509,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[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9725,7 +10522,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,1692 +10563,1850 @@ 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, - 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, + 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xaf, 0x0b, 0x0a, 0x03, 0x41, 0x4d, + 0x4d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 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, 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, 0x12, 0x20, 0x0a, 0x0c, 0x61, 0x6d, 0x6d, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x61, 0x6d, 0x6d, 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 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, 0x53, 0x0a, 0x0a, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 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, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x4d, 0x4d, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x45, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x4d, + 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, 0x12, 0x21, 0x0a, 0x0c, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x46, 0x65, 0x65, 0x12, 0x3f, + 0x0a, 0x0b, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x76, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x4d, 0x2e, 0x43, 0x75, 0x72, 0x76, 0x65, 0x48, 0x00, + 0x52, 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x43, 0x75, 0x72, 0x76, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x3f, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x76, 0x65, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x4d, 0x2e, 0x43, 0x75, 0x72, 0x76, 0x65, 0x48, + 0x01, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x43, 0x75, 0x72, 0x76, 0x65, 0x88, 0x01, 0x01, + 0x1a, 0xd1, 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, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x6c, 0x6f, 0x77, 0x65, + 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x0a, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x24, + 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x17, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x14, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x41, 0x74, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x3a, 0x0a, 0x17, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, + 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x03, 0x52, 0x14, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x41, 0x74, 0x4c, + 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, + 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x0e, 0x0a, 0x0c, + 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x1a, 0x0a, 0x18, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x6c, 0x65, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x74, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0x67, 0x0a, 0x05, 0x43, 0x75, 0x72, 0x76, 0x65, 0x12, 0x2b, 0x0a, + 0x11, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, + 0x6c, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x14, 0x74, 0x68, + 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, + 0x74, 0x69, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 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, 0xbe, 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, 0x33, 0x0a, 0x2f, 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, + 0x4d, 0x4d, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 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, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x76, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x63, 0x75, 0x72, 0x76, 0x65, 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, 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, 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, + 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, 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, 0x8a, 0x02, 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, 0x12, 0x43, 0x0a, + 0x1e, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x62, + 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x52, 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, 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, + 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x14, 0x73, 0x75, 0x6d, 0x6d, 0x65, 0x64, 0x51, 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, 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, + 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, 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, 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, + 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, 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, - 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, - 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, 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, + 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, 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, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x70, 0x6f, + 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, 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, + 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, 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, 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, + 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, 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, 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, + 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, 0xe6, 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, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 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, 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, 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, + 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, 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, + 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, 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, + 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, - 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, + 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, 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, 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, - 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, 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, + 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, 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, + 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, 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, - 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, - 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, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x01, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x4d, 0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0xea, 0x07, 0x20, + 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, 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, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x01, 0x52, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x1a, 0x10, 0x0a, 0x0e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x1a, 0x26, 0x0a, 0x0e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x78, 0x74, - 0x72, 0x61, 0x22, 0xa7, 0x0d, 0x0a, 0x0c, 0x54, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, - 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, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 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, 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, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x48, 0x01, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x12, 0x4d, 0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0xea, 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, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x48, 0x01, 0x52, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x1a, + 0x10, 0x0a, 0x0e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x1a, 0x26, 0x0a, 0x0e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x22, 0xa7, 0x0d, 0x0a, 0x0c, 0x54, 0x78, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, 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, 0x17, 0x0a, + 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 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, 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, 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, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x6e, 0x10, 0x6f, 0x22, 0x2a, 0x0a, 0x0a, - 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xa4, 0x01, 0x0a, 0x0a, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x29, 0x0a, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 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, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, - 0x52, 0x0a, 0x0f, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x10, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x76, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0f, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, + 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, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4a, 0x04, 0x08, 0x6e, 0x10, 0x6f, 0x22, 0x2a, 0x0a, 0x0a, 0x54, + 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xa4, 0x01, 0x0a, 0x0a, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x29, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 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, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x52, + 0x0a, 0x0f, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x3f, 0x0a, 0x10, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x76, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x0f, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 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, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x74, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x63, 0x0a, + 0x11, 0x4c, 0x6f, 0x73, 0x73, 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x7a, 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, + 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, 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, 0x5e, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 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, 0x22, 0xd5, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x50, 0x6f, 0x73, + 0x69, 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, 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, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x74, + 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x72, 0x61, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x10, 0x74, 0x72, 0x61, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x6a, 0x0a, 0x0c, 0x53, 0x65, + 0x74, 0x74, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 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, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, - 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x63, - 0x0a, 0x11, 0x4c, 0x6f, 0x73, 0x73, 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x61, 0x72, 0x6b, 0x65, 0x74, 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, 0x27, 0x0a, + 0x0f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xf6, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 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, 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, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, 0x74, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x75, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x42, 0x75, 0x79, 0x73, + 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, + 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x6f, 0x74, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x76, 0x77, 0x5f, + 0x62, 0x75, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x76, 0x77, 0x42, 0x75, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x76, + 0x77, 0x5f, 0x73, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x76, 0x77, 0x53, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, + 0x78, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, + 0x73, 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, 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, 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, 0x5e, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 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, 0x22, 0xd5, 0x01, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x50, 0x6f, - 0x73, 0x69, 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, 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, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, 0x65, - 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x72, 0x61, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x10, 0x74, 0x72, 0x61, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x6a, 0x0a, 0x0c, 0x53, - 0x65, 0x74, 0x74, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 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, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x27, - 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xf6, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 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, 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, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6f, - 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x62, 0x75, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0d, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x42, 0x75, 0x79, - 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, - 0x65, 0x6c, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x70, 0x6f, 0x74, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x20, 0x0a, 0x0c, 0x76, 0x77, - 0x5f, 0x62, 0x75, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x76, 0x77, 0x42, 0x75, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0d, - 0x76, 0x77, 0x5f, 0x73, 0x65, 0x6c, 0x6c, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x76, 0x77, 0x53, 0x65, 0x6c, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x22, 0x78, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, - 0x73, 0x73, 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, 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, 0x12, 0x16, 0x0a, 0x06, - 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x49, 0x0a, 0x10, 0x44, 0x69, - 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, 0x64, 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, 0x18, 0x0a, 0x07, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x49, 0x0a, 0x10, 0x44, 0x69, 0x73, + 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, 0x64, 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, 0x2d, 0x0a, 0x12, 0x64, 0x69, - 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x66, - 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0b, 0x73, 0x61, 0x66, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x30, 0x0a, 0x0a, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x85, - 0x02, 0x0a, 0x0c, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x27, 0x0a, 0x0f, - 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, - 0x65, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0xa9, 0x03, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 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, 0x20, 0x0a, 0x0c, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x70, 0x75, 0x62, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x65, 0x67, 0x61, 0x50, - 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, - 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x1c, 0x0a, 0x0a, 0x74, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x19, - 0x0a, 0x08, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x69, 0x6e, 0x66, 0x6f, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, - 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, - 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2b, 0x0a, 0x12, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x70, - 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0f, 0x76, 0x65, 0x67, 0x61, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, - 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, - 0x72, 0x6f, 0x6d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, - 0x65, 0x71, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, - 0x65, 0x71, 0x22, 0xb2, 0x02, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 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, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x73, - 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x6b, - 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x63, - 0x6f, 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, - 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x6b, - 0x69, 0x6e, 0x67, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x76, - 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 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, - 0x26, 0x0a, 0x0f, 0x74, 0x6d, 0x5f, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x77, - 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x6d, 0x56, 0x6f, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x22, 0x89, 0x01, 0x0a, 0x0b, 0x4b, 0x65, 0x79, 0x52, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x1e, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 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, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x13, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x6e, + 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x64, 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, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, + 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x66, 0x65, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x61, 0x66, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x30, 0x0a, 0x0a, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x85, 0x02, + 0x0a, 0x0c, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x27, 0x0a, 0x0f, 0x6f, + 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x65, + 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x12, 0x41, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0xa9, 0x03, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 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, 0x20, 0x0a, 0x0c, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x65, 0x67, 0x61, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x1c, 0x0a, 0x0a, 0x74, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x19, 0x0a, + 0x08, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x69, 0x6e, 0x66, 0x6f, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x2b, 0x0a, 0x12, 0x76, 0x65, 0x67, 0x61, 0x5f, 0x70, 0x75, + 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0f, 0x76, 0x65, 0x67, 0x61, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6d, + 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x66, 0x72, + 0x6f, 0x6d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x65, + 0x71, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x65, + 0x71, 0x22, 0xb2, 0x02, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 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, 0x1f, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x6c, 0x64, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 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, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x14, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x62, 0x6c, + 0x64, 0x65, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, + 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x6b, 0x69, + 0x6e, 0x67, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x76, 0x69, + 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 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, 0x26, + 0x0a, 0x0f, 0x74, 0x6d, 0x5f, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x77, 0x65, + 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x74, 0x6d, 0x56, 0x6f, 0x74, 0x69, 0x6e, + 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x22, 0x89, 0x01, 0x0a, 0x0b, 0x4b, 0x65, 0x79, 0x52, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, + 0x1e, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 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, + 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x13, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, + 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x1f, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x6c, 0x64, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 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, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xd7, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 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, 0x12, 0x1c, 0x0a, + 0x09, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 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, 0x50, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x4b, 0x0a, 0x08, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, + 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, + 0x56, 0x0a, 0x0a, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 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, 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, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x22, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x44, 0x0a, 0x16, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 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, 0x12, 0x1c, - 0x0a, 0x09, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x12, 0x45, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 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, 0x50, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x22, 0x4b, 0x0a, 0x08, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x22, 0x56, 0x0a, 0x0a, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 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, 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, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x22, 0x22, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x44, 0x0a, 0x16, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x22, 0x4a, 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, - 0x64, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6c, - 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xad, - 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, - 0x61, 0x74, 0x61, 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, - 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, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x72, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x49, - 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x4f, 0x72, 0x64, 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, 0x1b, 0x0a, 0x09, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x66, 0x0a, 0x0f, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x64, 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, 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, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, - 0x73, 0x22, 0xa7, 0x02, 0x0a, 0x0b, 0x54, 0x65, 0x61, 0x6d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x22, 0x4a, 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6c, 0x61, + 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xad, 0x01, + 0x0a, 0x10, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x61, + 0x74, 0x61, 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, 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, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x72, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x49, 0x0a, + 0x0d, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x4f, 0x72, 0x64, 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, 0x1b, 0x0a, 0x09, 0x6f, + 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x66, 0x0a, 0x0f, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x4f, 0x72, 0x64, 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, 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, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, + 0x22, 0xa7, 0x02, 0x0a, 0x0b, 0x54, 0x65, 0x61, 0x6d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, + 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, + 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 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, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0xd1, 0x01, 0x0a, 0x0b, 0x54, + 0x65, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x65, 0x61, + 0x6d, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, + 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x05, 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, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, + 0x73, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0xab, + 0x01, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x65, 0x64, 0x54, 0x65, 0x61, 0x6d, 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, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x7e, 0x0a, 0x11, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x54, 0x65, 0x61, + 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x85, 0x01, 0x0a, + 0x12, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x65, - 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, - 0x74, 0x65, 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, - 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 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, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, - 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, - 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, 0x42, - 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0xd1, 0x01, 0x0a, 0x0b, - 0x54, 0x65, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, - 0x61, 0x6d, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x65, 0x61, 0x6d, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x74, 0x65, - 0x61, 0x6d, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, - 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, - 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x05, 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, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, - 0x69, 0x73, 0x74, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x72, 0x6c, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x22, - 0xab, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x53, 0x77, 0x69, 0x74, 0x63, - 0x68, 0x65, 0x64, 0x54, 0x65, 0x61, 0x6d, 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, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x7e, 0x0a, - 0x11, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x54, 0x65, - 0x61, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x85, 0x01, - 0x0a, 0x12, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xd2, 0x03, 0x0a, 0x17, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x12, 0x59, 0x0a, 0x2a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, - 0x73, 0x65, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x25, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x43, - 0x0a, 0x0e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x66, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x19, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, - 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x61, 0x73, 0x5f, 0x65, 0x6c, 0x69, 0x67, 0x69, - 0x62, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x61, 0x73, 0x45, 0x6c, - 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x65, 0x72, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x54, - 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x0c, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 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, - 0x3d, 0x0a, 0x1b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4e, 0x6f, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x83, - 0x01, 0x0a, 0x18, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x65, 0x74, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, - 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 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, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x18, 0x01, 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, 0x07, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x22, 0x76, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x8f, 0x01, 0x0a, 0x1c, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x07, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 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, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x8f, 0x01, 0x0a, 0x1c, 0x56, + 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x22, 0xd2, 0x03, 0x0a, 0x17, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, + 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x15, 0x0a, 0x06, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x59, 0x0a, 0x2a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, + 0x65, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x25, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x43, 0x0a, + 0x0e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x19, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x72, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, + 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x61, 0x73, 0x5f, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, + 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x61, 0x73, 0x45, 0x6c, 0x69, + 0x67, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x72, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x54, 0x61, + 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x0c, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x65, 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, 0x3d, + 0x0a, 0x1b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x18, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x83, 0x01, + 0x0a, 0x18, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x73, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6a, + 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x2f, + 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 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, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x83, 0x01, 0x0a, 0x16, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, + 0x01, 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, 0x07, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, + 0x76, 0x0a, 0x14, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, + 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x8f, 0x01, 0x0a, 0x1c, 0x56, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x18, 0x01, 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, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x8f, 0x01, 0x0a, 0x1c, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x07, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 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, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x7c, 0x0a, 0x1a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 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, 0x07, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x7c, 0x0a, 0x1a, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0xd7, 0x01, 0x0a, 0x16, 0x50, - 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 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, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x70, - 0x61, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x46, 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x12, 0x4a, 0x0a, 0x13, 0x66, 0x65, 0x65, 0x73, - 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, - 0x05, 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, 0x10, 0x66, 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x50, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x22, 0xa0, 0x03, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 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, 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, 0x12, 0x31, 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, - 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x6d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x1d, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x68, 0x65, 0x6f, - 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x1a, 0x6d, - 0x69, 0x6e, 0x54, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x4d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, - 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, - 0x6c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, - 0x52, 0x16, 0x6d, 0x61, 0x78, 0x54, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, - 0x4c, 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, - 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x6d, 0x69, 0x6e, - 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, + 0x67, 0x72, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x41, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x61, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x61, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, 0xd7, 0x01, 0x0a, 0x16, 0x50, 0x61, + 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 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, + 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x70, 0x61, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, + 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x12, 0x4a, 0x0a, 0x13, 0x66, 0x65, 0x65, 0x73, 0x5f, + 0x70, 0x61, 0x69, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x05, + 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, 0x10, 0x66, 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, 0x50, 0x65, 0x72, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x22, 0xa0, 0x03, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 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, 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, 0x12, 0x31, 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x0d, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, 0x1d, 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, + 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x1a, 0x6d, 0x69, + 0x6e, 0x54, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x4d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6c, - 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x52, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3b, - 0x0a, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0e, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x5f, 0x0a, 0x11, 0x54, - 0x65, 0x61, 0x6d, 0x73, 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, 0x2f, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x6a, 0x0a, 0x09, - 0x54, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, - 0x49, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x55, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x6d, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 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, 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, - 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, - 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x5f, 0x6d, 0x6f, - 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, - 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x48, 0x00, - 0x52, 0x0f, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x55, 0x0a, 0x13, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, + 0x16, 0x6d, 0x61, 0x78, 0x54, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x4c, + 0x65, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x74, + 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x61, 0x74, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, + 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x6d, 0x61, + 0x78, 0x5f, 0x74, 0x68, 0x65, 0x6f, 0x72, 0x65, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x6c, 0x65, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x52, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3b, 0x0a, + 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0e, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x22, 0x5f, 0x0a, 0x11, 0x54, 0x65, + 0x61, 0x6d, 0x73, 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, 0x2f, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x6a, 0x0a, 0x09, 0x54, + 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, + 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0c, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x55, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x6d, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 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, 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, 0xde, + 0x02, 0x0a, 0x0e, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x27, + 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x6e, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x70, + 0x65, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x65, 0x73, 0x50, 0x61, 0x69, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x69, 0x73, 0x5f, 0x65, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x73, 0x45, 0x6c, 0x69, 0x67, 0x69, 0x62, 0x6c, + 0x65, 0x12, 0x17, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x48, + 0x01, 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, + 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x22, + 0x81, 0x01, 0x0a, 0x0d, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, + 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x61, + 0x6d, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x54, 0x65, 0x61, + 0x6d, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x0a, 0x74, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x12, 0x41, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x79, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x73, 0x22, 0xa0, 0x38, 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, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x74, + 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x6c, 0x65, 0x64, + 0x67, 0x65, 0x72, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x66, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, + 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x55, 0x0a, 0x13, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x67, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, + 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x05, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x69, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, + 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x64, 0x65, 0x18, 0x6b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x65, 0x48, + 0x00, 0x52, 0x05, 0x74, 0x72, 0x61, 0x64, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, + 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x73, 0x12, 0x2c, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, + 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x12, 0x20, 0x0a, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x04, 0x76, + 0x6f, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x70, 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, 0x52, 0x0a, 0x12, 0x6c, 0x6f, 0x73, 0x73, 0x5f, 0x73, 0x6f, 0x63, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x29, 0x0a, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, - 0x79, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, - 0x61, 0x72, 0x74, 0x79, 0x48, 0x00, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x23, 0x0a, - 0x05, 0x74, 0x72, 0x61, 0x64, 0x65, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x65, 0x48, 0x00, 0x52, 0x05, 0x74, 0x72, 0x61, - 0x64, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x48, 0x00, 0x52, - 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x2c, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x48, - 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x04, 0x76, - 0x6f, 0x74, 0x65, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x48, 0x00, 0x52, 0x04, 0x76, 0x6f, 0x74, 0x65, 0x12, 0x33, 0x0a, - 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x6f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x48, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x70, 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, 0x52, 0x0a, 0x12, - 0x6c, 0x6f, 0x73, 0x73, 0x5f, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x71, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x73, 0x73, 0x53, 0x6f, - 0x63, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x6c, - 0x6f, 0x73, 0x73, 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x49, 0x0a, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, - 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, 0x74, - 0x74, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x11, 0x73, - 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x18, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x69, - 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x35, 0x0a, 0x0e, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x74, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x75, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, - 0x00, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x3d, 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x76, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0a, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x32, 0x0a, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x61, 0x6c, 0x18, 0x77, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x48, 0x00, 0x52, - 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x07, 0x64, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x78, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x48, 0x00, 0x52, 0x07, 0x64, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x33, 0x0a, 0x0b, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, - 0x7a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x69, 0x73, - 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x69, 0x73, 0x6b, 0x46, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x7b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x13, - 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x7c, 0x20, 0x01, 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, 0x48, 0x00, 0x52, 0x12, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x0e, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x7d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, - 0x00, 0x52, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x33, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, - 0x7e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x61, - 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, - 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x33, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x7f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0a, - 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x58, 0x0a, 0x12, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x82, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 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, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x83, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x84, 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, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x6c, 0x69, - 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x85, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 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, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, - 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x12, 0x49, 0x0a, 0x0d, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x18, 0x86, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, - 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x87, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x6b, 0x65, 0x79, - 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x88, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, - 0x0b, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x09, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x18, 0x89, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x12, 0x3d, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x8a, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x18, 0x8b, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 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, 0x4d, - 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x4c, 0x6f, 0x73, 0x73, 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x11, 0x6c, 0x6f, 0x73, 0x73, 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, + 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x72, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x00, 0x52, 0x0e, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x4f, 0x0a, 0x11, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x74, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x73, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, + 0x74, 0x74, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x48, 0x00, + 0x52, 0x10, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x64, 0x12, 0x35, 0x0a, 0x0e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x74, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x18, 0x75, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x3d, + 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x18, 0x76, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x48, + 0x00, 0x52, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x12, 0x32, 0x0a, + 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x18, 0x77, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, + 0x6c, 0x12, 0x29, 0x0a, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x78, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x48, 0x00, 0x52, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x38, 0x0a, 0x07, + 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x79, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x61, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, 0x0b, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x7a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, + 0x0a, 0x72, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x11, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x18, 0x7b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x48, 0x00, + 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x7c, 0x20, 0x01, 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, 0x48, 0x00, 0x52, 0x12, 0x6c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x35, 0x0a, 0x0e, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x7d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, + 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x7e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, + 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x33, 0x0a, 0x0b, 0x6f, + 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x7f, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x48, 0x00, 0x52, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x58, 0x0a, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x81, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x82, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 0x53, + 0x63, 0x6f, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x83, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x10, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x84, 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, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x0c, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x6a, 0x0a, - 0x1b, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, - 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x8d, 0x01, 0x20, - 0x01, 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, 0x48, 0x00, 0x52, - 0x18, 0x65, 0x72, 0x63, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, 0x69, - 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x7d, 0x0a, 0x22, 0x65, 0x72, 0x63, - 0x32, 0x30, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x5f, - 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x8e, 0x01, 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, 0x48, 0x00, 0x52, 0x1e, 0x65, 0x72, 0x63, 0x32, 0x30, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, 0x65, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x1b, 0x65, 0x72, 0x63, 0x32, - 0x30, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x8f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x74, + 0x61, 0x6b, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x18, 0x85, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 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, + 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x69, 0x6e, 0x67, + 0x12, 0x49, 0x0a, 0x0d, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, + 0x74, 0x18, 0x86, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x87, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x41, 0x0a, 0x0c, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x88, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x6b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x18, + 0x89, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, + 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x12, 0x3d, 0x0a, 0x0e, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x8a, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x8b, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 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, 0x41, 0x64, 0x64, 0x65, 0x64, 0x48, 0x00, 0x52, 0x18, 0x65, 0x72, 0x63, 0x32, - 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x65, 0x64, 0x12, 0x70, 0x0a, 0x1d, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x90, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x48, 0x00, 0x52, 0x08, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 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, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x6a, 0x0a, 0x1b, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x8d, 0x01, 0x20, 0x01, 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, 0x48, 0x00, 0x52, 0x18, 0x65, 0x72, 0x63, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x7d, 0x0a, 0x22, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, + 0x67, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x8e, 0x01, 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, 0x53, 0x69, 0x67, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x48, 0x00, 0x52, 0x1a, 0x65, 0x72, 0x63, 0x32, - 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x14, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x91, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x5a, 0x0a, 0x15, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x92, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, - 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5d, 0x0a, 0x16, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x93, 0x01, 0x20, 0x01, 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, 0x48, 0x00, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0b, 0x62, 0x65, - 0x67, 0x69, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x94, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0a, - 0x62, 0x65, 0x67, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x09, 0x65, 0x6e, - 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x95, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x63, 0x0a, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, - 0x18, 0x96, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 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, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x48, - 0x00, 0x52, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x73, 0x65, 0x74, - 0x74, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x97, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, - 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, - 0x53, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x98, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x48, - 0x00, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x99, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x20, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x9a, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 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, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, - 0x64, 0x79, 0x48, 0x00, 0x52, 0x1c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, - 0x64, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x9b, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, - 0x48, 0x00, 0x52, 0x10, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x9c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x0d, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x59, 0x0a, - 0x14, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, - 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x48, 0x00, 0x52, 0x13, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x70, - 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x9e, 0x01, 0x20, 0x01, 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, 0x48, 0x00, 0x52, - 0x09, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0e, 0x66, 0x75, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x9f, 0x01, 0x20, + 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, 0x48, 0x00, 0x52, 0x1e, + 0x65, 0x72, 0x63, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, 0x65, 0x74, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x6a, + 0x0a, 0x1b, 0x65, 0x72, 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, + 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x8f, 0x01, + 0x20, 0x01, 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, 0x41, 0x64, 0x64, 0x65, 0x64, 0x48, 0x00, + 0x52, 0x18, 0x65, 0x72, 0x63, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x41, 0x64, 0x64, 0x65, 0x64, 0x12, 0x70, 0x0a, 0x1d, 0x65, 0x72, + 0x63, 0x32, 0x30, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x90, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 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, 0x48, 0x00, + 0x52, 0x1a, 0x65, 0x72, 0x63, 0x32, 0x30, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x14, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x91, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x12, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5a, 0x0a, 0x15, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, + 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x72, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x92, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, + 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x13, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x52, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x5d, 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x93, 0x01, 0x20, 0x01, + 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, 0x48, 0x00, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x3e, 0x0a, 0x0b, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x94, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x65, 0x67, 0x69, 0x6e, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x00, 0x52, 0x0a, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x12, 0x38, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x95, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x00, + 0x52, 0x08, 0x65, 0x6e, 0x64, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x63, 0x0a, 0x18, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x96, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 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, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, + 0x44, 0x0a, 0x0d, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x18, 0x97, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x98, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 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, 0x48, 0x00, 0x52, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x63, 0x6f, + 0x72, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x99, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x11, 0x63, 0x6f, + 0x72, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x77, 0x0a, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x18, 0x9a, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 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, 0x44, 0x61, 0x74, 0x61, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x48, 0x00, 0x52, 0x1c, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x74, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x9b, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x10, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x9c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 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, 0x48, 0x00, 0x52, 0x0d, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x64, 0x0a, 0x19, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x18, 0xa0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 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, 0x48, - 0x00, 0x52, 0x16, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0c, 0x74, 0x65, 0x61, - 0x6d, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0xa1, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, - 0x0b, 0x74, 0x65, 0x61, 0x6d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0c, - 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xa2, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x5a, 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, - 0x68, 0x65, 0x64, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0xa3, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x64, - 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x53, - 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x54, 0x0a, 0x13, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x65, - 0x61, 0x6d, 0x18, 0xa4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x11, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x54, 0x65, 0x61, - 0x6d, 0x12, 0x63, 0x0a, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0xa5, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x16, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x63, 0x0a, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, - 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x18, 0xa6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x59, 0x0a, 0x14, 0x64, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x9d, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x13, 0x64, 0x69, 0x73, 0x74, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, + 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x9e, 0x01, 0x20, + 0x01, 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, 0x48, 0x00, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x12, 0x47, 0x0a, 0x0e, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x18, 0x9f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 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, 0x48, 0x00, 0x52, 0x0d, 0x66, 0x75, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x64, 0x0a, 0x19, 0x66, 0x75, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0xa0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 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, 0x48, 0x00, 0x52, 0x16, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x61, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x41, 0x0a, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, + 0xa1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x61, 0x6d, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0c, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x18, 0xa2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x61, 0x6d, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, + 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0xa3, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x53, 0x77, + 0x69, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x65, 0x61, 0x6d, 0x48, 0x00, 0x52, 0x13, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x65, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x65, 0x64, 0x54, 0x65, 0x61, + 0x6d, 0x12, 0x54, 0x0a, 0x13, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x6a, 0x6f, 0x69, + 0x6e, 0x65, 0x64, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x18, 0xa4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x54, 0x65, + 0x61, 0x6d, 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x4a, 0x6f, 0x69, + 0x6e, 0x65, 0x64, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x63, 0x0a, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x18, 0xa5, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x63, 0x0a, 0x18, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xa6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x48, 0x00, 0x52, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5d, 0x0a, 0x16, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0xa7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x45, 0x6e, 0x64, - 0x65, 0x64, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x57, 0x0a, 0x14, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x18, 0xa8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, - 0x12, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x6a, 0x0a, 0x1b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x5f, 0x6a, - 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, - 0x65, 0x74, 0x18, 0xa9, 0x01, 0x20, 0x01, 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, - 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, - 0x53, 0x65, 0x74, 0x48, 0x00, 0x52, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x65, 0x4a, 0x6f, - 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x12, - 0x5a, 0x0a, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, - 0x79, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x18, 0xaa, 0x01, 0x20, 0x01, 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, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6b, 0x48, 0x00, 0x52, 0x13, 0x70, 0x61, 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x76, 0x0a, 0x1f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0xab, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x1c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x12, 0x76, 0x0a, 0x1f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, - 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xac, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x1c, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x70, 0x0a, 0x1d, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0xad, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x48, - 0x00, 0x52, 0x1a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x67, 0x0a, - 0x1a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xae, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x17, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, 0x15, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, - 0xaf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x13, 0x76, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x70, 0x0a, 0x1d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x18, 0xb0, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 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, 0x48, 0x00, 0x52, 0x1a, 0x76, 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, 0x3b, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x18, 0xb1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x48, 0x00, 0x52, 0x09, 0x66, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0xb2, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 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, 0x73, 0x48, 0x00, 0x52, - 0x0f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x64, 0x0a, 0x19, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0xb3, 0x01, - 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, 0x48, 0x00, 0x52, 0x16, - 0x70, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x63, 0x0a, 0x18, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x18, 0xb4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x48, 0x00, 0x52, 0x16, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x44, 0x0a, 0x0d, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x18, 0xb5, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, - 0x73, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, - 0x73, 0x12, 0x5d, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, - 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xb6, 0x01, 0x20, 0x01, + 0x64, 0x12, 0x5d, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x72, + 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0xa7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x64, 0x0a, 0x19, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xb7, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x16, - 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, - 0xb8, 0x01, 0x20, 0x01, 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, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x13, 0x70, - 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x54, 0x0a, 0x13, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xb9, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x8c, 0x01, 0x0a, 0x27, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x18, 0xba, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 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, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x48, 0x00, 0x52, 0x23, 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, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x4d, 0x0a, 0x10, 0x63, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0xbb, 0x01, 0x20, 0x01, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x48, 0x00, 0x52, 0x14, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x65, 0x64, + 0x12, 0x57, 0x0a, 0x14, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, + 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0xa8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x12, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, + 0x65, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x6a, 0x0a, 0x1b, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x65, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x74, 0x18, 0xa9, 0x01, 0x20, 0x01, 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, 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x48, 0x00, 0x52, 0x18, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x53, 0x65, 0x74, 0x12, 0x5a, 0x0a, 0x15, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x18, 0xaa, + 0x01, 0x20, 0x01, 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, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x48, 0x00, 0x52, 0x13, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6b, 0x12, 0x76, 0x0a, 0x1f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x18, 0xab, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x1c, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x76, 0x0a, 0x1f, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xac, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x48, 0x00, 0x52, 0x1c, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x70, 0x0a, 0x1d, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x18, 0xad, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, + 0x45, 0x6e, 0x64, 0x65, 0x64, 0x48, 0x00, 0x52, 0x1a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x45, 0x6e, + 0x64, 0x65, 0x64, 0x12, 0x67, 0x0a, 0x1a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, + 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x18, 0xae, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, + 0x61, 0x6c, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, 0x15, + 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xaf, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x48, 0x00, 0x52, 0x13, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x70, 0x0a, 0x1d, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xb0, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 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, 0x48, 0x00, 0x52, 0x1a, + 0x76, 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, 0x3b, 0x0a, 0x0a, 0x66, 0x65, + 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0xb1, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x48, 0x00, 0x52, 0x09, 0x66, 0x65, + 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x4d, 0x0a, 0x10, 0x66, 0x75, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0xb2, 0x01, 0x20, 0x01, 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, + 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x64, 0x0a, 0x19, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x6c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x18, 0xb3, 0x01, 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, 0x48, 0x00, 0x52, 0x16, 0x70, 0x61, 0x69, 0x64, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x63, 0x0a, 0x18, + 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0xb4, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x48, 0x00, 0x52, 0x16, 0x76, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x12, 0x44, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, + 0x65, 0x73, 0x18, 0xb5, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x12, 0x5d, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0xb6, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x46, 0x65, 0x65, 0x73, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x19, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x18, 0xb7, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x48, 0x00, 0x52, 0x16, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x5a, 0x0a, 0x15, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xb8, 0x01, 0x20, 0x01, 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, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x48, 0x00, 0x52, 0x13, 0x70, 0x61, 0x72, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x54, 0x0a, 0x13, 0x74, 0x65, 0x61, 0x6d, + 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, + 0xb9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x74, 0x65, 0x61, + 0x6d, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x8c, + 0x01, 0x0a, 0x27, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, + 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0xba, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 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, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x23, 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, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x4d, 0x0a, + 0x10, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x18, 0xbb, 0x01, 0x20, 0x01, 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, 0x3e, 0x0a, 0x0b, + 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0xbc, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x48, 0x00, + 0x52, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x03, + 0x61, 0x6d, 0x6d, 0x18, 0xbd, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x4d, 0x4d, 0x48, + 0x00, 0x52, 0x03, 0x61, 0x6d, 0x6d, 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, @@ -11478,7 +12433,7 @@ var file_vega_events_v1_events_proto_rawDesc = []byte{ 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, + 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0xe5, 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, @@ -11694,14 +12649,17 @@ var file_vega_events_v1_events_proto_rawDesc = []byte{ 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, + 0x1e, 0x0a, 0x1a, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x47, 0x41, 0x4d, 0x45, 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, 0x53, 0x10, 0x5a, 0x12, + 0x16, 0x0a, 0x12, 0x42, 0x55, 0x53, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x41, 0x4d, 0x4d, 0x10, 0x5b, 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 +12674,379 @@ 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, 96) 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 + (AMM_Status)(0), // 2: vega.events.v1.AMM.Status + (AMM_StatusReason)(0), // 3: vega.events.v1.AMM.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 + (*AMM)(nil), // 10: vega.events.v1.AMM + (*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 + (*GamePartyScore)(nil), // 97: vega.events.v1.GamePartyScore + (*GameTeamScore)(nil), // 98: vega.events.v1.GameTeamScore + (*GameScores)(nil), // 99: vega.events.v1.GameScores + (*BusEvent)(nil), // 100: vega.events.v1.BusEvent + (*AMM_ConcentratedLiquidityParameters)(nil), // 101: vega.events.v1.AMM.ConcentratedLiquidityParameters + (*AMM_Curve)(nil), // 102: vega.events.v1.AMM.Curve + (*TransactionResult_SuccessDetails)(nil), // 103: vega.events.v1.TransactionResult.SuccessDetails + (*TransactionResult_FailureDetails)(nil), // 104: vega.events.v1.TransactionResult.FailureDetails + (*v1.OrderSubmission)(nil), // 105: vega.commands.v1.OrderSubmission + (*vega.StopOrder)(nil), // 106: vega.StopOrder + (vega.AccountType)(0), // 107: vega.AccountType + (*vega.DispatchStrategy)(nil), // 108: vega.DispatchStrategy + (*v1.OrderAmendment)(nil), // 109: vega.commands.v1.OrderAmendment + (*v1.OrderCancellation)(nil), // 110: vega.commands.v1.OrderCancellation + (*v1.ProposalSubmission)(nil), // 111: vega.commands.v1.ProposalSubmission + (*v1.VoteSubmission)(nil), // 112: vega.commands.v1.VoteSubmission + (*v1.LiquidityProvisionSubmission)(nil), // 113: vega.commands.v1.LiquidityProvisionSubmission + (*v1.WithdrawSubmission)(nil), // 114: vega.commands.v1.WithdrawSubmission + (*v1.DelegateSubmission)(nil), // 115: vega.commands.v1.DelegateSubmission + (*v1.UndelegateSubmission)(nil), // 116: vega.commands.v1.UndelegateSubmission + (*v1.LiquidityProvisionCancellation)(nil), // 117: vega.commands.v1.LiquidityProvisionCancellation + (*v1.LiquidityProvisionAmendment)(nil), // 118: vega.commands.v1.LiquidityProvisionAmendment + (*v1.Transfer)(nil), // 119: vega.commands.v1.Transfer + (*v1.CancelTransfer)(nil), // 120: vega.commands.v1.CancelTransfer + (*v1.AnnounceNode)(nil), // 121: vega.commands.v1.AnnounceNode + (*v1.OracleDataSubmission)(nil), // 122: vega.commands.v1.OracleDataSubmission + (*v1.ProtocolUpgradeProposal)(nil), // 123: vega.commands.v1.ProtocolUpgradeProposal + (*v1.IssueSignatures)(nil), // 124: vega.commands.v1.IssueSignatures + (*v1.BatchMarketInstructions)(nil), // 125: vega.commands.v1.BatchMarketInstructions + (*v1.KeyRotateSubmission)(nil), // 126: vega.commands.v1.KeyRotateSubmission + (*v1.EthereumKeyRotateSubmission)(nil), // 127: vega.commands.v1.EthereumKeyRotateSubmission + (*v1.StopOrdersSubmission)(nil), // 128: vega.commands.v1.StopOrdersSubmission + (*v1.StopOrdersCancellation)(nil), // 129: vega.commands.v1.StopOrdersCancellation + (*v1.CreateReferralSet)(nil), // 130: vega.commands.v1.CreateReferralSet + (*v1.UpdateReferralSet)(nil), // 131: vega.commands.v1.UpdateReferralSet + (*v1.ApplyReferralCode)(nil), // 132: vega.commands.v1.ApplyReferralCode + (*v1.UpdateMarginMode)(nil), // 133: vega.commands.v1.UpdateMarginMode + (*v1.JoinTeam)(nil), // 134: vega.commands.v1.JoinTeam + (*v1.BatchProposalSubmission)(nil), // 135: vega.commands.v1.BatchProposalSubmission + (*v1.UpdatePartyProfile)(nil), // 136: vega.commands.v1.UpdatePartyProfile + (*v1.SubmitAMM)(nil), // 137: vega.commands.v1.SubmitAMM + (*v1.AmendAMM)(nil), // 138: vega.commands.v1.AmendAMM + (*v1.CancelAMM)(nil), // 139: vega.commands.v1.CancelAMM + (vega.EpochAction)(0), // 140: vega.EpochAction + (*vega.LedgerMovement)(nil), // 141: vega.LedgerMovement + (vega.AuctionTrigger)(0), // 142: vega.AuctionTrigger + (*vega.ReferralProgram)(nil), // 143: vega.ReferralProgram + (*vega.VolumeDiscountProgram)(nil), // 144: vega.VolumeDiscountProgram + (vega.MarginMode)(0), // 145: vega.MarginMode + (*vega.PartyProfile)(nil), // 146: vega.PartyProfile + (*vega.Order)(nil), // 147: vega.Order + (*vega.Account)(nil), // 148: vega.Account + (*vega.Party)(nil), // 149: vega.Party + (*vega.Trade)(nil), // 150: vega.Trade + (*vega.MarginLevels)(nil), // 151: vega.MarginLevels + (*vega.Proposal)(nil), // 152: vega.Proposal + (*vega.Vote)(nil), // 153: vega.Vote + (*vega.MarketData)(nil), // 154: vega.MarketData + (*v1.NodeSignature)(nil), // 155: vega.commands.v1.NodeSignature + (*vega.Market)(nil), // 156: vega.Market + (*vega.Asset)(nil), // 157: vega.Asset + (*vega.Withdrawal)(nil), // 158: vega.Withdrawal + (*vega.Deposit)(nil), // 159: vega.Deposit + (*vega.RiskFactor)(nil), // 160: vega.RiskFactor + (*vega.NetworkParameter)(nil), // 161: vega.NetworkParameter + (*vega.LiquidityProvision)(nil), // 162: vega.LiquidityProvision + (*vega.OracleSpec)(nil), // 163: vega.OracleSpec + (*vega.OracleData)(nil), // 164: vega.OracleData + (*vega.NetworkLimits)(nil), // 165: 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 + 101, // 0: vega.events.v1.AMM.parameters:type_name -> vega.events.v1.AMM.ConcentratedLiquidityParameters + 2, // 1: vega.events.v1.AMM.status:type_name -> vega.events.v1.AMM.Status + 3, // 2: vega.events.v1.AMM.status_reason:type_name -> vega.events.v1.AMM.StatusReason + 102, // 3: vega.events.v1.AMM.lower_curve:type_name -> vega.events.v1.AMM.Curve + 102, // 4: vega.events.v1.AMM.upper_curve:type_name -> vega.events.v1.AMM.Curve + 12, // 5: vega.events.v1.VestingBalancesSummary.parties_vesting_summary:type_name -> vega.events.v1.PartyVestingSummary + 13, // 6: vega.events.v1.PartyVestingSummary.party_locked_balances:type_name -> vega.events.v1.PartyLockedBalance + 14, // 7: vega.events.v1.PartyVestingSummary.party_vesting_balances:type_name -> vega.events.v1.PartyVestingBalance + 16, // 8: vega.events.v1.VolumeDiscountStatsUpdated.stats:type_name -> vega.events.v1.PartyVolumeDiscountStats + 18, // 9: vega.events.v1.VestingStatsUpdated.stats:type_name -> vega.events.v1.PartyVestingStats + 22, // 10: vega.events.v1.FeesStats.total_rewards_received:type_name -> vega.events.v1.PartyAmount + 20, // 11: vega.events.v1.FeesStats.referrer_rewards_generated:type_name -> vega.events.v1.ReferrerRewardsGenerated + 22, // 12: vega.events.v1.FeesStats.referees_discount_applied:type_name -> vega.events.v1.PartyAmount + 22, // 13: vega.events.v1.FeesStats.volume_discount_applied:type_name -> vega.events.v1.PartyAmount + 22, // 14: vega.events.v1.FeesStats.total_maker_fees_received:type_name -> vega.events.v1.PartyAmount + 21, // 15: vega.events.v1.FeesStats.maker_fees_generated:type_name -> vega.events.v1.MakerFeesGenerated + 22, // 16: vega.events.v1.FeesStats.total_fees_paid_and_received:type_name -> vega.events.v1.PartyAmount + 22, // 17: vega.events.v1.ReferrerRewardsGenerated.generated_reward:type_name -> vega.events.v1.PartyAmount + 22, // 18: vega.events.v1.MakerFeesGenerated.maker_fees_paid:type_name -> vega.events.v1.PartyAmount + 25, // 19: vega.events.v1.FundingPayments.payments:type_name -> vega.events.v1.FundingPayment + 4, // 20: vega.events.v1.FundingPeriodDataPoint.data_point_type:type_name -> vega.events.v1.FundingPeriodDataPoint.Source + 105, // 21: vega.events.v1.StopOrderEvent.submission:type_name -> vega.commands.v1.OrderSubmission + 106, // 22: vega.events.v1.StopOrderEvent.stop_order:type_name -> vega.StopOrder + 30, // 23: vega.events.v1.ERC20MultiSigSignerRemoved.signature_submitters:type_name -> vega.events.v1.ERC20MultiSigSignerRemovedSubmitter + 107, // 24: vega.events.v1.Transfer.from_account_type:type_name -> vega.AccountType + 107, // 25: vega.events.v1.Transfer.to_account_type:type_name -> vega.AccountType + 5, // 26: vega.events.v1.Transfer.status:type_name -> vega.events.v1.Transfer.Status + 34, // 27: vega.events.v1.Transfer.one_off:type_name -> vega.events.v1.OneOffTransfer + 35, // 28: vega.events.v1.Transfer.recurring:type_name -> vega.events.v1.RecurringTransfer + 33, // 29: vega.events.v1.Transfer.one_off_governance:type_name -> vega.events.v1.OneOffGovernanceTransfer + 36, // 30: vega.events.v1.Transfer.recurring_governance:type_name -> vega.events.v1.RecurringGovernanceTransfer + 108, // 31: vega.events.v1.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy + 108, // 32: vega.events.v1.RecurringGovernanceTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy + 6, // 33: vega.events.v1.StakeLinking.type:type_name -> vega.events.v1.StakeLinking.Type + 7, // 34: vega.events.v1.StakeLinking.status:type_name -> vega.events.v1.StakeLinking.Status + 8, // 35: vega.events.v1.ERC20MultiSigSignerEvent.type:type_name -> vega.events.v1.ERC20MultiSigSignerEvent.Type + 105, // 36: vega.events.v1.TransactionResult.order_submission:type_name -> vega.commands.v1.OrderSubmission + 109, // 37: vega.events.v1.TransactionResult.order_amendment:type_name -> vega.commands.v1.OrderAmendment + 110, // 38: vega.events.v1.TransactionResult.order_cancellation:type_name -> vega.commands.v1.OrderCancellation + 111, // 39: vega.events.v1.TransactionResult.proposal:type_name -> vega.commands.v1.ProposalSubmission + 112, // 40: vega.events.v1.TransactionResult.vote_submission:type_name -> vega.commands.v1.VoteSubmission + 113, // 41: vega.events.v1.TransactionResult.liquidity_provision_submission:type_name -> vega.commands.v1.LiquidityProvisionSubmission + 114, // 42: vega.events.v1.TransactionResult.withdraw_submission:type_name -> vega.commands.v1.WithdrawSubmission + 115, // 43: vega.events.v1.TransactionResult.delegate_submission:type_name -> vega.commands.v1.DelegateSubmission + 116, // 44: vega.events.v1.TransactionResult.undelegate_submission:type_name -> vega.commands.v1.UndelegateSubmission + 117, // 45: vega.events.v1.TransactionResult.liquidity_provision_cancellation:type_name -> vega.commands.v1.LiquidityProvisionCancellation + 118, // 46: vega.events.v1.TransactionResult.liquidity_provision_amendment:type_name -> vega.commands.v1.LiquidityProvisionAmendment + 119, // 47: vega.events.v1.TransactionResult.transfer:type_name -> vega.commands.v1.Transfer + 120, // 48: vega.events.v1.TransactionResult.cancel_transfer:type_name -> vega.commands.v1.CancelTransfer + 121, // 49: vega.events.v1.TransactionResult.announce_node:type_name -> vega.commands.v1.AnnounceNode + 122, // 50: vega.events.v1.TransactionResult.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission + 123, // 51: vega.events.v1.TransactionResult.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal + 124, // 52: vega.events.v1.TransactionResult.issue_signatures:type_name -> vega.commands.v1.IssueSignatures + 125, // 53: vega.events.v1.TransactionResult.batch_market_instructions:type_name -> vega.commands.v1.BatchMarketInstructions + 126, // 54: vega.events.v1.TransactionResult.key_rotate_submission:type_name -> vega.commands.v1.KeyRotateSubmission + 127, // 55: vega.events.v1.TransactionResult.ethereum_key_rotate_submission:type_name -> vega.commands.v1.EthereumKeyRotateSubmission + 128, // 56: vega.events.v1.TransactionResult.stop_orders_submission:type_name -> vega.commands.v1.StopOrdersSubmission + 129, // 57: vega.events.v1.TransactionResult.stop_orders_cancellation:type_name -> vega.commands.v1.StopOrdersCancellation + 130, // 58: vega.events.v1.TransactionResult.create_referral_set:type_name -> vega.commands.v1.CreateReferralSet + 131, // 59: vega.events.v1.TransactionResult.update_referral_set:type_name -> vega.commands.v1.UpdateReferralSet + 132, // 60: vega.events.v1.TransactionResult.apply_referral_code:type_name -> vega.commands.v1.ApplyReferralCode + 133, // 61: vega.events.v1.TransactionResult.update_margin_mode:type_name -> vega.commands.v1.UpdateMarginMode + 134, // 62: vega.events.v1.TransactionResult.join_team:type_name -> vega.commands.v1.JoinTeam + 135, // 63: vega.events.v1.TransactionResult.batch_proposal:type_name -> vega.commands.v1.BatchProposalSubmission + 136, // 64: vega.events.v1.TransactionResult.update_party_profile:type_name -> vega.commands.v1.UpdatePartyProfile + 137, // 65: vega.events.v1.TransactionResult.submit_amm:type_name -> vega.commands.v1.SubmitAMM + 138, // 66: vega.events.v1.TransactionResult.amend_amm:type_name -> vega.commands.v1.AmendAMM + 139, // 67: vega.events.v1.TransactionResult.cancel_amm:type_name -> vega.commands.v1.CancelAMM + 103, // 68: vega.events.v1.TransactionResult.success:type_name -> vega.events.v1.TransactionResult.SuccessDetails + 104, // 69: vega.events.v1.TransactionResult.failure:type_name -> vega.events.v1.TransactionResult.FailureDetails + 105, // 70: vega.events.v1.TxErrorEvent.order_submission:type_name -> vega.commands.v1.OrderSubmission + 109, // 71: vega.events.v1.TxErrorEvent.order_amendment:type_name -> vega.commands.v1.OrderAmendment + 110, // 72: vega.events.v1.TxErrorEvent.order_cancellation:type_name -> vega.commands.v1.OrderCancellation + 111, // 73: vega.events.v1.TxErrorEvent.proposal:type_name -> vega.commands.v1.ProposalSubmission + 112, // 74: vega.events.v1.TxErrorEvent.vote_submission:type_name -> vega.commands.v1.VoteSubmission + 113, // 75: vega.events.v1.TxErrorEvent.liquidity_provision_submission:type_name -> vega.commands.v1.LiquidityProvisionSubmission + 114, // 76: vega.events.v1.TxErrorEvent.withdraw_submission:type_name -> vega.commands.v1.WithdrawSubmission + 115, // 77: vega.events.v1.TxErrorEvent.delegate_submission:type_name -> vega.commands.v1.DelegateSubmission + 116, // 78: vega.events.v1.TxErrorEvent.undelegate_submission:type_name -> vega.commands.v1.UndelegateSubmission + 117, // 79: vega.events.v1.TxErrorEvent.liquidity_provision_cancellation:type_name -> vega.commands.v1.LiquidityProvisionCancellation + 118, // 80: vega.events.v1.TxErrorEvent.liquidity_provision_amendment:type_name -> vega.commands.v1.LiquidityProvisionAmendment + 119, // 81: vega.events.v1.TxErrorEvent.transfer:type_name -> vega.commands.v1.Transfer + 120, // 82: vega.events.v1.TxErrorEvent.cancel_transfer:type_name -> vega.commands.v1.CancelTransfer + 121, // 83: vega.events.v1.TxErrorEvent.announce_node:type_name -> vega.commands.v1.AnnounceNode + 122, // 84: vega.events.v1.TxErrorEvent.oracle_data_submission:type_name -> vega.commands.v1.OracleDataSubmission + 123, // 85: vega.events.v1.TxErrorEvent.protocol_upgrade_proposal:type_name -> vega.commands.v1.ProtocolUpgradeProposal + 124, // 86: vega.events.v1.TxErrorEvent.issue_signatures:type_name -> vega.commands.v1.IssueSignatures + 125, // 87: vega.events.v1.TxErrorEvent.batch_market_instructions:type_name -> vega.commands.v1.BatchMarketInstructions + 140, // 88: vega.events.v1.EpochEvent.action:type_name -> vega.EpochAction + 141, // 89: vega.events.v1.LedgerMovements.ledger_movements:type_name -> vega.LedgerMovement + 55, // 90: vega.events.v1.SettlePosition.trade_settlements:type_name -> vega.events.v1.TradeSettlement + 142, // 91: vega.events.v1.AuctionEvent.trigger:type_name -> vega.AuctionTrigger + 142, // 92: vega.events.v1.AuctionEvent.extension_trigger:type_name -> vega.AuctionTrigger + 0, // 93: vega.events.v1.ProtocolUpgradeEvent.status:type_name -> vega.events.v1.ProtocolUpgradeProposalStatus + 83, // 94: vega.events.v1.ReferralSetStatsUpdated.referees_stats:type_name -> vega.events.v1.RefereeStats + 143, // 95: vega.events.v1.ReferralProgramStarted.program:type_name -> vega.ReferralProgram + 143, // 96: vega.events.v1.ReferralProgramUpdated.program:type_name -> vega.ReferralProgram + 144, // 97: vega.events.v1.VolumeDiscountProgramStarted.program:type_name -> vega.VolumeDiscountProgram + 144, // 98: vega.events.v1.VolumeDiscountProgramUpdated.program:type_name -> vega.VolumeDiscountProgram + 22, // 99: vega.events.v1.PaidLiquidityFeesStats.fees_paid_per_party:type_name -> vega.events.v1.PartyAmount + 145, // 100: vega.events.v1.PartyMarginModeUpdated.margin_mode:type_name -> vega.MarginMode + 146, // 101: vega.events.v1.PartyProfileUpdated.updated_profile:type_name -> vega.PartyProfile + 95, // 102: vega.events.v1.TeamsStatsUpdated.stats:type_name -> vega.events.v1.TeamStats + 96, // 103: vega.events.v1.TeamStats.members_stats:type_name -> vega.events.v1.TeamMemberStats + 98, // 104: vega.events.v1.GameScores.team_scores:type_name -> vega.events.v1.GameTeamScore + 97, // 105: vega.events.v1.GameScores.party_scores:type_name -> vega.events.v1.GamePartyScore + 1, // 106: vega.events.v1.BusEvent.type:type_name -> vega.events.v1.BusEventType + 50, // 107: vega.events.v1.BusEvent.time_update:type_name -> vega.events.v1.TimeUpdate + 52, // 108: vega.events.v1.BusEvent.ledger_movements:type_name -> vega.events.v1.LedgerMovements + 53, // 109: vega.events.v1.BusEvent.position_resolution:type_name -> vega.events.v1.PositionResolution + 147, // 110: vega.events.v1.BusEvent.order:type_name -> vega.Order + 148, // 111: vega.events.v1.BusEvent.account:type_name -> vega.Account + 149, // 112: vega.events.v1.BusEvent.party:type_name -> vega.Party + 150, // 113: vega.events.v1.BusEvent.trade:type_name -> vega.Trade + 151, // 114: vega.events.v1.BusEvent.margin_levels:type_name -> vega.MarginLevels + 152, // 115: vega.events.v1.BusEvent.proposal:type_name -> vega.Proposal + 153, // 116: vega.events.v1.BusEvent.vote:type_name -> vega.Vote + 154, // 117: vega.events.v1.BusEvent.market_data:type_name -> vega.MarketData + 155, // 118: vega.events.v1.BusEvent.node_signature:type_name -> vega.commands.v1.NodeSignature + 54, // 119: vega.events.v1.BusEvent.loss_socialization:type_name -> vega.events.v1.LossSocialization + 56, // 120: vega.events.v1.BusEvent.settle_position:type_name -> vega.events.v1.SettlePosition + 59, // 121: vega.events.v1.BusEvent.settle_distressed:type_name -> vega.events.v1.SettleDistressed + 156, // 122: vega.events.v1.BusEvent.market_created:type_name -> vega.Market + 157, // 123: vega.events.v1.BusEvent.asset:type_name -> vega.Asset + 62, // 124: vega.events.v1.BusEvent.market_tick:type_name -> vega.events.v1.MarketTick + 158, // 125: vega.events.v1.BusEvent.withdrawal:type_name -> vega.Withdrawal + 159, // 126: vega.events.v1.BusEvent.deposit:type_name -> vega.Deposit + 63, // 127: vega.events.v1.BusEvent.auction:type_name -> vega.events.v1.AuctionEvent + 160, // 128: vega.events.v1.BusEvent.risk_factor:type_name -> vega.RiskFactor + 161, // 129: vega.events.v1.BusEvent.network_parameter:type_name -> vega.NetworkParameter + 162, // 130: vega.events.v1.BusEvent.liquidity_provision:type_name -> vega.LiquidityProvision + 156, // 131: vega.events.v1.BusEvent.market_updated:type_name -> vega.Market + 163, // 132: vega.events.v1.BusEvent.oracle_spec:type_name -> vega.OracleSpec + 164, // 133: vega.events.v1.BusEvent.oracle_data:type_name -> vega.OracleData + 44, // 134: vega.events.v1.BusEvent.delegation_balance:type_name -> vega.events.v1.DelegationBalanceEvent + 43, // 135: vega.events.v1.BusEvent.validator_score:type_name -> vega.events.v1.ValidatorScoreEvent + 51, // 136: vega.events.v1.BusEvent.epoch_event:type_name -> vega.events.v1.EpochEvent + 64, // 137: vega.events.v1.BusEvent.validator_update:type_name -> vega.events.v1.ValidatorUpdate + 37, // 138: vega.events.v1.BusEvent.stake_linking:type_name -> vega.events.v1.StakeLinking + 42, // 139: vega.events.v1.BusEvent.reward_payout:type_name -> vega.events.v1.RewardPayoutEvent + 40, // 140: vega.events.v1.BusEvent.checkpoint:type_name -> vega.events.v1.CheckpointEvent + 66, // 141: vega.events.v1.BusEvent.key_rotation:type_name -> vega.events.v1.KeyRotation + 69, // 142: vega.events.v1.BusEvent.state_var:type_name -> vega.events.v1.StateVar + 165, // 143: vega.events.v1.BusEvent.network_limits:type_name -> vega.NetworkLimits + 32, // 144: vega.events.v1.BusEvent.transfer:type_name -> vega.events.v1.Transfer + 65, // 145: vega.events.v1.BusEvent.ranking_event:type_name -> vega.events.v1.ValidatorRankingEvent + 38, // 146: vega.events.v1.BusEvent.erc20_multisig_signer_event:type_name -> vega.events.v1.ERC20MultiSigSignerEvent + 39, // 147: vega.events.v1.BusEvent.erc20_multisig_set_threshold_event:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent + 29, // 148: vega.events.v1.BusEvent.erc20_multisig_signer_added:type_name -> vega.events.v1.ERC20MultiSigSignerAdded + 31, // 149: vega.events.v1.BusEvent.erc20_multisig_signer_removed:type_name -> vega.events.v1.ERC20MultiSigSignerRemoved + 58, // 150: vega.events.v1.BusEvent.position_state_event:type_name -> vega.events.v1.PositionStateEvent + 67, // 151: vega.events.v1.BusEvent.ethereum_key_rotation:type_name -> vega.events.v1.EthereumKeyRotation + 68, // 152: vega.events.v1.BusEvent.protocol_upgrade_event:type_name -> vega.events.v1.ProtocolUpgradeEvent + 70, // 153: vega.events.v1.BusEvent.begin_block:type_name -> vega.events.v1.BeginBlock + 71, // 154: vega.events.v1.BusEvent.end_block:type_name -> vega.events.v1.EndBlock + 72, // 155: vega.events.v1.BusEvent.protocol_upgrade_started:type_name -> vega.events.v1.ProtocolUpgradeStarted + 57, // 156: vega.events.v1.BusEvent.settle_market:type_name -> vega.events.v1.SettleMarket + 48, // 157: vega.events.v1.BusEvent.transaction_result:type_name -> vega.events.v1.TransactionResult + 74, // 158: vega.events.v1.BusEvent.core_snapshot_event:type_name -> vega.events.v1.CoreSnapshotData + 73, // 159: vega.events.v1.BusEvent.protocol_upgrade_data_node_ready:type_name -> vega.events.v1.ProtocolUpgradeDataNodeReady + 60, // 160: vega.events.v1.BusEvent.distressed_orders:type_name -> vega.events.v1.DistressedOrders + 75, // 161: vega.events.v1.BusEvent.expired_orders:type_name -> vega.events.v1.ExpiredOrders + 61, // 162: vega.events.v1.BusEvent.distressed_positions:type_name -> vega.events.v1.DistressedPositions + 28, // 163: vega.events.v1.BusEvent.stop_order:type_name -> vega.events.v1.StopOrderEvent + 24, // 164: vega.events.v1.BusEvent.funding_period:type_name -> vega.events.v1.FundingPeriod + 27, // 165: vega.events.v1.BusEvent.funding_period_data_point:type_name -> vega.events.v1.FundingPeriodDataPoint + 77, // 166: vega.events.v1.BusEvent.team_created:type_name -> vega.events.v1.TeamCreated + 78, // 167: vega.events.v1.BusEvent.team_updated:type_name -> vega.events.v1.TeamUpdated + 79, // 168: vega.events.v1.BusEvent.referee_switched_team:type_name -> vega.events.v1.RefereeSwitchedTeam + 80, // 169: vega.events.v1.BusEvent.referee_joined_team:type_name -> vega.events.v1.RefereeJoinedTeam + 85, // 170: vega.events.v1.BusEvent.referral_program_started:type_name -> vega.events.v1.ReferralProgramStarted + 86, // 171: vega.events.v1.BusEvent.referral_program_updated:type_name -> vega.events.v1.ReferralProgramUpdated + 87, // 172: vega.events.v1.BusEvent.referral_program_ended:type_name -> vega.events.v1.ReferralProgramEnded + 81, // 173: vega.events.v1.BusEvent.referral_set_created:type_name -> vega.events.v1.ReferralSetCreated + 84, // 174: vega.events.v1.BusEvent.referee_joined_referral_set:type_name -> vega.events.v1.RefereeJoinedReferralSet + 23, // 175: vega.events.v1.BusEvent.party_activity_streak:type_name -> vega.events.v1.PartyActivityStreak + 88, // 176: vega.events.v1.BusEvent.volume_discount_program_started:type_name -> vega.events.v1.VolumeDiscountProgramStarted + 89, // 177: vega.events.v1.BusEvent.volume_discount_program_updated:type_name -> vega.events.v1.VolumeDiscountProgramUpdated + 90, // 178: vega.events.v1.BusEvent.volume_discount_program_ended:type_name -> vega.events.v1.VolumeDiscountProgramEnded + 82, // 179: vega.events.v1.BusEvent.referral_set_stats_updated:type_name -> vega.events.v1.ReferralSetStatsUpdated + 17, // 180: vega.events.v1.BusEvent.vesting_stats_updated:type_name -> vega.events.v1.VestingStatsUpdated + 15, // 181: vega.events.v1.BusEvent.volume_discount_stats_updated:type_name -> vega.events.v1.VolumeDiscountStatsUpdated + 19, // 182: vega.events.v1.BusEvent.fees_stats:type_name -> vega.events.v1.FeesStats + 26, // 183: vega.events.v1.BusEvent.funding_payments:type_name -> vega.events.v1.FundingPayments + 91, // 184: vega.events.v1.BusEvent.paid_liquidity_fees_stats:type_name -> vega.events.v1.PaidLiquidityFeesStats + 11, // 185: vega.events.v1.BusEvent.vesting_balances_summary:type_name -> vega.events.v1.VestingBalancesSummary + 46, // 186: vega.events.v1.BusEvent.transfer_fees:type_name -> vega.events.v1.TransferFees + 47, // 187: vega.events.v1.BusEvent.transfer_fees_discount:type_name -> vega.events.v1.TransferFeesDiscount + 92, // 188: vega.events.v1.BusEvent.party_margin_mode_updated:type_name -> vega.events.v1.PartyMarginModeUpdated + 93, // 189: vega.events.v1.BusEvent.party_profile_updated:type_name -> vega.events.v1.PartyProfileUpdated + 94, // 190: vega.events.v1.BusEvent.teams_stats_updated:type_name -> vega.events.v1.TeamsStatsUpdated + 9, // 191: vega.events.v1.BusEvent.time_weighted_notional_position_updated:type_name -> vega.events.v1.TimeWeightedNotionalPositionUpdated + 76, // 192: vega.events.v1.BusEvent.cancelled_orders:type_name -> vega.events.v1.CancelledOrders + 99, // 193: vega.events.v1.BusEvent.game_scores:type_name -> vega.events.v1.GameScores + 10, // 194: vega.events.v1.BusEvent.amm:type_name -> vega.events.v1.AMM + 45, // 195: vega.events.v1.BusEvent.market:type_name -> vega.events.v1.MarketEvent + 49, // 196: vega.events.v1.BusEvent.tx_err_event:type_name -> vega.events.v1.TxErrorEvent + 197, // [197:197] is the sub-list for method output_type + 197, // [197:197] is the sub-list for method input_type + 197, // [197:197] is the sub-list for extension type_name + 197, // [197:197] is the sub-list for extension extendee + 0, // [0:197] is the sub-list for field type_name } func init() { file_vega_events_v1_events_proto_init() } @@ -12087,7 +13068,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.(*AMM); i { case 0: return &v.state case 1: @@ -12099,7 +13080,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 +13092,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 +13104,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 +13116,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 +13128,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 +13140,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 +13152,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 +13164,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 +13176,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 +13188,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 +13200,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 +13212,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 +13224,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 +13236,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 +13248,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 +13260,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 +13272,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 +13284,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 +13296,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 +13308,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 +13320,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 +13332,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 +13344,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 +13356,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 +13368,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 +13380,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 +13392,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 +13404,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 +13416,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 +13428,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 +13440,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 +13452,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 +13464,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 +13476,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 +13488,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 +13500,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 +13512,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 +13524,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 +13536,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 +13548,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 +13560,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 +13572,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 +13584,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 +13596,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 +13608,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 +13620,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 +13632,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 +13644,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 +13656,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 +13668,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 +13680,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 +13692,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 +13704,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 +13716,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 +13728,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 +13740,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 +13752,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 +13764,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 +13776,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 +13788,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 +13800,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 +13812,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 +13824,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 +13836,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 +13848,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 +13860,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 +13872,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 +13884,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 +13896,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 +13908,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 +13920,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 +13932,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 +13944,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 +13956,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 +13968,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 +13980,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 +13992,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 +14004,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 +14016,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 +14028,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 +14040,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 +14052,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 +14064,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 +14076,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 +14088,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 +14100,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 +14112,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.(*GamePartyScore); i { case 0: return &v.state case 1: @@ -13143,6 +14124,78 @@ 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.(*GameTeamScore); 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.(*GameScores); 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.(*BusEvent); 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[92].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMM_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[93].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AMM_Curve); 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[94].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[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TransactionResult_FailureDetails); i { case 0: return &v.state @@ -13155,17 +14208,18 @@ 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[1].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 +14249,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 +14275,11 @@ 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{}{} + file_vega_events_v1_events_proto_msgTypes[91].OneofWrappers = []interface{}{ (*BusEvent_TimeUpdate)(nil), (*BusEvent_LedgerMovements)(nil), (*BusEvent_PositionResolution)(nil), @@ -13308,16 +14366,19 @@ func file_vega_events_v1_events_proto_init() { (*BusEvent_TeamsStatsUpdated)(nil), (*BusEvent_TimeWeightedNotionalPositionUpdated)(nil), (*BusEvent_CancelledOrders)(nil), + (*BusEvent_GameScores)(nil), + (*BusEvent_Amm)(nil), (*BusEvent_Market)(nil), (*BusEvent_TxErrEvent)(nil), } + file_vega_events_v1_events_proto_msgTypes[92].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_events_v1_events_proto_rawDesc, - NumEnums: 7, - NumMessages: 90, + NumEnums: 9, + NumMessages: 96, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/governance.pb.go b/protos/vega/governance.pb.go index 59335ffcc44..d58c1b4f01f 100644 --- a/protos/vega/governance.pb.go +++ b/protos/vega/governance.pb.go @@ -643,6 +643,8 @@ type FutureProduct struct { DataSourceSpecForTradingTermination *DataSourceDefinition `protobuf:"bytes,4,opt,name=data_source_spec_for_trading_termination,json=dataSourceSpecForTradingTermination,proto3" json:"data_source_spec_for_trading_termination,omitempty"` // Binding between the data source spec and the settlement data. DataSourceSpecBinding *DataSourceSpecToFutureBinding `protobuf:"bytes,5,opt,name=data_source_spec_binding,json=dataSourceSpecBinding,proto3" json:"data_source_spec_binding,omitempty"` + // If set, this product creates a capped future market. + Cap *FutureCap `protobuf:"bytes,6,opt,name=cap,proto3,oneof" json:"cap,omitempty"` } func (x *FutureProduct) Reset() { @@ -712,6 +714,13 @@ func (x *FutureProduct) GetDataSourceSpecBinding() *DataSourceSpecToFutureBindin return nil } +func (x *FutureProduct) GetCap() *FutureCap { + if x != nil { + return x.Cap + } + return nil +} + // Perpetual product configuration type PerpetualProduct struct { state protoimpl.MessageState @@ -1019,6 +1028,8 @@ type NewSpotMarketConfiguration struct { LiquidityFeeSettings *LiquidityFeeSettings `protobuf:"bytes,8,opt,name=liquidity_fee_settings,json=liquidityFeeSettings,proto3" json:"liquidity_fee_settings,omitempty"` // The market tick size defines the minimum change in quote price for the market TickSize string `protobuf:"bytes,9,opt,name=tick_size,json=tickSize,proto3" json:"tick_size,omitempty"` + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + EnableTransactionReordering bool `protobuf:"varint,10,opt,name=enable_transaction_reordering,json=enableTransactionReordering,proto3" json:"enable_transaction_reordering,omitempty"` } func (x *NewSpotMarketConfiguration) Reset() { @@ -1137,6 +1148,13 @@ func (x *NewSpotMarketConfiguration) GetTickSize() string { return "" } +func (x *NewSpotMarketConfiguration) GetEnableTransactionReordering() bool { + if x != nil { + return x.EnableTransactionReordering + } + return false +} + type isNewSpotMarketConfiguration_RiskParameters interface { isNewSpotMarketConfiguration_RiskParameters() } @@ -1202,6 +1220,8 @@ type NewMarketConfiguration struct { MarkPriceConfiguration *CompositePriceConfiguration `protobuf:"bytes,15,opt,name=mark_price_configuration,json=markPriceConfiguration,proto3" json:"mark_price_configuration,omitempty"` // The market tick size defines the minimum change in quote price for the market TickSize string `protobuf:"bytes,16,opt,name=tick_size,json=tickSize,proto3" json:"tick_size,omitempty"` + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + EnableTransactionReordering bool `protobuf:"varint,17,opt,name=enable_transaction_reordering,json=enableTransactionReordering,proto3" json:"enable_transaction_reordering,omitempty"` } func (x *NewMarketConfiguration) Reset() { @@ -1363,6 +1383,13 @@ func (x *NewMarketConfiguration) GetTickSize() string { return "" } +func (x *NewMarketConfiguration) GetEnableTransactionReordering() bool { + if x != nil { + return x.EnableTransactionReordering + } + return false +} + type isNewMarketConfiguration_RiskParameters interface { isNewMarketConfiguration_RiskParameters() } @@ -1694,6 +1721,8 @@ type UpdateMarketConfiguration struct { MarkPriceConfiguration *CompositePriceConfiguration `protobuf:"bytes,11,opt,name=mark_price_configuration,json=markPriceConfiguration,proto3" json:"mark_price_configuration,omitempty"` // The market tick size defines the minimum change in quote price for the market TickSize string `protobuf:"bytes,12,opt,name=tick_size,json=tickSize,proto3" json:"tick_size,omitempty"` + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + EnableTransactionReordering bool `protobuf:"varint,13,opt,name=enable_transaction_reordering,json=enableTransactionReordering,proto3" json:"enable_transaction_reordering,omitempty"` } func (x *UpdateMarketConfiguration) Reset() { @@ -1834,6 +1863,13 @@ func (x *UpdateMarketConfiguration) GetTickSize() string { return "" } +func (x *UpdateMarketConfiguration) GetEnableTransactionReordering() bool { + if x != nil { + return x.EnableTransactionReordering + } + return false +} + type isUpdateMarketConfiguration_RiskParameters interface { isUpdateMarketConfiguration_RiskParameters() } @@ -1879,6 +1915,8 @@ type UpdateSpotMarketConfiguration struct { TickSize string `protobuf:"bytes,6,opt,name=tick_size,json=tickSize,proto3" json:"tick_size,omitempty"` // Specifies the name and code of the spot instrument. Instrument *UpdateSpotInstrumentConfiguration `protobuf:"bytes,7,opt,name=instrument,proto3" json:"instrument,omitempty"` + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + EnableTransactionReordering bool `protobuf:"varint,8,opt,name=enable_transaction_reordering,json=enableTransactionReordering,proto3" json:"enable_transaction_reordering,omitempty"` } func (x *UpdateSpotMarketConfiguration) Reset() { @@ -1983,6 +2021,13 @@ func (x *UpdateSpotMarketConfiguration) GetInstrument() *UpdateSpotInstrumentCon return nil } +func (x *UpdateSpotMarketConfiguration) GetEnableTransactionReordering() bool { + if x != nil { + return x.EnableTransactionReordering + } + return false +} + type isUpdateSpotMarketConfiguration_RiskParameters interface { isUpdateSpotMarketConfiguration_RiskParameters() } @@ -4578,6 +4623,9 @@ type RecurringTransfer struct { EndEpoch *uint64 `protobuf:"varint,2,opt,name=end_epoch,json=endEpoch,proto3,oneof" json:"end_epoch,omitempty"` // Optional parameter defining how a transfer is dispatched. DispatchStrategy *DispatchStrategy `protobuf:"bytes,3,opt,name=dispatch_strategy,json=dispatchStrategy,proto3,oneof" json:"dispatch_strategy,omitempty"` + // Factor that the initial transfer amount is multiplied by for each epoch that it is executed. + // For example if the initial transfer amount is 1000 and the factor is 0.5, then the amounts transferred per epoch will be 1000, 500, 250, 125, etc. + Factor string `protobuf:"bytes,4,opt,name=factor,proto3" json:"factor,omitempty"` } func (x *RecurringTransfer) Reset() { @@ -4633,6 +4681,13 @@ func (x *RecurringTransfer) GetDispatchStrategy() *DispatchStrategy { return nil } +func (x *RecurringTransfer) GetFactor() string { + if x != nil { + return x.Factor + } + return "" +} + var File_vega_governance_proto protoreflect.FileDescriptor var file_vega_governance_proto_rawDesc = []byte{ @@ -4647,7 +4702,7 @@ var file_vega_governance_proto_rawDesc = []byte{ 0x62, 0x61, 0x73, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0x95, 0x03, 0x0a, + 0x52, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x22, 0xc5, 0x03, 0x0a, 0x0d, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, @@ -4673,7 +4728,10 @@ var file_vega_governance_proto_rawDesc = []byte{ 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x15, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x42, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x22, 0x8e, 0x08, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x03, 0x63, 0x61, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x43, + 0x61, 0x70, 0x48, 0x00, 0x52, 0x03, 0x63, 0x61, 0x70, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, + 0x5f, 0x63, 0x61, 0x70, 0x22, 0x8e, 0x08, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x41, @@ -4752,7 +4810,7 @@ var file_vega_governance_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x22, 0xbc, 0x05, 0x0a, 0x1a, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, + 0x64, 0x75, 0x63, 0x74, 0x22, 0x80, 0x06, 0x0a, 0x1a, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, @@ -4795,212 +4853,229 @@ var file_vega_governance_proto_rawDesc = []byte{ 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x42, 0x0a, 0x1d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, + 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x69, 0x6e, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0xda, 0x09, 0x0a, 0x16, 0x4e, 0x65, 0x77, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x64, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x19, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6b, 0x0a, 0x1f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x52, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x64, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6e, 0x6f, 0x72, + 0x6d, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, + 0x12, 0x36, 0x0a, 0x17, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x15, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x0e, 0x6c, 0x70, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x0c, 0x6c, 0x70, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x6c, + 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x14, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x6c, 0x69, 0x70, 0x70, + 0x61, 0x67, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x19, 0x71, 0x75, 0x61, + 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x17, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x70, 0x70, + 0x61, 0x67, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x09, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x56, 0x0a, 0x18, 0x6c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0c, 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, 0x16, 0x6c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x6c, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, + 0x66, 0x65, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x14, + 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x0e, 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, 0x13, 0x6c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x12, 0x5b, 0x0a, 0x18, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, + 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, 0x16, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x42, 0x0a, 0x1d, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x22, 0x96, 0x09, 0x0a, 0x16, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, - 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x65, 0x72, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x22, 0x4b, 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, + 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x22, 0x7a, 0x0a, 0x16, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, + 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, + 0x09, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x22, 0x66, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 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, + 0x39, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x6e, 0x0a, 0x10, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 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, 0x3d, 0x0a, 0x07, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xb5, 0x08, 0x0a, 0x19, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x50, 0x6c, - 0x61, 0x63, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x19, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, - 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x6b, 0x0a, 0x1f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x6d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x6e, 0x69, 0x74, + 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, - 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x31, - 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, - 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, - 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x67, - 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x48, - 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x36, 0x0a, 0x17, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x50, 0x6c, - 0x61, 0x63, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x0e, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, - 0x6c, 0x70, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, - 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x14, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x46, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x19, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, - 0x69, 0x63, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x17, 0x71, 0x75, - 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x46, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x02, 0x52, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x56, 0x0a, 0x18, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x19, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x6b, 0x0a, 0x1f, 0x6c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, + 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x6f, + 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, + 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4e, + 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x0e, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x0c, 0x6c, 0x70, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, + 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x19, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, + 0x74, 0x69, 0x63, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x17, 0x71, + 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, + 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x56, 0x0a, 0x18, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x72, 0x73, 0x18, 0x08, 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, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x6c, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x0a, 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, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x5b, 0x0a, 0x18, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 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, 0x16, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x74, - 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, - 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x4b, 0x0a, 0x0d, - 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x3a, 0x0a, - 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x7a, 0x0a, 0x16, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, - 0x17, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, - 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x6f, 0x6f, 0x6c, 0x46, 0x72, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x09, 0x4e, 0x65, 0x77, 0x4d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x12, 0x36, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x77, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0x66, 0x0a, 0x0c, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 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, 0x39, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x22, 0x6e, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 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, 0x3d, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x73, 0x22, 0xf1, 0x07, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x43, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x19, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x12, 0x6b, 0x0a, 0x1f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, - 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, - 0x31, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, - 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, - 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x29, 0x0a, - 0x0e, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x6c, 0x70, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x6e, 0x65, - 0x61, 0x72, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, - 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x3e, - 0x0a, 0x19, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x6c, 0x69, 0x70, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x17, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, - 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x56, - 0x0a, 0x18, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x61, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x08, 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, 0x16, - 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x53, 0x6c, 0x61, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x18, 0x0a, 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, 0x13, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x5b, 0x0a, 0x18, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x0b, 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, 0x16, 0x6d, 0x61, 0x72, - 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, - 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xe7, 0x04, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x19, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x53, 0x0a, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x15, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x69, - 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x39, 0x0a, - 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, - 0x61, 0x6c, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x6c, - 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x73, 0x6c, 0x61, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 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, 0x09, 0x73, 0x6c, 0x61, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, 0x6b, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x11, 0x0a, + 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x42, 0x0a, 0x1d, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x11, 0x0a, 0x0f, + 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, + 0x11, 0x0a, 0x0f, 0x5f, 0x6c, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x22, 0xab, 0x05, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, + 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x5f, 0x0a, 0x1b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x19, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x53, 0x0a, 0x17, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x6b, + 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x15, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, + 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, + 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, + 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4e, 0x6f, + 0x72, 0x6d, 0x61, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x04, 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, 0x09, 0x73, 0x6c, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, + 0x65, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x14, 0x6c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x47, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x1b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x4b, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, @@ -5532,7 +5607,7 @@ var file_vega_governance_proto_rawDesc = []byte{ 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, - 0xc4, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, + 0xdc, 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, @@ -5542,192 +5617,193 @@ var file_vega_governance_proto_rawDesc = []byte{ 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, 0x2a, 0xe4, 0x13, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, - 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, 0x01, + 0x01, 0x01, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 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, 0x2a, 0xe4, + 0x13, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, - 0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x43, 0x54, - 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, 0x03, + 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, + 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x43, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, - 0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, - 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x05, - 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, - 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x10, 0x06, - 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x07, 0x12, - 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x50, 0x52, - 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x08, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x50, 0x4f, - 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x52, 0x41, - 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x0b, 0x12, 0x2b, 0x0a, 0x27, 0x50, - 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, - 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, - 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x0c, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x0d, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x55, - 0x49, 0x4c, 0x54, 0x49, 0x4e, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, - 0x44, 0x10, 0x0e, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x52, - 0x43, 0x32, 0x30, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x5f, 0x41, 0x44, 0x44, - 0x52, 0x45, 0x53, 0x53, 0x10, 0x0f, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, - 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, 0x10, 0x12, 0x2a, 0x0a, 0x26, 0x50, 0x52, 0x4f, 0x50, - 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4d, - 0x50, 0x41, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, - 0x50, 0x53, 0x10, 0x11, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x50, - 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x53, 0x10, 0x12, 0x12, 0x30, 0x0a, 0x2c, 0x50, - 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, - 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x13, 0x12, 0x32, 0x0a, - 0x2e, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, - 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, - 0x14, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, - 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x15, 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, - 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x55, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x4d, 0x41, 0x4c, 0x4c, 0x10, 0x16, - 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, - 0x4c, 0x41, 0x52, 0x47, 0x45, 0x10, 0x17, 0x12, 0x2f, 0x0a, 0x2b, 0x50, 0x52, 0x4f, 0x50, 0x4f, - 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x4f, 0x55, 0x4c, 0x44, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x49, 0x41, 0x54, 0x45, 0x5f, - 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x19, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x4e, 0x41, 0x43, 0x54, + 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x54, 0x45, 0x10, 0x04, + 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, + 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x05, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x46, 0x55, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, - 0x54, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x49, - 0x53, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x10, 0x1e, 0x12, 0x31, - 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x4d, 0x41, 0x4a, 0x4f, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, + 0x49, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x45, + 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x52, + 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x07, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x52, 0x4f, 0x50, 0x4f, + 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, + 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x08, 0x12, + 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, + 0x45, 0x10, 0x0b, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, + 0x44, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x0c, + 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x2e, 0x0a, 0x2a, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, + 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x49, 0x4e, 0x5f, 0x41, 0x53, + 0x53, 0x45, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x0e, 0x12, 0x31, 0x0a, 0x2d, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, + 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x43, 0x4f, 0x4e, 0x54, + 0x52, 0x41, 0x43, 0x54, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x0f, 0x12, 0x20, + 0x0a, 0x1c, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x10, 0x10, + 0x12, 0x2a, 0x0a, 0x26, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x5f, + 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x53, 0x10, 0x11, 0x12, 0x25, 0x0a, 0x21, + 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, + 0x4f, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, + 0x53, 0x10, 0x12, 0x12, 0x30, 0x0a, 0x2c, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, + 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, + 0x4b, 0x45, 0x59, 0x10, 0x13, 0x12, 0x32, 0x0a, 0x2e, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, + 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, + 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x14, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x45, 0x54, 0x57, + 0x4f, 0x52, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, + 0x15, 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x4f, + 0x5f, 0x53, 0x4d, 0x41, 0x4c, 0x4c, 0x10, 0x16, 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, + 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x55, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x52, 0x47, 0x45, 0x10, 0x17, 0x12, + 0x2f, 0x0a, 0x2b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x43, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x41, 0x4e, 0x54, 0x49, 0x41, 0x54, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x19, + 0x12, 0x29, 0x0a, 0x25, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x55, 0x54, 0x55, 0x52, + 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, + 0x45, 0x54, 0x45, 0x52, 0x10, 0x1e, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, + 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x4a, 0x4f, 0x52, 0x49, 0x54, + 0x59, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, + 0x52, 0x45, 0x41, 0x43, 0x48, 0x45, 0x44, 0x10, 0x1f, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, + 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x52, 0x54, + 0x49, 0x43, 0x49, 0x50, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x41, 0x43, 0x48, 0x45, 0x44, 0x10, - 0x1f, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x49, 0x50, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x52, 0x45, 0x41, 0x43, 0x48, 0x45, 0x44, 0x10, 0x20, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, - 0x53, 0x10, 0x21, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x10, 0x22, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x52, - 0x49, 0x53, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x10, 0x23, 0x12, 0x23, 0x0a, 0x1f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, - 0x52, 0x45, 0x45, 0x46, 0x4f, 0x52, 0x4d, 0x10, 0x24, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, - 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x51, 0x55, 0x49, 0x54, 0x59, 0x5f, - 0x4c, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x10, 0x25, 0x12, 0x21, 0x0a, 0x1d, + 0x20, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x41, 0x53, 0x53, 0x45, + 0x54, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, 0x10, 0x21, 0x12, 0x1f, 0x0a, 0x1b, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x22, 0x12, 0x2e, 0x0a, 0x2a, + 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x52, 0x49, 0x53, 0x4b, 0x5f, 0x50, 0x41, 0x52, 0x41, + 0x4d, 0x45, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x23, 0x12, 0x23, 0x0a, 0x1f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x26, 0x12, - 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, - 0x54, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x53, - 0x10, 0x27, 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x50, 0x52, - 0x49, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x54, - 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x53, 0x10, 0x28, 0x12, 0x2f, 0x0a, 0x2b, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x52, 0x43, 0x32, - 0x30, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, - 0x59, 0x5f, 0x49, 0x4e, 0x5f, 0x55, 0x53, 0x45, 0x10, 0x29, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x50, 0x5f, - 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x50, - 0x4f, 0x53, 0x49, 0x54, 0x49, 0x56, 0x45, 0x10, 0x2a, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x50, 0x5f, 0x50, - 0x52, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, - 0x41, 0x52, 0x47, 0x45, 0x10, 0x2b, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, - 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x41, 0x52, 0x5f, - 0x53, 0x4c, 0x49, 0x50, 0x50, 0x41, 0x47, 0x45, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, - 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x2c, 0x12, 0x39, - 0x0a, 0x35, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x51, 0x55, 0x41, 0x44, 0x52, 0x41, 0x54, 0x49, 0x43, 0x5f, 0x53, 0x4c, 0x49, 0x50, 0x50, - 0x41, 0x47, 0x45, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, - 0x46, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x2d, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x10, 0x2e, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, - 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x53, 0x50, 0x4f, - 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, - 0x45, 0x44, 0x10, 0x2f, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, - 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, - 0x30, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x31, 0x12, 0x37, 0x0a, 0x33, 0x50, 0x52, 0x4f, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x52, 0x45, 0x45, 0x46, 0x4f, 0x52, 0x4d, 0x10, + 0x24, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, + 0x5f, 0x45, 0x51, 0x55, 0x49, 0x54, 0x59, 0x5f, 0x4c, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, + 0x52, 0x45, 0x10, 0x25, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, + 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x26, 0x12, 0x31, 0x0a, 0x2d, 0x50, 0x52, 0x4f, 0x50, 0x4f, + 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4d, 0x41, + 0x4e, 0x59, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, + 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x53, 0x10, 0x27, 0x12, 0x35, 0x0a, 0x31, 0x50, 0x52, + 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x4f, + 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x49, + 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x53, 0x10, + 0x28, 0x12, 0x2f, 0x0a, 0x2b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x52, 0x43, 0x32, 0x30, 0x5f, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, + 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, 0x49, 0x4e, 0x5f, 0x55, 0x53, 0x45, + 0x10, 0x29, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x50, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x41, + 0x4e, 0x47, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x56, 0x45, 0x10, + 0x2a, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x4c, 0x50, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x41, 0x4e, + 0x47, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x41, 0x52, 0x47, 0x45, 0x10, 0x2b, 0x12, 0x36, + 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x41, 0x52, 0x5f, 0x53, 0x4c, 0x49, 0x50, 0x50, 0x41, 0x47, 0x45, + 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, + 0x41, 0x4e, 0x47, 0x45, 0x10, 0x2c, 0x12, 0x39, 0x0a, 0x35, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, + 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x51, 0x55, 0x41, 0x44, 0x52, 0x41, 0x54, + 0x49, 0x43, 0x5f, 0x53, 0x4c, 0x49, 0x50, 0x50, 0x41, 0x47, 0x45, 0x5f, 0x46, 0x41, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, + 0x2d, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x50, 0x4f, 0x54, + 0x10, 0x2e, 0x12, 0x28, 0x0a, 0x24, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, + 0x54, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x2f, 0x12, 0x2b, 0x0a, 0x27, + 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x4f, 0x52, + 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x30, 0x12, 0x36, 0x0a, 0x32, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, - 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x10, 0x32, 0x12, 0x3e, 0x0a, 0x3a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, - 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, - 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x10, 0x33, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, + 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, + 0x31, 0x12, 0x37, 0x0a, 0x33, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x32, 0x12, 0x3e, 0x0a, 0x3a, 0x50, 0x52, + 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x47, 0x4f, 0x56, + 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x5f, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, + 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x33, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, + 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x34, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, + 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, + 0x35, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4c, 0x41, 0x5f, + 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, 0x36, 0x12, 0x2c, 0x0a, 0x28, 0x50, 0x52, 0x4f, 0x50, + 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, + 0x44, 0x55, 0x43, 0x54, 0x10, 0x37, 0x12, 0x2b, 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, + 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, + 0x4d, 0x10, 0x38, 0x12, 0x32, 0x0a, 0x2e, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x56, 0x4f, + 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, + 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x39, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x50, 0x4f, + 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, + 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x52, 0x45, 0x4a, 0x45, + 0x43, 0x54, 0x45, 0x44, 0x10, 0x3a, 0x12, 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, + 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, + 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x49, + 0x4e, 0x45, 0x44, 0x10, 0x3b, 0x12, 0x2e, 0x0a, 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, + 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, + 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, 0x4c, 0x5f, 0x50, 0x4c, 0x41, + 0x43, 0x45, 0x53, 0x10, 0x3c, 0x2a, 0xb4, 0x01, 0x0a, 0x15, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x28, 0x0a, 0x24, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, - 0x10, 0x34, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x4c, 0x41, - 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, 0x35, 0x12, 0x25, 0x0a, 0x21, 0x50, 0x52, 0x4f, - 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, - 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x41, 0x52, 0x41, 0x4d, 0x53, 0x10, 0x36, - 0x12, 0x2c, 0x0a, 0x28, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, - 0x54, 0x55, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x10, 0x37, 0x12, 0x2b, - 0x0a, 0x27, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, - 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x38, 0x12, 0x32, 0x0a, 0x2e, 0x50, - 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x44, 0x49, 0x53, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x10, 0x39, 0x12, - 0x2d, 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x42, 0x41, - 0x54, 0x43, 0x48, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x3a, 0x12, 0x2d, - 0x0a, 0x29, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x5f, 0x42, 0x41, 0x54, - 0x43, 0x48, 0x5f, 0x44, 0x45, 0x43, 0x4c, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x3b, 0x12, 0x2e, 0x0a, - 0x2a, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x44, 0x45, 0x43, - 0x49, 0x4d, 0x41, 0x4c, 0x5f, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x53, 0x10, 0x3c, 0x2a, 0xb4, 0x01, - 0x0a, 0x15, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x24, 0x4d, 0x41, 0x52, 0x4b, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x10, + 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, + 0x53, 0x50, 0x45, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x99, 0x01, 0x0a, + 0x16, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x24, 0x47, 0x4f, 0x56, 0x45, 0x52, + 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 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, 0x26, 0x0a, 0x22, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, - 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x41, 0x52, - 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x10, 0x02, 0x12, - 0x23, 0x0a, 0x1f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x55, - 0x4d, 0x45, 0x10, 0x03, 0x2a, 0x99, 0x01, 0x0a, 0x16, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x28, 0x0a, 0x24, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 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, 0x2b, 0x0a, 0x27, 0x47, 0x4f, 0x56, - 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, - 0x48, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, - 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 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, + 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4c, + 0x4c, 0x5f, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x28, + 0x0a, 0x24, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x41, + 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, + 0x45, 0x46, 0x46, 0x4f, 0x52, 0x54, 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 ( @@ -5797,149 +5873,151 @@ var file_vega_governance_proto_goTypes = []interface{}{ nil, // 49: vega.GovernanceData.NoPartyEntry (*DataSourceDefinition)(nil), // 50: vega.DataSourceDefinition (*DataSourceSpecToFutureBinding)(nil), // 51: vega.DataSourceSpecToFutureBinding - (*DataSourceSpecToPerpetualBinding)(nil), // 52: vega.DataSourceSpecToPerpetualBinding - (*CompositePriceConfiguration)(nil), // 53: vega.CompositePriceConfiguration - (*PriceMonitoringParameters)(nil), // 54: vega.PriceMonitoringParameters - (*TargetStakeParameters)(nil), // 55: vega.TargetStakeParameters - (*SimpleModelParams)(nil), // 56: vega.SimpleModelParams - (*LogNormalRiskModel)(nil), // 57: vega.LogNormalRiskModel - (*LiquiditySLAParameters)(nil), // 58: vega.LiquiditySLAParameters - (*LiquidityFeeSettings)(nil), // 59: vega.LiquidityFeeSettings - (*LiquidityMonitoringParameters)(nil), // 60: vega.LiquidityMonitoringParameters - (*LiquidationStrategy)(nil), // 61: vega.LiquidationStrategy - (*NetworkParameter)(nil), // 62: vega.NetworkParameter - (*AssetDetails)(nil), // 63: vega.AssetDetails - (*AssetDetailsUpdate)(nil), // 64: vega.AssetDetailsUpdate - (*VolumeBenefitTier)(nil), // 65: vega.VolumeBenefitTier - (*BenefitTier)(nil), // 66: vega.BenefitTier - (*StakingTier)(nil), // 67: vega.StakingTier - (AccountType)(0), // 68: vega.AccountType - (*DispatchStrategy)(nil), // 69: vega.DispatchStrategy + (*FutureCap)(nil), // 52: vega.FutureCap + (*DataSourceSpecToPerpetualBinding)(nil), // 53: vega.DataSourceSpecToPerpetualBinding + (*CompositePriceConfiguration)(nil), // 54: vega.CompositePriceConfiguration + (*PriceMonitoringParameters)(nil), // 55: vega.PriceMonitoringParameters + (*TargetStakeParameters)(nil), // 56: vega.TargetStakeParameters + (*SimpleModelParams)(nil), // 57: vega.SimpleModelParams + (*LogNormalRiskModel)(nil), // 58: vega.LogNormalRiskModel + (*LiquiditySLAParameters)(nil), // 59: vega.LiquiditySLAParameters + (*LiquidityFeeSettings)(nil), // 60: vega.LiquidityFeeSettings + (*LiquidityMonitoringParameters)(nil), // 61: vega.LiquidityMonitoringParameters + (*LiquidationStrategy)(nil), // 62: vega.LiquidationStrategy + (*NetworkParameter)(nil), // 63: vega.NetworkParameter + (*AssetDetails)(nil), // 64: vega.AssetDetails + (*AssetDetailsUpdate)(nil), // 65: vega.AssetDetailsUpdate + (*VolumeBenefitTier)(nil), // 66: vega.VolumeBenefitTier + (*BenefitTier)(nil), // 67: vega.BenefitTier + (*StakingTier)(nil), // 68: vega.StakingTier + (AccountType)(0), // 69: vega.AccountType + (*DispatchStrategy)(nil), // 70: vega.DispatchStrategy } var file_vega_governance_proto_depIdxs = []int32{ 50, // 0: vega.FutureProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition 50, // 1: vega.FutureProduct.data_source_spec_for_trading_termination:type_name -> vega.DataSourceDefinition 51, // 2: vega.FutureProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToFutureBinding - 50, // 3: vega.PerpetualProduct.data_source_spec_for_settlement_schedule:type_name -> vega.DataSourceDefinition - 50, // 4: vega.PerpetualProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition - 52, // 5: vega.PerpetualProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToPerpetualBinding - 53, // 6: vega.PerpetualProduct.internal_composite_price_configuration:type_name -> vega.CompositePriceConfiguration - 7, // 7: vega.InstrumentConfiguration.future:type_name -> vega.FutureProduct - 6, // 8: vega.InstrumentConfiguration.spot:type_name -> vega.SpotProduct - 8, // 9: vega.InstrumentConfiguration.perpetual:type_name -> vega.PerpetualProduct - 9, // 10: vega.NewSpotMarketConfiguration.instrument:type_name -> vega.InstrumentConfiguration - 54, // 11: vega.NewSpotMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters - 55, // 12: vega.NewSpotMarketConfiguration.target_stake_parameters:type_name -> vega.TargetStakeParameters - 56, // 13: vega.NewSpotMarketConfiguration.simple:type_name -> vega.SimpleModelParams - 57, // 14: vega.NewSpotMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel - 58, // 15: vega.NewSpotMarketConfiguration.sla_params:type_name -> vega.LiquiditySLAParameters - 59, // 16: vega.NewSpotMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings - 9, // 17: vega.NewMarketConfiguration.instrument:type_name -> vega.InstrumentConfiguration - 54, // 18: vega.NewMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters - 60, // 19: vega.NewMarketConfiguration.liquidity_monitoring_parameters:type_name -> vega.LiquidityMonitoringParameters - 56, // 20: vega.NewMarketConfiguration.simple:type_name -> vega.SimpleModelParams - 57, // 21: vega.NewMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel - 13, // 22: vega.NewMarketConfiguration.successor:type_name -> vega.SuccessorConfiguration - 58, // 23: vega.NewMarketConfiguration.liquidity_sla_parameters:type_name -> vega.LiquiditySLAParameters - 59, // 24: vega.NewMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings - 61, // 25: vega.NewMarketConfiguration.liquidation_strategy:type_name -> vega.LiquidationStrategy - 53, // 26: vega.NewMarketConfiguration.mark_price_configuration:type_name -> vega.CompositePriceConfiguration - 10, // 27: vega.NewSpotMarket.changes:type_name -> vega.NewSpotMarketConfiguration - 11, // 28: vega.NewMarket.changes:type_name -> vega.NewMarketConfiguration - 17, // 29: vega.UpdateMarket.changes:type_name -> vega.UpdateMarketConfiguration - 18, // 30: vega.UpdateSpotMarket.changes:type_name -> vega.UpdateSpotMarketConfiguration - 20, // 31: vega.UpdateMarketConfiguration.instrument:type_name -> vega.UpdateInstrumentConfiguration - 54, // 32: vega.UpdateMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters - 60, // 33: vega.UpdateMarketConfiguration.liquidity_monitoring_parameters:type_name -> vega.LiquidityMonitoringParameters - 56, // 34: vega.UpdateMarketConfiguration.simple:type_name -> vega.SimpleModelParams - 57, // 35: vega.UpdateMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel - 58, // 36: vega.UpdateMarketConfiguration.liquidity_sla_parameters:type_name -> vega.LiquiditySLAParameters - 59, // 37: vega.UpdateMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings - 61, // 38: vega.UpdateMarketConfiguration.liquidation_strategy:type_name -> vega.LiquidationStrategy - 53, // 39: vega.UpdateMarketConfiguration.mark_price_configuration:type_name -> vega.CompositePriceConfiguration - 54, // 40: vega.UpdateSpotMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters - 55, // 41: vega.UpdateSpotMarketConfiguration.target_stake_parameters:type_name -> vega.TargetStakeParameters - 56, // 42: vega.UpdateSpotMarketConfiguration.simple:type_name -> vega.SimpleModelParams - 57, // 43: vega.UpdateSpotMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel - 58, // 44: vega.UpdateSpotMarketConfiguration.sla_params:type_name -> vega.LiquiditySLAParameters - 59, // 45: vega.UpdateSpotMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings - 19, // 46: vega.UpdateSpotMarketConfiguration.instrument:type_name -> vega.UpdateSpotInstrumentConfiguration - 21, // 47: vega.UpdateInstrumentConfiguration.future:type_name -> vega.UpdateFutureProduct - 22, // 48: vega.UpdateInstrumentConfiguration.perpetual:type_name -> vega.UpdatePerpetualProduct - 50, // 49: vega.UpdateFutureProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition - 50, // 50: vega.UpdateFutureProduct.data_source_spec_for_trading_termination:type_name -> vega.DataSourceDefinition - 51, // 51: vega.UpdateFutureProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToFutureBinding - 50, // 52: vega.UpdatePerpetualProduct.data_source_spec_for_settlement_schedule:type_name -> vega.DataSourceDefinition - 50, // 53: vega.UpdatePerpetualProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition - 52, // 54: vega.UpdatePerpetualProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToPerpetualBinding - 53, // 55: vega.UpdatePerpetualProduct.internal_composite_price_configuration:type_name -> vega.CompositePriceConfiguration - 62, // 56: vega.UpdateNetworkParameter.changes:type_name -> vega.NetworkParameter - 63, // 57: vega.NewAsset.changes:type_name -> vega.AssetDetails - 64, // 58: vega.UpdateAsset.changes:type_name -> vega.AssetDetailsUpdate - 15, // 59: vega.ProposalTerms.update_market:type_name -> vega.UpdateMarket - 14, // 60: vega.ProposalTerms.new_market:type_name -> vega.NewMarket - 23, // 61: vega.ProposalTerms.update_network_parameter:type_name -> vega.UpdateNetworkParameter - 24, // 62: vega.ProposalTerms.new_asset:type_name -> vega.NewAsset - 26, // 63: vega.ProposalTerms.new_freeform:type_name -> vega.NewFreeform - 25, // 64: vega.ProposalTerms.update_asset:type_name -> vega.UpdateAsset - 12, // 65: vega.ProposalTerms.new_spot_market:type_name -> vega.NewSpotMarket - 16, // 66: vega.ProposalTerms.update_spot_market:type_name -> vega.UpdateSpotMarket - 44, // 67: vega.ProposalTerms.new_transfer:type_name -> vega.NewTransfer - 42, // 68: vega.ProposalTerms.cancel_transfer:type_name -> vega.CancelTransfer - 40, // 69: vega.ProposalTerms.update_market_state:type_name -> vega.UpdateMarketState - 38, // 70: vega.ProposalTerms.update_referral_program:type_name -> vega.UpdateReferralProgram - 36, // 71: vega.ProposalTerms.update_volume_discount_program:type_name -> vega.UpdateVolumeDiscountProgram - 15, // 72: vega.BatchProposalTermsChange.update_market:type_name -> vega.UpdateMarket - 14, // 73: vega.BatchProposalTermsChange.new_market:type_name -> vega.NewMarket - 23, // 74: vega.BatchProposalTermsChange.update_network_parameter:type_name -> vega.UpdateNetworkParameter - 26, // 75: vega.BatchProposalTermsChange.new_freeform:type_name -> vega.NewFreeform - 25, // 76: vega.BatchProposalTermsChange.update_asset:type_name -> vega.UpdateAsset - 12, // 77: vega.BatchProposalTermsChange.new_spot_market:type_name -> vega.NewSpotMarket - 16, // 78: vega.BatchProposalTermsChange.update_spot_market:type_name -> vega.UpdateSpotMarket - 44, // 79: vega.BatchProposalTermsChange.new_transfer:type_name -> vega.NewTransfer - 42, // 80: vega.BatchProposalTermsChange.cancel_transfer:type_name -> vega.CancelTransfer - 40, // 81: vega.BatchProposalTermsChange.update_market_state:type_name -> vega.UpdateMarketState - 38, // 82: vega.BatchProposalTermsChange.update_referral_program:type_name -> vega.UpdateReferralProgram - 36, // 83: vega.BatchProposalTermsChange.update_volume_discount_program:type_name -> vega.UpdateVolumeDiscountProgram - 24, // 84: vega.BatchProposalTermsChange.new_asset:type_name -> vega.NewAsset - 29, // 85: vega.BatchProposalTerms.proposal_params:type_name -> vega.ProposalParameters - 28, // 86: vega.BatchProposalTerms.changes:type_name -> vega.BatchProposalTermsChange - 33, // 87: vega.GovernanceData.proposal:type_name -> vega.Proposal - 34, // 88: vega.GovernanceData.yes:type_name -> vega.Vote - 34, // 89: vega.GovernanceData.no:type_name -> vega.Vote - 48, // 90: vega.GovernanceData.yes_party:type_name -> vega.GovernanceData.YesPartyEntry - 49, // 91: vega.GovernanceData.no_party:type_name -> vega.GovernanceData.NoPartyEntry - 3, // 92: vega.GovernanceData.proposal_type:type_name -> vega.GovernanceData.Type - 33, // 93: vega.GovernanceData.proposals:type_name -> vega.Proposal - 4, // 94: vega.Proposal.state:type_name -> vega.Proposal.State - 27, // 95: vega.Proposal.terms:type_name -> vega.ProposalTerms - 0, // 96: vega.Proposal.reason:type_name -> vega.ProposalError - 31, // 97: vega.Proposal.rationale:type_name -> vega.ProposalRationale - 30, // 98: vega.Proposal.batch_terms:type_name -> vega.BatchProposalTerms - 5, // 99: vega.Vote.value:type_name -> vega.Vote.Value - 35, // 100: vega.Vote.els_per_market:type_name -> vega.VoteELSPair - 37, // 101: vega.UpdateVolumeDiscountProgram.changes:type_name -> vega.VolumeDiscountProgramChanges - 65, // 102: vega.VolumeDiscountProgramChanges.benefit_tiers:type_name -> vega.VolumeBenefitTier - 39, // 103: vega.UpdateReferralProgram.changes:type_name -> vega.ReferralProgramChanges - 66, // 104: vega.ReferralProgramChanges.benefit_tiers:type_name -> vega.BenefitTier - 67, // 105: vega.ReferralProgramChanges.staking_tiers:type_name -> vega.StakingTier - 41, // 106: vega.UpdateMarketState.changes:type_name -> vega.UpdateMarketStateConfiguration - 1, // 107: vega.UpdateMarketStateConfiguration.update_type:type_name -> vega.MarketStateUpdateType - 43, // 108: vega.CancelTransfer.changes:type_name -> vega.CancelTransferConfiguration - 45, // 109: vega.NewTransfer.changes:type_name -> vega.NewTransferConfiguration - 68, // 110: vega.NewTransferConfiguration.source_type:type_name -> vega.AccountType - 2, // 111: vega.NewTransferConfiguration.transfer_type:type_name -> vega.GovernanceTransferType - 68, // 112: vega.NewTransferConfiguration.destination_type:type_name -> vega.AccountType - 46, // 113: vega.NewTransferConfiguration.one_off:type_name -> vega.OneOffTransfer - 47, // 114: vega.NewTransferConfiguration.recurring:type_name -> vega.RecurringTransfer - 69, // 115: vega.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy - 34, // 116: vega.GovernanceData.YesPartyEntry.value:type_name -> vega.Vote - 34, // 117: vega.GovernanceData.NoPartyEntry.value:type_name -> vega.Vote - 118, // [118:118] is the sub-list for method output_type - 118, // [118:118] is the sub-list for method input_type - 118, // [118:118] is the sub-list for extension type_name - 118, // [118:118] is the sub-list for extension extendee - 0, // [0:118] is the sub-list for field type_name + 52, // 3: vega.FutureProduct.cap:type_name -> vega.FutureCap + 50, // 4: vega.PerpetualProduct.data_source_spec_for_settlement_schedule:type_name -> vega.DataSourceDefinition + 50, // 5: vega.PerpetualProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition + 53, // 6: vega.PerpetualProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToPerpetualBinding + 54, // 7: vega.PerpetualProduct.internal_composite_price_configuration:type_name -> vega.CompositePriceConfiguration + 7, // 8: vega.InstrumentConfiguration.future:type_name -> vega.FutureProduct + 6, // 9: vega.InstrumentConfiguration.spot:type_name -> vega.SpotProduct + 8, // 10: vega.InstrumentConfiguration.perpetual:type_name -> vega.PerpetualProduct + 9, // 11: vega.NewSpotMarketConfiguration.instrument:type_name -> vega.InstrumentConfiguration + 55, // 12: vega.NewSpotMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters + 56, // 13: vega.NewSpotMarketConfiguration.target_stake_parameters:type_name -> vega.TargetStakeParameters + 57, // 14: vega.NewSpotMarketConfiguration.simple:type_name -> vega.SimpleModelParams + 58, // 15: vega.NewSpotMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel + 59, // 16: vega.NewSpotMarketConfiguration.sla_params:type_name -> vega.LiquiditySLAParameters + 60, // 17: vega.NewSpotMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings + 9, // 18: vega.NewMarketConfiguration.instrument:type_name -> vega.InstrumentConfiguration + 55, // 19: vega.NewMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters + 61, // 20: vega.NewMarketConfiguration.liquidity_monitoring_parameters:type_name -> vega.LiquidityMonitoringParameters + 57, // 21: vega.NewMarketConfiguration.simple:type_name -> vega.SimpleModelParams + 58, // 22: vega.NewMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel + 13, // 23: vega.NewMarketConfiguration.successor:type_name -> vega.SuccessorConfiguration + 59, // 24: vega.NewMarketConfiguration.liquidity_sla_parameters:type_name -> vega.LiquiditySLAParameters + 60, // 25: vega.NewMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings + 62, // 26: vega.NewMarketConfiguration.liquidation_strategy:type_name -> vega.LiquidationStrategy + 54, // 27: vega.NewMarketConfiguration.mark_price_configuration:type_name -> vega.CompositePriceConfiguration + 10, // 28: vega.NewSpotMarket.changes:type_name -> vega.NewSpotMarketConfiguration + 11, // 29: vega.NewMarket.changes:type_name -> vega.NewMarketConfiguration + 17, // 30: vega.UpdateMarket.changes:type_name -> vega.UpdateMarketConfiguration + 18, // 31: vega.UpdateSpotMarket.changes:type_name -> vega.UpdateSpotMarketConfiguration + 20, // 32: vega.UpdateMarketConfiguration.instrument:type_name -> vega.UpdateInstrumentConfiguration + 55, // 33: vega.UpdateMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters + 61, // 34: vega.UpdateMarketConfiguration.liquidity_monitoring_parameters:type_name -> vega.LiquidityMonitoringParameters + 57, // 35: vega.UpdateMarketConfiguration.simple:type_name -> vega.SimpleModelParams + 58, // 36: vega.UpdateMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel + 59, // 37: vega.UpdateMarketConfiguration.liquidity_sla_parameters:type_name -> vega.LiquiditySLAParameters + 60, // 38: vega.UpdateMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings + 62, // 39: vega.UpdateMarketConfiguration.liquidation_strategy:type_name -> vega.LiquidationStrategy + 54, // 40: vega.UpdateMarketConfiguration.mark_price_configuration:type_name -> vega.CompositePriceConfiguration + 55, // 41: vega.UpdateSpotMarketConfiguration.price_monitoring_parameters:type_name -> vega.PriceMonitoringParameters + 56, // 42: vega.UpdateSpotMarketConfiguration.target_stake_parameters:type_name -> vega.TargetStakeParameters + 57, // 43: vega.UpdateSpotMarketConfiguration.simple:type_name -> vega.SimpleModelParams + 58, // 44: vega.UpdateSpotMarketConfiguration.log_normal:type_name -> vega.LogNormalRiskModel + 59, // 45: vega.UpdateSpotMarketConfiguration.sla_params:type_name -> vega.LiquiditySLAParameters + 60, // 46: vega.UpdateSpotMarketConfiguration.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings + 19, // 47: vega.UpdateSpotMarketConfiguration.instrument:type_name -> vega.UpdateSpotInstrumentConfiguration + 21, // 48: vega.UpdateInstrumentConfiguration.future:type_name -> vega.UpdateFutureProduct + 22, // 49: vega.UpdateInstrumentConfiguration.perpetual:type_name -> vega.UpdatePerpetualProduct + 50, // 50: vega.UpdateFutureProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition + 50, // 51: vega.UpdateFutureProduct.data_source_spec_for_trading_termination:type_name -> vega.DataSourceDefinition + 51, // 52: vega.UpdateFutureProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToFutureBinding + 50, // 53: vega.UpdatePerpetualProduct.data_source_spec_for_settlement_schedule:type_name -> vega.DataSourceDefinition + 50, // 54: vega.UpdatePerpetualProduct.data_source_spec_for_settlement_data:type_name -> vega.DataSourceDefinition + 53, // 55: vega.UpdatePerpetualProduct.data_source_spec_binding:type_name -> vega.DataSourceSpecToPerpetualBinding + 54, // 56: vega.UpdatePerpetualProduct.internal_composite_price_configuration:type_name -> vega.CompositePriceConfiguration + 63, // 57: vega.UpdateNetworkParameter.changes:type_name -> vega.NetworkParameter + 64, // 58: vega.NewAsset.changes:type_name -> vega.AssetDetails + 65, // 59: vega.UpdateAsset.changes:type_name -> vega.AssetDetailsUpdate + 15, // 60: vega.ProposalTerms.update_market:type_name -> vega.UpdateMarket + 14, // 61: vega.ProposalTerms.new_market:type_name -> vega.NewMarket + 23, // 62: vega.ProposalTerms.update_network_parameter:type_name -> vega.UpdateNetworkParameter + 24, // 63: vega.ProposalTerms.new_asset:type_name -> vega.NewAsset + 26, // 64: vega.ProposalTerms.new_freeform:type_name -> vega.NewFreeform + 25, // 65: vega.ProposalTerms.update_asset:type_name -> vega.UpdateAsset + 12, // 66: vega.ProposalTerms.new_spot_market:type_name -> vega.NewSpotMarket + 16, // 67: vega.ProposalTerms.update_spot_market:type_name -> vega.UpdateSpotMarket + 44, // 68: vega.ProposalTerms.new_transfer:type_name -> vega.NewTransfer + 42, // 69: vega.ProposalTerms.cancel_transfer:type_name -> vega.CancelTransfer + 40, // 70: vega.ProposalTerms.update_market_state:type_name -> vega.UpdateMarketState + 38, // 71: vega.ProposalTerms.update_referral_program:type_name -> vega.UpdateReferralProgram + 36, // 72: vega.ProposalTerms.update_volume_discount_program:type_name -> vega.UpdateVolumeDiscountProgram + 15, // 73: vega.BatchProposalTermsChange.update_market:type_name -> vega.UpdateMarket + 14, // 74: vega.BatchProposalTermsChange.new_market:type_name -> vega.NewMarket + 23, // 75: vega.BatchProposalTermsChange.update_network_parameter:type_name -> vega.UpdateNetworkParameter + 26, // 76: vega.BatchProposalTermsChange.new_freeform:type_name -> vega.NewFreeform + 25, // 77: vega.BatchProposalTermsChange.update_asset:type_name -> vega.UpdateAsset + 12, // 78: vega.BatchProposalTermsChange.new_spot_market:type_name -> vega.NewSpotMarket + 16, // 79: vega.BatchProposalTermsChange.update_spot_market:type_name -> vega.UpdateSpotMarket + 44, // 80: vega.BatchProposalTermsChange.new_transfer:type_name -> vega.NewTransfer + 42, // 81: vega.BatchProposalTermsChange.cancel_transfer:type_name -> vega.CancelTransfer + 40, // 82: vega.BatchProposalTermsChange.update_market_state:type_name -> vega.UpdateMarketState + 38, // 83: vega.BatchProposalTermsChange.update_referral_program:type_name -> vega.UpdateReferralProgram + 36, // 84: vega.BatchProposalTermsChange.update_volume_discount_program:type_name -> vega.UpdateVolumeDiscountProgram + 24, // 85: vega.BatchProposalTermsChange.new_asset:type_name -> vega.NewAsset + 29, // 86: vega.BatchProposalTerms.proposal_params:type_name -> vega.ProposalParameters + 28, // 87: vega.BatchProposalTerms.changes:type_name -> vega.BatchProposalTermsChange + 33, // 88: vega.GovernanceData.proposal:type_name -> vega.Proposal + 34, // 89: vega.GovernanceData.yes:type_name -> vega.Vote + 34, // 90: vega.GovernanceData.no:type_name -> vega.Vote + 48, // 91: vega.GovernanceData.yes_party:type_name -> vega.GovernanceData.YesPartyEntry + 49, // 92: vega.GovernanceData.no_party:type_name -> vega.GovernanceData.NoPartyEntry + 3, // 93: vega.GovernanceData.proposal_type:type_name -> vega.GovernanceData.Type + 33, // 94: vega.GovernanceData.proposals:type_name -> vega.Proposal + 4, // 95: vega.Proposal.state:type_name -> vega.Proposal.State + 27, // 96: vega.Proposal.terms:type_name -> vega.ProposalTerms + 0, // 97: vega.Proposal.reason:type_name -> vega.ProposalError + 31, // 98: vega.Proposal.rationale:type_name -> vega.ProposalRationale + 30, // 99: vega.Proposal.batch_terms:type_name -> vega.BatchProposalTerms + 5, // 100: vega.Vote.value:type_name -> vega.Vote.Value + 35, // 101: vega.Vote.els_per_market:type_name -> vega.VoteELSPair + 37, // 102: vega.UpdateVolumeDiscountProgram.changes:type_name -> vega.VolumeDiscountProgramChanges + 66, // 103: vega.VolumeDiscountProgramChanges.benefit_tiers:type_name -> vega.VolumeBenefitTier + 39, // 104: vega.UpdateReferralProgram.changes:type_name -> vega.ReferralProgramChanges + 67, // 105: vega.ReferralProgramChanges.benefit_tiers:type_name -> vega.BenefitTier + 68, // 106: vega.ReferralProgramChanges.staking_tiers:type_name -> vega.StakingTier + 41, // 107: vega.UpdateMarketState.changes:type_name -> vega.UpdateMarketStateConfiguration + 1, // 108: vega.UpdateMarketStateConfiguration.update_type:type_name -> vega.MarketStateUpdateType + 43, // 109: vega.CancelTransfer.changes:type_name -> vega.CancelTransferConfiguration + 45, // 110: vega.NewTransfer.changes:type_name -> vega.NewTransferConfiguration + 69, // 111: vega.NewTransferConfiguration.source_type:type_name -> vega.AccountType + 2, // 112: vega.NewTransferConfiguration.transfer_type:type_name -> vega.GovernanceTransferType + 69, // 113: vega.NewTransferConfiguration.destination_type:type_name -> vega.AccountType + 46, // 114: vega.NewTransferConfiguration.one_off:type_name -> vega.OneOffTransfer + 47, // 115: vega.NewTransferConfiguration.recurring:type_name -> vega.RecurringTransfer + 70, // 116: vega.RecurringTransfer.dispatch_strategy:type_name -> vega.DispatchStrategy + 34, // 117: vega.GovernanceData.YesPartyEntry.value:type_name -> vega.Vote + 34, // 118: vega.GovernanceData.NoPartyEntry.value:type_name -> vega.Vote + 119, // [119:119] is the sub-list for method output_type + 119, // [119:119] is the sub-list for method input_type + 119, // [119:119] is the sub-list for extension type_name + 119, // [119:119] is the sub-list for extension extendee + 0, // [0:119] is the sub-list for field type_name } func init() { file_vega_governance_proto_init() } @@ -6457,6 +6535,7 @@ func file_vega_governance_proto_init() { } } } + file_vega_governance_proto_msgTypes[1].OneofWrappers = []interface{}{} file_vega_governance_proto_msgTypes[2].OneofWrappers = []interface{}{} file_vega_governance_proto_msgTypes[3].OneofWrappers = []interface{}{ (*InstrumentConfiguration_Future)(nil), diff --git a/protos/vega/markets.pb.go b/protos/vega/markets.pb.go index 880f8d2fd6b..e94412452a1 100644 --- a/protos/vega/markets.pb.go +++ b/protos/vega/markets.pb.go @@ -127,7 +127,7 @@ func (x LiquidityFeeSettings_Method) Number() protoreflect.EnumNumber { // Deprecated: Use LiquidityFeeSettings_Method.Descriptor instead. func (LiquidityFeeSettings_Method) EnumDescriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{22, 0} + return file_vega_markets_proto_rawDescGZIP(), []int{24, 0} } // Current state of the market @@ -214,7 +214,7 @@ func (x Market_State) Number() protoreflect.EnumNumber { // Deprecated: Use Market_State.Descriptor instead. func (Market_State) EnumDescriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{24, 0} + return file_vega_markets_proto_rawDescGZIP(), []int{26, 0} } // Trading mode the market is currently running, also referred to as 'market state' @@ -235,6 +235,8 @@ const ( Market_TRADING_MODE_NO_TRADING Market_TradingMode = 5 // Special auction mode triggered via governance Market_TRADING_MODE_SUSPENDED_VIA_GOVERNANCE Market_TradingMode = 6 + // Auction triggered globally by long block + Market_TRADING_MODE_LONG_BLOCK_AUCTION Market_TradingMode = 7 ) // Enum value maps for Market_TradingMode. @@ -247,6 +249,7 @@ var ( 4: "TRADING_MODE_MONITORING_AUCTION", 5: "TRADING_MODE_NO_TRADING", 6: "TRADING_MODE_SUSPENDED_VIA_GOVERNANCE", + 7: "TRADING_MODE_LONG_BLOCK_AUCTION", } Market_TradingMode_value = map[string]int32{ "TRADING_MODE_UNSPECIFIED": 0, @@ -256,6 +259,7 @@ var ( "TRADING_MODE_MONITORING_AUCTION": 4, "TRADING_MODE_NO_TRADING": 5, "TRADING_MODE_SUSPENDED_VIA_GOVERNANCE": 6, + "TRADING_MODE_LONG_BLOCK_AUCTION": 7, } ) @@ -283,7 +287,7 @@ func (x Market_TradingMode) Number() protoreflect.EnumNumber { // Deprecated: Use Market_TradingMode.Descriptor instead. func (Market_TradingMode) EnumDescriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{24, 1} + return file_vega_markets_proto_rawDescGZIP(), []int{26, 1} } // Auction duration is used to configure 3 auction periods: @@ -424,6 +428,8 @@ type Future struct { DataSourceSpecForTradingTermination *DataSourceSpec `protobuf:"bytes,4,opt,name=data_source_spec_for_trading_termination,json=dataSourceSpecForTradingTermination,proto3" json:"data_source_spec_for_trading_termination,omitempty"` // Binding between the data spec and the data source. DataSourceSpecBinding *DataSourceSpecToFutureBinding `protobuf:"bytes,5,opt,name=data_source_spec_binding,json=dataSourceSpecBinding,proto3" json:"data_source_spec_binding,omitempty"` + // If set, this product represents a capped future market. + Cap *FutureCap `protobuf:"bytes,6,opt,name=cap,proto3,oneof" json:"cap,omitempty"` } func (x *Future) Reset() { @@ -493,6 +499,79 @@ func (x *Future) GetDataSourceSpecBinding() *DataSourceSpecToFutureBinding { return nil } +func (x *Future) GetCap() *FutureCap { + if x != nil { + return x.Cap + } + return nil +} + +type FutureCap struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Set the maximum price for orders, and settlement data in market decimals. + MaxPrice string `protobuf:"bytes,1,opt,name=max_price,json=maxPrice,proto3" json:"max_price,omitempty"` + // If set to true, the settlement price must either be zero, or equal to the max price. + BinarySettlement *bool `protobuf:"varint,2,opt,name=binary_settlement,json=binarySettlement,proto3,oneof" json:"binary_settlement,omitempty"` + // If set to true, positions must be fully collateralised so there is no default risk for any party. + FullyCollateralised *bool `protobuf:"varint,3,opt,name=fully_collateralised,json=fullyCollateralised,proto3,oneof" json:"fully_collateralised,omitempty"` +} + +func (x *FutureCap) Reset() { + *x = FutureCap{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_markets_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FutureCap) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FutureCap) ProtoMessage() {} + +func (x *FutureCap) ProtoReflect() protoreflect.Message { + mi := &file_vega_markets_proto_msgTypes[3] + 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 FutureCap.ProtoReflect.Descriptor instead. +func (*FutureCap) Descriptor() ([]byte, []int) { + return file_vega_markets_proto_rawDescGZIP(), []int{3} +} + +func (x *FutureCap) GetMaxPrice() string { + if x != nil { + return x.MaxPrice + } + return "" +} + +func (x *FutureCap) GetBinarySettlement() bool { + if x != nil && x.BinarySettlement != nil { + return *x.BinarySettlement + } + return false +} + +func (x *FutureCap) GetFullyCollateralised() bool { + if x != nil && x.FullyCollateralised != nil { + return *x.FullyCollateralised + } + return false +} + // Perpetual product definition type Perpetual struct { state protoimpl.MessageState @@ -530,7 +609,7 @@ type Perpetual struct { func (x *Perpetual) Reset() { *x = Perpetual{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[3] + mi := &file_vega_markets_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -543,7 +622,7 @@ func (x *Perpetual) String() string { func (*Perpetual) ProtoMessage() {} func (x *Perpetual) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[3] + mi := &file_vega_markets_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -556,7 +635,7 @@ func (x *Perpetual) ProtoReflect() protoreflect.Message { // Deprecated: Use Perpetual.ProtoReflect.Descriptor instead. func (*Perpetual) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{3} + return file_vega_markets_proto_rawDescGZIP(), []int{4} } func (x *Perpetual) GetSettlementAsset() string { @@ -668,7 +747,7 @@ type DataSourceSpecToFutureBinding struct { func (x *DataSourceSpecToFutureBinding) Reset() { *x = DataSourceSpecToFutureBinding{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[4] + mi := &file_vega_markets_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -681,7 +760,7 @@ func (x *DataSourceSpecToFutureBinding) String() string { func (*DataSourceSpecToFutureBinding) ProtoMessage() {} func (x *DataSourceSpecToFutureBinding) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[4] + mi := &file_vega_markets_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -694,7 +773,7 @@ func (x *DataSourceSpecToFutureBinding) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceSpecToFutureBinding.ProtoReflect.Descriptor instead. func (*DataSourceSpecToFutureBinding) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{4} + return file_vega_markets_proto_rawDescGZIP(), []int{5} } func (x *DataSourceSpecToFutureBinding) GetSettlementDataProperty() string { @@ -729,7 +808,7 @@ type DataSourceSpecToPerpetualBinding struct { func (x *DataSourceSpecToPerpetualBinding) Reset() { *x = DataSourceSpecToPerpetualBinding{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[5] + mi := &file_vega_markets_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -742,7 +821,7 @@ func (x *DataSourceSpecToPerpetualBinding) String() string { func (*DataSourceSpecToPerpetualBinding) ProtoMessage() {} func (x *DataSourceSpecToPerpetualBinding) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[5] + mi := &file_vega_markets_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -755,7 +834,7 @@ func (x *DataSourceSpecToPerpetualBinding) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceSpecToPerpetualBinding.ProtoReflect.Descriptor instead. func (*DataSourceSpecToPerpetualBinding) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{5} + return file_vega_markets_proto_rawDescGZIP(), []int{6} } func (x *DataSourceSpecToPerpetualBinding) GetSettlementDataProperty() string { @@ -785,7 +864,7 @@ type InstrumentMetadata struct { func (x *InstrumentMetadata) Reset() { *x = InstrumentMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[6] + mi := &file_vega_markets_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -798,7 +877,7 @@ func (x *InstrumentMetadata) String() string { func (*InstrumentMetadata) ProtoMessage() {} func (x *InstrumentMetadata) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[6] + mi := &file_vega_markets_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -811,7 +890,7 @@ func (x *InstrumentMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use InstrumentMetadata.ProtoReflect.Descriptor instead. func (*InstrumentMetadata) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{6} + return file_vega_markets_proto_rawDescGZIP(), []int{7} } func (x *InstrumentMetadata) GetTags() []string { @@ -848,7 +927,7 @@ type Instrument struct { func (x *Instrument) Reset() { *x = Instrument{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[7] + mi := &file_vega_markets_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -861,7 +940,7 @@ func (x *Instrument) String() string { func (*Instrument) ProtoMessage() {} func (x *Instrument) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[7] + mi := &file_vega_markets_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -874,7 +953,7 @@ func (x *Instrument) ProtoReflect() protoreflect.Message { // Deprecated: Use Instrument.ProtoReflect.Descriptor instead. func (*Instrument) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{7} + return file_vega_markets_proto_rawDescGZIP(), []int{8} } func (x *Instrument) GetId() string { @@ -971,12 +1050,14 @@ type LogNormalRiskModel struct { Tau float64 `protobuf:"fixed64,2,opt,name=tau,proto3" json:"tau,omitempty"` // Risk model parameters for log normal. Params *LogNormalModelParams `protobuf:"bytes,3,opt,name=params,proto3" json:"params,omitempty"` + // And optional override for the risk factor calculated by the risk model. + RiskFactorOverride *RiskFactorOverride `protobuf:"bytes,4,opt,name=risk_factor_override,json=riskFactorOverride,proto3,oneof" json:"risk_factor_override,omitempty"` } func (x *LogNormalRiskModel) Reset() { *x = LogNormalRiskModel{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[8] + mi := &file_vega_markets_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -989,7 +1070,7 @@ func (x *LogNormalRiskModel) String() string { func (*LogNormalRiskModel) ProtoMessage() {} func (x *LogNormalRiskModel) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[8] + mi := &file_vega_markets_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1002,7 +1083,7 @@ func (x *LogNormalRiskModel) ProtoReflect() protoreflect.Message { // Deprecated: Use LogNormalRiskModel.ProtoReflect.Descriptor instead. func (*LogNormalRiskModel) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{8} + return file_vega_markets_proto_rawDescGZIP(), []int{9} } func (x *LogNormalRiskModel) GetRiskAversionParameter() float64 { @@ -1026,6 +1107,71 @@ func (x *LogNormalRiskModel) GetParams() *LogNormalModelParams { return nil } +func (x *LogNormalRiskModel) GetRiskFactorOverride() *RiskFactorOverride { + if x != nil { + return x.RiskFactorOverride + } + return nil +} + +// Risk factor override to control stable leverage +type RiskFactorOverride struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Short Risk factor value. + Short string `protobuf:"bytes,1,opt,name=short,proto3" json:"short,omitempty"` + // Long Risk factor value. + Long string `protobuf:"bytes,2,opt,name=long,proto3" json:"long,omitempty"` +} + +func (x *RiskFactorOverride) Reset() { + *x = RiskFactorOverride{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_markets_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RiskFactorOverride) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RiskFactorOverride) ProtoMessage() {} + +func (x *RiskFactorOverride) ProtoReflect() protoreflect.Message { + mi := &file_vega_markets_proto_msgTypes[10] + 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 RiskFactorOverride.ProtoReflect.Descriptor instead. +func (*RiskFactorOverride) Descriptor() ([]byte, []int) { + return file_vega_markets_proto_rawDescGZIP(), []int{10} +} + +func (x *RiskFactorOverride) GetShort() string { + if x != nil { + return x.Short + } + return "" +} + +func (x *RiskFactorOverride) GetLong() string { + if x != nil { + return x.Long + } + return "" +} + // Risk model parameters for log normal type LogNormalModelParams struct { state protoimpl.MessageState @@ -1043,7 +1189,7 @@ type LogNormalModelParams struct { func (x *LogNormalModelParams) Reset() { *x = LogNormalModelParams{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[9] + mi := &file_vega_markets_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1056,7 +1202,7 @@ func (x *LogNormalModelParams) String() string { func (*LogNormalModelParams) ProtoMessage() {} func (x *LogNormalModelParams) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[9] + mi := &file_vega_markets_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1069,7 +1215,7 @@ func (x *LogNormalModelParams) ProtoReflect() protoreflect.Message { // Deprecated: Use LogNormalModelParams.ProtoReflect.Descriptor instead. func (*LogNormalModelParams) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{9} + return file_vega_markets_proto_rawDescGZIP(), []int{11} } func (x *LogNormalModelParams) GetMu() float64 { @@ -1106,7 +1252,7 @@ type SimpleRiskModel struct { func (x *SimpleRiskModel) Reset() { *x = SimpleRiskModel{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[10] + mi := &file_vega_markets_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1119,7 +1265,7 @@ func (x *SimpleRiskModel) String() string { func (*SimpleRiskModel) ProtoMessage() {} func (x *SimpleRiskModel) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[10] + mi := &file_vega_markets_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1132,7 +1278,7 @@ func (x *SimpleRiskModel) ProtoReflect() protoreflect.Message { // Deprecated: Use SimpleRiskModel.ProtoReflect.Descriptor instead. func (*SimpleRiskModel) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{10} + return file_vega_markets_proto_rawDescGZIP(), []int{12} } func (x *SimpleRiskModel) GetParams() *SimpleModelParams { @@ -1163,7 +1309,7 @@ type SimpleModelParams struct { func (x *SimpleModelParams) Reset() { *x = SimpleModelParams{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[11] + mi := &file_vega_markets_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1176,7 +1322,7 @@ func (x *SimpleModelParams) String() string { func (*SimpleModelParams) ProtoMessage() {} func (x *SimpleModelParams) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[11] + mi := &file_vega_markets_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1189,7 +1335,7 @@ func (x *SimpleModelParams) ProtoReflect() protoreflect.Message { // Deprecated: Use SimpleModelParams.ProtoReflect.Descriptor instead. func (*SimpleModelParams) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{11} + return file_vega_markets_proto_rawDescGZIP(), []int{13} } func (x *SimpleModelParams) GetFactorLong() float64 { @@ -1248,7 +1394,7 @@ type ScalingFactors struct { func (x *ScalingFactors) Reset() { *x = ScalingFactors{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[12] + mi := &file_vega_markets_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1261,7 +1407,7 @@ func (x *ScalingFactors) String() string { func (*ScalingFactors) ProtoMessage() {} func (x *ScalingFactors) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[12] + mi := &file_vega_markets_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1274,7 +1420,7 @@ func (x *ScalingFactors) ProtoReflect() protoreflect.Message { // Deprecated: Use ScalingFactors.ProtoReflect.Descriptor instead. func (*ScalingFactors) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{12} + return file_vega_markets_proto_rawDescGZIP(), []int{14} } func (x *ScalingFactors) GetSearchLevel() float64 { @@ -1306,12 +1452,14 @@ type MarginCalculator struct { // Scaling factors for margin calculation. ScalingFactors *ScalingFactors `protobuf:"bytes,1,opt,name=scaling_factors,json=scalingFactors,proto3" json:"scaling_factors,omitempty"` + // If set to true, positions must be fully collateralised so there is no default risk for any party (capped futures). + FullyCollateralised *bool `protobuf:"varint,2,opt,name=fully_collateralised,json=fullyCollateralised,proto3,oneof" json:"fully_collateralised,omitempty"` } func (x *MarginCalculator) Reset() { *x = MarginCalculator{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[13] + mi := &file_vega_markets_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1324,7 +1472,7 @@ func (x *MarginCalculator) String() string { func (*MarginCalculator) ProtoMessage() {} func (x *MarginCalculator) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[13] + mi := &file_vega_markets_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1337,7 +1485,7 @@ func (x *MarginCalculator) ProtoReflect() protoreflect.Message { // Deprecated: Use MarginCalculator.ProtoReflect.Descriptor instead. func (*MarginCalculator) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{13} + return file_vega_markets_proto_rawDescGZIP(), []int{15} } func (x *MarginCalculator) GetScalingFactors() *ScalingFactors { @@ -1347,6 +1495,13 @@ func (x *MarginCalculator) GetScalingFactors() *ScalingFactors { return nil } +func (x *MarginCalculator) GetFullyCollateralised() bool { + if x != nil && x.FullyCollateralised != nil { + return *x.FullyCollateralised + } + return false +} + // Tradable Instrument definition type TradableInstrument struct { state protoimpl.MessageState @@ -1369,7 +1524,7 @@ type TradableInstrument struct { func (x *TradableInstrument) Reset() { *x = TradableInstrument{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[14] + mi := &file_vega_markets_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1382,7 +1537,7 @@ func (x *TradableInstrument) String() string { func (*TradableInstrument) ProtoMessage() {} func (x *TradableInstrument) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[14] + mi := &file_vega_markets_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1395,7 +1550,7 @@ func (x *TradableInstrument) ProtoReflect() protoreflect.Message { // Deprecated: Use TradableInstrument.ProtoReflect.Descriptor instead. func (*TradableInstrument) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{14} + return file_vega_markets_proto_rawDescGZIP(), []int{16} } func (x *TradableInstrument) GetInstrument() *Instrument { @@ -1468,7 +1623,7 @@ type FeeFactors struct { func (x *FeeFactors) Reset() { *x = FeeFactors{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[15] + mi := &file_vega_markets_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1481,7 +1636,7 @@ func (x *FeeFactors) String() string { func (*FeeFactors) ProtoMessage() {} func (x *FeeFactors) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[15] + mi := &file_vega_markets_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1494,7 +1649,7 @@ func (x *FeeFactors) ProtoReflect() protoreflect.Message { // Deprecated: Use FeeFactors.ProtoReflect.Descriptor instead. func (*FeeFactors) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{15} + return file_vega_markets_proto_rawDescGZIP(), []int{17} } func (x *FeeFactors) GetMakerFee() string { @@ -1533,7 +1688,7 @@ type Fees struct { func (x *Fees) Reset() { *x = Fees{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[16] + mi := &file_vega_markets_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1546,7 +1701,7 @@ func (x *Fees) String() string { func (*Fees) ProtoMessage() {} func (x *Fees) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[16] + mi := &file_vega_markets_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1559,7 +1714,7 @@ func (x *Fees) ProtoReflect() protoreflect.Message { // Deprecated: Use Fees.ProtoReflect.Descriptor instead. func (*Fees) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{16} + return file_vega_markets_proto_rawDescGZIP(), []int{18} } func (x *Fees) GetFactors() *FeeFactors { @@ -1595,7 +1750,7 @@ type PriceMonitoringTrigger struct { func (x *PriceMonitoringTrigger) Reset() { *x = PriceMonitoringTrigger{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[17] + mi := &file_vega_markets_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1608,7 +1763,7 @@ func (x *PriceMonitoringTrigger) String() string { func (*PriceMonitoringTrigger) ProtoMessage() {} func (x *PriceMonitoringTrigger) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[17] + mi := &file_vega_markets_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1621,7 +1776,7 @@ func (x *PriceMonitoringTrigger) ProtoReflect() protoreflect.Message { // Deprecated: Use PriceMonitoringTrigger.ProtoReflect.Descriptor instead. func (*PriceMonitoringTrigger) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{17} + return file_vega_markets_proto_rawDescGZIP(), []int{19} } func (x *PriceMonitoringTrigger) GetHorizon() int64 { @@ -1657,7 +1812,7 @@ type PriceMonitoringParameters struct { func (x *PriceMonitoringParameters) Reset() { *x = PriceMonitoringParameters{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[18] + mi := &file_vega_markets_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1670,7 +1825,7 @@ func (x *PriceMonitoringParameters) String() string { func (*PriceMonitoringParameters) ProtoMessage() {} func (x *PriceMonitoringParameters) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[18] + mi := &file_vega_markets_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1683,7 +1838,7 @@ func (x *PriceMonitoringParameters) ProtoReflect() protoreflect.Message { // Deprecated: Use PriceMonitoringParameters.ProtoReflect.Descriptor instead. func (*PriceMonitoringParameters) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{18} + return file_vega_markets_proto_rawDescGZIP(), []int{20} } func (x *PriceMonitoringParameters) GetTriggers() []*PriceMonitoringTrigger { @@ -1706,7 +1861,7 @@ type PriceMonitoringSettings struct { func (x *PriceMonitoringSettings) Reset() { *x = PriceMonitoringSettings{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[19] + mi := &file_vega_markets_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1719,7 +1874,7 @@ func (x *PriceMonitoringSettings) String() string { func (*PriceMonitoringSettings) ProtoMessage() {} func (x *PriceMonitoringSettings) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[19] + mi := &file_vega_markets_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1732,7 +1887,7 @@ func (x *PriceMonitoringSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use PriceMonitoringSettings.ProtoReflect.Descriptor instead. func (*PriceMonitoringSettings) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{19} + return file_vega_markets_proto_rawDescGZIP(), []int{21} } func (x *PriceMonitoringSettings) GetParameters() *PriceMonitoringParameters { @@ -1759,7 +1914,7 @@ type LiquidityMonitoringParameters struct { func (x *LiquidityMonitoringParameters) Reset() { *x = LiquidityMonitoringParameters{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[20] + mi := &file_vega_markets_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1772,7 +1927,7 @@ func (x *LiquidityMonitoringParameters) String() string { func (*LiquidityMonitoringParameters) ProtoMessage() {} func (x *LiquidityMonitoringParameters) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[20] + mi := &file_vega_markets_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1785,7 +1940,7 @@ func (x *LiquidityMonitoringParameters) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityMonitoringParameters.ProtoReflect.Descriptor instead. func (*LiquidityMonitoringParameters) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{20} + return file_vega_markets_proto_rawDescGZIP(), []int{22} } func (x *LiquidityMonitoringParameters) GetTargetStakeParameters() *TargetStakeParameters { @@ -1827,7 +1982,7 @@ type LiquiditySLAParameters struct { func (x *LiquiditySLAParameters) Reset() { *x = LiquiditySLAParameters{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[21] + mi := &file_vega_markets_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1840,7 +1995,7 @@ func (x *LiquiditySLAParameters) String() string { func (*LiquiditySLAParameters) ProtoMessage() {} func (x *LiquiditySLAParameters) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[21] + mi := &file_vega_markets_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1853,7 +2008,7 @@ func (x *LiquiditySLAParameters) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquiditySLAParameters.ProtoReflect.Descriptor instead. func (*LiquiditySLAParameters) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{21} + return file_vega_markets_proto_rawDescGZIP(), []int{23} } func (x *LiquiditySLAParameters) GetPriceRange() string { @@ -1899,7 +2054,7 @@ type LiquidityFeeSettings struct { func (x *LiquidityFeeSettings) Reset() { *x = LiquidityFeeSettings{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[22] + mi := &file_vega_markets_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1912,7 +2067,7 @@ func (x *LiquidityFeeSettings) String() string { func (*LiquidityFeeSettings) ProtoMessage() {} func (x *LiquidityFeeSettings) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[22] + mi := &file_vega_markets_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1925,7 +2080,7 @@ func (x *LiquidityFeeSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidityFeeSettings.ProtoReflect.Descriptor instead. func (*LiquidityFeeSettings) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{22} + return file_vega_markets_proto_rawDescGZIP(), []int{24} } func (x *LiquidityFeeSettings) GetMethod() LiquidityFeeSettings_Method { @@ -1957,7 +2112,7 @@ type TargetStakeParameters struct { func (x *TargetStakeParameters) Reset() { *x = TargetStakeParameters{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[23] + mi := &file_vega_markets_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1970,7 +2125,7 @@ func (x *TargetStakeParameters) String() string { func (*TargetStakeParameters) ProtoMessage() {} func (x *TargetStakeParameters) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[23] + mi := &file_vega_markets_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1983,7 +2138,7 @@ func (x *TargetStakeParameters) ProtoReflect() protoreflect.Message { // Deprecated: Use TargetStakeParameters.ProtoReflect.Descriptor instead. func (*TargetStakeParameters) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{23} + return file_vega_markets_proto_rawDescGZIP(), []int{25} } func (x *TargetStakeParameters) GetTimeWindow() int64 { @@ -2053,12 +2208,14 @@ type Market struct { MarkPriceConfiguration *CompositePriceConfiguration `protobuf:"bytes,20,opt,name=mark_price_configuration,json=markPriceConfiguration,proto3" json:"mark_price_configuration,omitempty"` // The market tick size defines the minimum change in quote price for the market TickSize string `protobuf:"bytes,21,opt,name=tick_size,json=tickSize,proto3" json:"tick_size,omitempty"` + // If enabled aggressive orders sent to the market will be delayed by the configured number of blocks + EnableTransactionReordering bool `protobuf:"varint,22,opt,name=enable_transaction_reordering,json=enableTransactionReordering,proto3" json:"enable_transaction_reordering,omitempty"` } func (x *Market) Reset() { *x = Market{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[24] + mi := &file_vega_markets_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2071,7 +2228,7 @@ func (x *Market) String() string { func (*Market) ProtoMessage() {} func (x *Market) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[24] + mi := &file_vega_markets_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2084,7 +2241,7 @@ func (x *Market) ProtoReflect() protoreflect.Message { // Deprecated: Use Market.ProtoReflect.Descriptor instead. func (*Market) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{24} + return file_vega_markets_proto_rawDescGZIP(), []int{26} } func (x *Market) GetId() string { @@ -2234,6 +2391,13 @@ func (x *Market) GetTickSize() string { return "" } +func (x *Market) GetEnableTransactionReordering() bool { + if x != nil { + return x.EnableTransactionReordering + } + return false +} + // Time stamps for important times about creating, enacting etc the market type MarketTimestamps struct { state protoimpl.MessageState @@ -2253,7 +2417,7 @@ type MarketTimestamps struct { func (x *MarketTimestamps) Reset() { *x = MarketTimestamps{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[25] + mi := &file_vega_markets_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2266,7 +2430,7 @@ func (x *MarketTimestamps) String() string { func (*MarketTimestamps) ProtoMessage() {} func (x *MarketTimestamps) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[25] + mi := &file_vega_markets_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2279,7 +2443,7 @@ func (x *MarketTimestamps) ProtoReflect() protoreflect.Message { // Deprecated: Use MarketTimestamps.ProtoReflect.Descriptor instead. func (*MarketTimestamps) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{25} + return file_vega_markets_proto_rawDescGZIP(), []int{27} } func (x *MarketTimestamps) GetProposed() int64 { @@ -2332,7 +2496,7 @@ type LiquidationStrategy struct { func (x *LiquidationStrategy) Reset() { *x = LiquidationStrategy{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[26] + mi := &file_vega_markets_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2345,7 +2509,7 @@ func (x *LiquidationStrategy) String() string { func (*LiquidationStrategy) ProtoMessage() {} func (x *LiquidationStrategy) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[26] + mi := &file_vega_markets_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2358,7 +2522,7 @@ func (x *LiquidationStrategy) ProtoReflect() protoreflect.Message { // Deprecated: Use LiquidationStrategy.ProtoReflect.Descriptor instead. func (*LiquidationStrategy) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{26} + return file_vega_markets_proto_rawDescGZIP(), []int{28} } func (x *LiquidationStrategy) GetDisposalTimeStep() int64 { @@ -2425,7 +2589,7 @@ type CompositePriceConfiguration struct { func (x *CompositePriceConfiguration) Reset() { *x = CompositePriceConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_vega_markets_proto_msgTypes[27] + mi := &file_vega_markets_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2438,7 +2602,7 @@ func (x *CompositePriceConfiguration) String() string { func (*CompositePriceConfiguration) ProtoMessage() {} func (x *CompositePriceConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_vega_markets_proto_msgTypes[27] + mi := &file_vega_markets_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2451,7 +2615,7 @@ func (x *CompositePriceConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use CompositePriceConfiguration.ProtoReflect.Descriptor instead. func (*CompositePriceConfiguration) Descriptor() ([]byte, []int) { - return file_vega_markets_proto_rawDescGZIP(), []int{27} + return file_vega_markets_proto_rawDescGZIP(), []int{29} } func (x *CompositePriceConfiguration) GetDecayWeight() string { @@ -2525,7 +2689,7 @@ var file_vega_markets_proto_rawDesc = []byte{ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x61, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x22, 0x82, 0x03, 0x0a, 0x06, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x12, 0x29, 0x0a, 0x10, + 0x74, 0x22, 0xb2, 0x03, 0x0a, 0x06, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, @@ -2549,154 +2713,185 @@ var file_vega_markets_proto_rawDesc = []byte{ 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x15, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x42, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x22, 0xe6, 0x07, 0x0a, 0x09, 0x50, 0x65, 0x72, 0x70, 0x65, - 0x74, 0x75, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, - 0x0a, 0x15, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x5f, 0x72, - 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6c, 0x61, 0x6d, 0x70, - 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x70, 0x70, - 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, - 0x6b, 0x0a, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x23, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x63, 0x0a, 0x24, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, - 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x1f, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x46, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x5f, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x50, 0x65, 0x72, 0x70, 0x65, - 0x74, 0x75, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x15, 0x64, 0x61, 0x74, - 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x1b, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x18, 0x66, 0x75, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x03, 0x63, 0x61, 0x70, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, 0x75, 0x74, 0x75, 0x72, + 0x65, 0x43, 0x61, 0x70, 0x48, 0x00, 0x52, 0x03, 0x63, 0x61, 0x70, 0x88, 0x01, 0x01, 0x42, 0x06, + 0x0a, 0x04, 0x5f, 0x63, 0x61, 0x70, 0x22, 0xc1, 0x01, 0x0a, 0x09, 0x46, 0x75, 0x74, 0x75, 0x72, + 0x65, 0x43, 0x61, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x12, 0x30, 0x0a, 0x11, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x10, + 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x14, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6c, + 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x01, 0x52, 0x13, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, + 0x65, 0x72, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, + 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x22, 0xe6, 0x07, 0x0a, 0x09, 0x50, + 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x73, 0x65, 0x74, 0x74, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, + 0x73, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x52, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x63, + 0x6c, 0x61, 0x6d, 0x70, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x4c, 0x6f, 0x77, + 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6c, 0x61, 0x6d, 0x70, + 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x12, 0x6b, 0x0a, 0x28, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x23, 0x64, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x53, 0x65, + 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x12, 0x63, 0x0a, 0x24, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x73, 0x70, 0x65, 0x63, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x1f, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x70, 0x65, 0x63, 0x46, 0x6f, 0x72, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x50, + 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, + 0x15, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x1b, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x18, 0x66, + 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, + 0x67, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x66, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, + 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x15, + 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x77, 0x65, 0x72, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x66, 0x75, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x15, 0x66, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, + 0x75, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1f, 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, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0d, 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, 0x48, 0x03, 0x52, 0x1c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x88, 0x01, 0x01, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x15, 0x66, 0x75, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x18, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x72, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x15, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x6d, 0x0a, 0x1f, 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, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0d, 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, 0x48, 0x03, - 0x52, 0x1c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, - 0x01, 0x42, 0x1e, 0x0a, 0x1c, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x1b, - 0x0a, 0x19, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, - 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, 0x22, 0x0a, 0x20, 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, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, - 0x9b, 0x01, 0x0a, 0x1d, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, - 0x65, 0x63, 0x54, 0x6f, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x16, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x1c, 0x74, - 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1a, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x22, 0x9e, 0x01, - 0x0a, 0x20, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x54, 0x6f, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x40, 0x0a, 0x1c, - 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x1a, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x22, 0x28, - 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x49, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x34, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, 0x75, 0x74, - 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x12, 0x20, 0x0a, - 0x04, 0x73, 0x70, 0x6f, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x53, 0x70, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x70, 0x6f, 0x74, 0x12, - 0x2f, 0x0a, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x18, 0x66, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, - 0x75, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, - 0x42, 0x09, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, 0x92, 0x01, 0x0a, 0x12, - 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x15, 0x72, 0x69, 0x73, 0x6b, 0x41, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, - 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x74, 0x61, 0x75, 0x12, 0x32, 0x0a, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x22, 0x4a, 0x0a, 0x14, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6d, 0x75, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x02, 0x6d, 0x75, 0x12, 0x0c, 0x0a, 0x01, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x01, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x22, 0x42, 0x0a, 0x0f, - 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, - 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x22, 0xd1, 0x01, 0x0a, 0x11, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, - 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x66, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x4c, 0x6f, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x66, - 0x61, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x09, 0x6d, 0x61, 0x78, 0x4d, 0x6f, 0x76, 0x65, 0x55, 0x70, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x69, - 0x6e, 0x5f, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x12, 0x34, - 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6f, 0x66, - 0x5f, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, - 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4f, 0x66, 0x54, 0x72, 0x61, - 0x64, 0x69, 0x6e, 0x67, 0x22, 0x89, 0x01, 0x0a, 0x0e, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, - 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x73, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x0d, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, - 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x22, 0x51, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x3d, 0x0a, 0x0f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, - 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x22, 0xad, 0x02, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, + 0x6e, 0x64, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x42, + 0x22, 0x0a, 0x20, 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, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x22, 0x9b, 0x01, 0x0a, 0x1d, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x42, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, + 0x40, 0x0a, 0x1c, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x22, 0x9e, 0x01, 0x0a, 0x20, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x42, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x38, 0x0a, 0x18, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x12, 0x40, 0x0a, 0x1c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x22, 0x28, 0x0a, 0x12, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x80, 0x02, 0x0a, + 0x0a, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x06, 0x66, 0x75, 0x74, + 0x75, 0x72, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x46, 0x75, 0x74, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x06, 0x66, 0x75, 0x74, 0x75, 0x72, + 0x65, 0x12, 0x20, 0x0a, 0x04, 0x73, 0x70, 0x6f, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x70, 0x6f, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, + 0x70, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, + 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x65, + 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x70, 0x65, 0x72, 0x70, 0x65, + 0x74, 0x75, 0x61, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x22, + 0xfc, 0x01, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x52, 0x69, 0x73, + 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x61, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x72, 0x69, 0x73, 0x6b, 0x41, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x10, + 0x0a, 0x03, 0x74, 0x61, 0x75, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x03, 0x74, 0x61, 0x75, + 0x12, 0x32, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4f, 0x0a, 0x14, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x48, 0x00, 0x52, 0x12, + 0x72, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, + 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x22, 0x3e, + 0x0a, 0x12, 0x52, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, + 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x6e, 0x67, 0x22, 0x4a, + 0x0a, 0x14, 0x4c, 0x6f, 0x67, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6d, 0x75, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x02, 0x6d, 0x75, 0x12, 0x0c, 0x0a, 0x01, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x01, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x22, 0x42, 0x0a, 0x0f, 0x53, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x69, 0x73, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2f, 0x0a, + 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xd1, + 0x01, 0x0a, 0x11, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6c, + 0x6f, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0a, 0x66, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x4c, 0x6f, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, + 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6d, + 0x61, 0x78, 0x4d, 0x6f, 0x76, 0x65, 0x55, 0x70, 0x12, 0x22, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, + 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x0b, 0x6d, 0x69, 0x6e, 0x4d, 0x6f, 0x76, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x12, 0x34, 0x0a, 0x16, + 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6f, 0x66, 0x5f, 0x74, + 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x70, 0x72, + 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x22, 0x89, 0x01, 0x0a, 0x0e, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x46, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0d, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, + 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x63, 0x6f, 0x6c, + 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0xa2, + 0x01, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x3d, 0x0a, 0x0f, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x0e, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x36, 0x0a, 0x14, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, + 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x48, 0x00, 0x52, 0x13, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, + 0x72, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x66, + 0x75, 0x6c, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x69, + 0x73, 0x65, 0x64, 0x22, 0xad, 0x02, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, @@ -2801,7 +2996,7 @@ var file_vega_markets_proto_rawDesc = []byte{ 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x73, 0x63, 0x61, 0x6c, 0x69, - 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xc7, 0x0e, 0x0a, 0x06, 0x4d, 0x61, 0x72, + 0x6e, 0x67, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xb0, 0x0f, 0x0a, 0x06, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x49, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, @@ -2880,112 +3075,118 @@ var file_vega_markets_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x52, 0x16, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x63, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x22, 0xfc, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x02, - 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x41, 0x4e, - 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x10, 0x06, 0x12, - 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, - 0x07, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, - 0x4e, 0x47, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, - 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x44, - 0x10, 0x09, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, - 0x45, 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x56, 0x49, 0x41, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, - 0x41, 0x4e, 0x43, 0x45, 0x10, 0x0a, 0x22, 0xf7, 0x01, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x64, 0x69, - 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, - 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, - 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, - 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, - 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, - 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, - 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, - 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x52, 0x41, 0x44, - 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, 0x52, 0x41, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x29, 0x0a, 0x25, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, - 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x5f, - 0x56, 0x49, 0x41, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x06, - 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x22, 0x72, 0x0a, 0x10, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, - 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, - 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, - 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, - 0x73, 0x74, 0x65, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x65, 0x70, 0x12, 0x2b, 0x0a, 0x11, - 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x66, 0x75, 0x6c, - 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x66, 0x75, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x66, - 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x64, - 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x69, - 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x22, 0xda, 0x03, 0x0a, 0x1b, 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, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x77, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x61, 0x79, - 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, - 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x65, 0x63, - 0x61, 0x79, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x61, 0x73, 0x68, 0x5f, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, - 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, - 0x3c, 0x0a, 0x1a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x6e, - 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x18, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x6c, 0x65, - 0x6e, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4a, 0x0a, - 0x14, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x11, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x70, 0x65, - 0x63, 0x12, 0x5d, 0x0a, 0x19, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x70, 0x65, 0x63, - 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x16, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x2a, 0xa3, 0x01, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4d, 0x50, 0x4f, - 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, - 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x10, 0x01, - 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, - 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x4e, 0x10, - 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, - 0x52, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x54, - 0x52, 0x41, 0x44, 0x45, 0x10, 0x03, 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, + 0x69, 0x63, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x42, 0x0a, 0x1d, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xfc, 0x01, 0x0a, 0x05, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, + 0x45, 0x44, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x05, 0x12, 0x13, + 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x45, + 0x44, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4c, 0x4f, + 0x53, 0x45, 0x44, 0x10, 0x07, 0x12, 0x1c, 0x0a, 0x18, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x54, + 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x45, 0x54, + 0x54, 0x4c, 0x45, 0x44, 0x10, 0x09, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x56, 0x49, 0x41, 0x5f, 0x47, 0x4f, + 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x0a, 0x22, 0x9c, 0x02, 0x0a, 0x0b, 0x54, + 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x52, + 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x52, 0x41, 0x44, + 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, + 0x4f, 0x55, 0x53, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, + 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x41, 0x55, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, + 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x44, 0x49, + 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, + 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x1b, 0x0a, 0x17, + 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, + 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x29, 0x0a, 0x25, 0x54, 0x52, 0x41, + 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, + 0x44, 0x45, 0x44, 0x5f, 0x56, 0x49, 0x41, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, + 0x43, 0x45, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, + 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x5f, + 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x42, 0x1a, + 0x0a, 0x18, 0x5f, 0x69, 0x6e, 0x73, 0x75, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x6f, 0x6f, + 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x5f, 0x73, 0x6c, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x72, 0x0a, 0x10, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, + 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x22, + 0x8a, 0x02, 0x0a, 0x13, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x69, 0x6d, + 0x65, 0x53, 0x74, 0x65, 0x70, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x12, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, + 0x66, 0x75, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x32, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, + 0x75, 0x6d, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x5f, 0x73, 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x53, + 0x6c, 0x69, 0x70, 0x70, 0x61, 0x67, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x22, 0xda, 0x03, 0x0a, + 0x1b, 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, 0x12, 0x21, 0x0a, 0x0c, + 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x63, 0x61, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x64, 0x65, 0x63, 0x61, 0x79, 0x50, 0x6f, 0x77, 0x65, 0x72, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x61, 0x73, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x73, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6c, + 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6c, + 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x12, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x46, 0x0a, 0x11, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x44, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x53, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x70, 0x65, 0x63, 0x12, 0x5d, 0x0a, 0x19, 0x64, 0x61, + 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x5f, + 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x70, 0x65, 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x46, 0x6f, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x16, 0x64, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x53, 0x70, + 0x65, 0x63, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2a, 0xa3, 0x01, 0x0a, 0x12, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x24, 0x0a, 0x20, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, + 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x4f, 0x53, + 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, + 0x45, 0x49, 0x47, 0x48, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x4d, + 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x4e, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, + 0x4d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x54, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x10, 0x03, 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 ( @@ -3001,7 +3202,7 @@ func file_vega_markets_proto_rawDescGZIP() []byte { } var file_vega_markets_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_vega_markets_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_vega_markets_proto_msgTypes = make([]protoimpl.MessageInfo, 30) var file_vega_markets_proto_goTypes = []interface{}{ (CompositePriceType)(0), // 0: vega.CompositePriceType (LiquidityFeeSettings_Method)(0), // 1: vega.LiquidityFeeSettings.Method @@ -3010,79 +3211,83 @@ var file_vega_markets_proto_goTypes = []interface{}{ (*AuctionDuration)(nil), // 4: vega.AuctionDuration (*Spot)(nil), // 5: vega.Spot (*Future)(nil), // 6: vega.Future - (*Perpetual)(nil), // 7: vega.Perpetual - (*DataSourceSpecToFutureBinding)(nil), // 8: vega.DataSourceSpecToFutureBinding - (*DataSourceSpecToPerpetualBinding)(nil), // 9: vega.DataSourceSpecToPerpetualBinding - (*InstrumentMetadata)(nil), // 10: vega.InstrumentMetadata - (*Instrument)(nil), // 11: vega.Instrument - (*LogNormalRiskModel)(nil), // 12: vega.LogNormalRiskModel - (*LogNormalModelParams)(nil), // 13: vega.LogNormalModelParams - (*SimpleRiskModel)(nil), // 14: vega.SimpleRiskModel - (*SimpleModelParams)(nil), // 15: vega.SimpleModelParams - (*ScalingFactors)(nil), // 16: vega.ScalingFactors - (*MarginCalculator)(nil), // 17: vega.MarginCalculator - (*TradableInstrument)(nil), // 18: vega.TradableInstrument - (*FeeFactors)(nil), // 19: vega.FeeFactors - (*Fees)(nil), // 20: vega.Fees - (*PriceMonitoringTrigger)(nil), // 21: vega.PriceMonitoringTrigger - (*PriceMonitoringParameters)(nil), // 22: vega.PriceMonitoringParameters - (*PriceMonitoringSettings)(nil), // 23: vega.PriceMonitoringSettings - (*LiquidityMonitoringParameters)(nil), // 24: vega.LiquidityMonitoringParameters - (*LiquiditySLAParameters)(nil), // 25: vega.LiquiditySLAParameters - (*LiquidityFeeSettings)(nil), // 26: vega.LiquidityFeeSettings - (*TargetStakeParameters)(nil), // 27: vega.TargetStakeParameters - (*Market)(nil), // 28: vega.Market - (*MarketTimestamps)(nil), // 29: vega.MarketTimestamps - (*LiquidationStrategy)(nil), // 30: vega.LiquidationStrategy - (*CompositePriceConfiguration)(nil), // 31: vega.CompositePriceConfiguration - (*DataSourceSpec)(nil), // 32: vega.DataSourceSpec - (*DataSourceDefinition)(nil), // 33: vega.DataSourceDefinition - (*SpecBindingForCompositePrice)(nil), // 34: vega.SpecBindingForCompositePrice + (*FutureCap)(nil), // 7: vega.FutureCap + (*Perpetual)(nil), // 8: vega.Perpetual + (*DataSourceSpecToFutureBinding)(nil), // 9: vega.DataSourceSpecToFutureBinding + (*DataSourceSpecToPerpetualBinding)(nil), // 10: vega.DataSourceSpecToPerpetualBinding + (*InstrumentMetadata)(nil), // 11: vega.InstrumentMetadata + (*Instrument)(nil), // 12: vega.Instrument + (*LogNormalRiskModel)(nil), // 13: vega.LogNormalRiskModel + (*RiskFactorOverride)(nil), // 14: vega.RiskFactorOverride + (*LogNormalModelParams)(nil), // 15: vega.LogNormalModelParams + (*SimpleRiskModel)(nil), // 16: vega.SimpleRiskModel + (*SimpleModelParams)(nil), // 17: vega.SimpleModelParams + (*ScalingFactors)(nil), // 18: vega.ScalingFactors + (*MarginCalculator)(nil), // 19: vega.MarginCalculator + (*TradableInstrument)(nil), // 20: vega.TradableInstrument + (*FeeFactors)(nil), // 21: vega.FeeFactors + (*Fees)(nil), // 22: vega.Fees + (*PriceMonitoringTrigger)(nil), // 23: vega.PriceMonitoringTrigger + (*PriceMonitoringParameters)(nil), // 24: vega.PriceMonitoringParameters + (*PriceMonitoringSettings)(nil), // 25: vega.PriceMonitoringSettings + (*LiquidityMonitoringParameters)(nil), // 26: vega.LiquidityMonitoringParameters + (*LiquiditySLAParameters)(nil), // 27: vega.LiquiditySLAParameters + (*LiquidityFeeSettings)(nil), // 28: vega.LiquidityFeeSettings + (*TargetStakeParameters)(nil), // 29: vega.TargetStakeParameters + (*Market)(nil), // 30: vega.Market + (*MarketTimestamps)(nil), // 31: vega.MarketTimestamps + (*LiquidationStrategy)(nil), // 32: vega.LiquidationStrategy + (*CompositePriceConfiguration)(nil), // 33: vega.CompositePriceConfiguration + (*DataSourceSpec)(nil), // 34: vega.DataSourceSpec + (*DataSourceDefinition)(nil), // 35: vega.DataSourceDefinition + (*SpecBindingForCompositePrice)(nil), // 36: vega.SpecBindingForCompositePrice } var file_vega_markets_proto_depIdxs = []int32{ - 32, // 0: vega.Future.data_source_spec_for_settlement_data:type_name -> vega.DataSourceSpec - 32, // 1: vega.Future.data_source_spec_for_trading_termination:type_name -> vega.DataSourceSpec - 8, // 2: vega.Future.data_source_spec_binding:type_name -> vega.DataSourceSpecToFutureBinding - 32, // 3: vega.Perpetual.data_source_spec_for_settlement_schedule:type_name -> vega.DataSourceSpec - 32, // 4: vega.Perpetual.data_source_spec_for_settlement_data:type_name -> vega.DataSourceSpec - 9, // 5: vega.Perpetual.data_source_spec_binding:type_name -> vega.DataSourceSpecToPerpetualBinding - 31, // 6: vega.Perpetual.internal_composite_price_config:type_name -> vega.CompositePriceConfiguration - 10, // 7: vega.Instrument.metadata:type_name -> vega.InstrumentMetadata - 6, // 8: vega.Instrument.future:type_name -> vega.Future - 5, // 9: vega.Instrument.spot:type_name -> vega.Spot - 7, // 10: vega.Instrument.perpetual:type_name -> vega.Perpetual - 13, // 11: vega.LogNormalRiskModel.params:type_name -> vega.LogNormalModelParams - 15, // 12: vega.SimpleRiskModel.params:type_name -> vega.SimpleModelParams - 16, // 13: vega.MarginCalculator.scaling_factors:type_name -> vega.ScalingFactors - 11, // 14: vega.TradableInstrument.instrument:type_name -> vega.Instrument - 17, // 15: vega.TradableInstrument.margin_calculator:type_name -> vega.MarginCalculator - 12, // 16: vega.TradableInstrument.log_normal_risk_model:type_name -> vega.LogNormalRiskModel - 14, // 17: vega.TradableInstrument.simple_risk_model:type_name -> vega.SimpleRiskModel - 19, // 18: vega.Fees.factors:type_name -> vega.FeeFactors - 26, // 19: vega.Fees.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings - 21, // 20: vega.PriceMonitoringParameters.triggers:type_name -> vega.PriceMonitoringTrigger - 22, // 21: vega.PriceMonitoringSettings.parameters:type_name -> vega.PriceMonitoringParameters - 27, // 22: vega.LiquidityMonitoringParameters.target_stake_parameters:type_name -> vega.TargetStakeParameters - 1, // 23: vega.LiquidityFeeSettings.method:type_name -> vega.LiquidityFeeSettings.Method - 18, // 24: vega.Market.tradable_instrument:type_name -> vega.TradableInstrument - 20, // 25: vega.Market.fees:type_name -> vega.Fees - 4, // 26: vega.Market.opening_auction:type_name -> vega.AuctionDuration - 23, // 27: vega.Market.price_monitoring_settings:type_name -> vega.PriceMonitoringSettings - 24, // 28: vega.Market.liquidity_monitoring_parameters:type_name -> vega.LiquidityMonitoringParameters - 3, // 29: vega.Market.trading_mode:type_name -> vega.Market.TradingMode - 2, // 30: vega.Market.state:type_name -> vega.Market.State - 29, // 31: vega.Market.market_timestamps:type_name -> vega.MarketTimestamps - 25, // 32: vega.Market.liquidity_sla_params:type_name -> vega.LiquiditySLAParameters - 30, // 33: vega.Market.liquidation_strategy:type_name -> vega.LiquidationStrategy - 31, // 34: vega.Market.mark_price_configuration:type_name -> vega.CompositePriceConfiguration - 0, // 35: vega.CompositePriceConfiguration.composite_price_type:type_name -> vega.CompositePriceType - 33, // 36: vega.CompositePriceConfiguration.data_sources_spec:type_name -> vega.DataSourceDefinition - 34, // 37: vega.CompositePriceConfiguration.data_sources_spec_binding:type_name -> vega.SpecBindingForCompositePrice - 38, // [38:38] is the sub-list for method output_type - 38, // [38:38] is the sub-list for method input_type - 38, // [38:38] is the sub-list for extension type_name - 38, // [38:38] is the sub-list for extension extendee - 0, // [0:38] is the sub-list for field type_name + 34, // 0: vega.Future.data_source_spec_for_settlement_data:type_name -> vega.DataSourceSpec + 34, // 1: vega.Future.data_source_spec_for_trading_termination:type_name -> vega.DataSourceSpec + 9, // 2: vega.Future.data_source_spec_binding:type_name -> vega.DataSourceSpecToFutureBinding + 7, // 3: vega.Future.cap:type_name -> vega.FutureCap + 34, // 4: vega.Perpetual.data_source_spec_for_settlement_schedule:type_name -> vega.DataSourceSpec + 34, // 5: vega.Perpetual.data_source_spec_for_settlement_data:type_name -> vega.DataSourceSpec + 10, // 6: vega.Perpetual.data_source_spec_binding:type_name -> vega.DataSourceSpecToPerpetualBinding + 33, // 7: vega.Perpetual.internal_composite_price_config:type_name -> vega.CompositePriceConfiguration + 11, // 8: vega.Instrument.metadata:type_name -> vega.InstrumentMetadata + 6, // 9: vega.Instrument.future:type_name -> vega.Future + 5, // 10: vega.Instrument.spot:type_name -> vega.Spot + 8, // 11: vega.Instrument.perpetual:type_name -> vega.Perpetual + 15, // 12: vega.LogNormalRiskModel.params:type_name -> vega.LogNormalModelParams + 14, // 13: vega.LogNormalRiskModel.risk_factor_override:type_name -> vega.RiskFactorOverride + 17, // 14: vega.SimpleRiskModel.params:type_name -> vega.SimpleModelParams + 18, // 15: vega.MarginCalculator.scaling_factors:type_name -> vega.ScalingFactors + 12, // 16: vega.TradableInstrument.instrument:type_name -> vega.Instrument + 19, // 17: vega.TradableInstrument.margin_calculator:type_name -> vega.MarginCalculator + 13, // 18: vega.TradableInstrument.log_normal_risk_model:type_name -> vega.LogNormalRiskModel + 16, // 19: vega.TradableInstrument.simple_risk_model:type_name -> vega.SimpleRiskModel + 21, // 20: vega.Fees.factors:type_name -> vega.FeeFactors + 28, // 21: vega.Fees.liquidity_fee_settings:type_name -> vega.LiquidityFeeSettings + 23, // 22: vega.PriceMonitoringParameters.triggers:type_name -> vega.PriceMonitoringTrigger + 24, // 23: vega.PriceMonitoringSettings.parameters:type_name -> vega.PriceMonitoringParameters + 29, // 24: vega.LiquidityMonitoringParameters.target_stake_parameters:type_name -> vega.TargetStakeParameters + 1, // 25: vega.LiquidityFeeSettings.method:type_name -> vega.LiquidityFeeSettings.Method + 20, // 26: vega.Market.tradable_instrument:type_name -> vega.TradableInstrument + 22, // 27: vega.Market.fees:type_name -> vega.Fees + 4, // 28: vega.Market.opening_auction:type_name -> vega.AuctionDuration + 25, // 29: vega.Market.price_monitoring_settings:type_name -> vega.PriceMonitoringSettings + 26, // 30: vega.Market.liquidity_monitoring_parameters:type_name -> vega.LiquidityMonitoringParameters + 3, // 31: vega.Market.trading_mode:type_name -> vega.Market.TradingMode + 2, // 32: vega.Market.state:type_name -> vega.Market.State + 31, // 33: vega.Market.market_timestamps:type_name -> vega.MarketTimestamps + 27, // 34: vega.Market.liquidity_sla_params:type_name -> vega.LiquiditySLAParameters + 32, // 35: vega.Market.liquidation_strategy:type_name -> vega.LiquidationStrategy + 33, // 36: vega.Market.mark_price_configuration:type_name -> vega.CompositePriceConfiguration + 0, // 37: vega.CompositePriceConfiguration.composite_price_type:type_name -> vega.CompositePriceType + 35, // 38: vega.CompositePriceConfiguration.data_sources_spec:type_name -> vega.DataSourceDefinition + 36, // 39: vega.CompositePriceConfiguration.data_sources_spec_binding:type_name -> vega.SpecBindingForCompositePrice + 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_markets_proto_init() } @@ -3129,7 +3334,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Perpetual); i { + switch v := v.(*FutureCap); i { case 0: return &v.state case 1: @@ -3141,7 +3346,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataSourceSpecToFutureBinding); i { + switch v := v.(*Perpetual); i { case 0: return &v.state case 1: @@ -3153,7 +3358,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataSourceSpecToPerpetualBinding); i { + switch v := v.(*DataSourceSpecToFutureBinding); i { case 0: return &v.state case 1: @@ -3165,7 +3370,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InstrumentMetadata); i { + switch v := v.(*DataSourceSpecToPerpetualBinding); i { case 0: return &v.state case 1: @@ -3177,7 +3382,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Instrument); i { + switch v := v.(*InstrumentMetadata); i { case 0: return &v.state case 1: @@ -3189,7 +3394,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogNormalRiskModel); i { + switch v := v.(*Instrument); i { case 0: return &v.state case 1: @@ -3201,7 +3406,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogNormalModelParams); i { + switch v := v.(*LogNormalRiskModel); i { case 0: return &v.state case 1: @@ -3213,7 +3418,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SimpleRiskModel); i { + switch v := v.(*RiskFactorOverride); i { case 0: return &v.state case 1: @@ -3225,7 +3430,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SimpleModelParams); i { + switch v := v.(*LogNormalModelParams); i { case 0: return &v.state case 1: @@ -3237,7 +3442,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScalingFactors); i { + switch v := v.(*SimpleRiskModel); i { case 0: return &v.state case 1: @@ -3249,7 +3454,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarginCalculator); i { + switch v := v.(*SimpleModelParams); i { case 0: return &v.state case 1: @@ -3261,7 +3466,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TradableInstrument); i { + switch v := v.(*ScalingFactors); i { case 0: return &v.state case 1: @@ -3273,7 +3478,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FeeFactors); i { + switch v := v.(*MarginCalculator); i { case 0: return &v.state case 1: @@ -3285,7 +3490,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Fees); i { + switch v := v.(*TradableInstrument); i { case 0: return &v.state case 1: @@ -3297,7 +3502,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PriceMonitoringTrigger); i { + switch v := v.(*FeeFactors); i { case 0: return &v.state case 1: @@ -3309,7 +3514,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PriceMonitoringParameters); i { + switch v := v.(*Fees); i { case 0: return &v.state case 1: @@ -3321,7 +3526,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PriceMonitoringSettings); i { + switch v := v.(*PriceMonitoringTrigger); i { case 0: return &v.state case 1: @@ -3333,7 +3538,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityMonitoringParameters); i { + switch v := v.(*PriceMonitoringParameters); i { case 0: return &v.state case 1: @@ -3345,7 +3550,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquiditySLAParameters); i { + switch v := v.(*PriceMonitoringSettings); i { case 0: return &v.state case 1: @@ -3357,7 +3562,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidityFeeSettings); i { + switch v := v.(*LiquidityMonitoringParameters); i { case 0: return &v.state case 1: @@ -3369,7 +3574,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TargetStakeParameters); i { + switch v := v.(*LiquiditySLAParameters); i { case 0: return &v.state case 1: @@ -3381,7 +3586,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Market); i { + switch v := v.(*LiquidityFeeSettings); i { case 0: return &v.state case 1: @@ -3393,7 +3598,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketTimestamps); i { + switch v := v.(*TargetStakeParameters); i { case 0: return &v.state case 1: @@ -3405,7 +3610,7 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LiquidationStrategy); i { + switch v := v.(*Market); i { case 0: return &v.state case 1: @@ -3417,6 +3622,30 @@ func file_vega_markets_proto_init() { } } file_vega_markets_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MarketTimestamps); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_markets_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LiquidationStrategy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_markets_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompositePriceConfiguration); i { case 0: return &v.state @@ -3429,25 +3658,29 @@ func file_vega_markets_proto_init() { } } } + file_vega_markets_proto_msgTypes[2].OneofWrappers = []interface{}{} file_vega_markets_proto_msgTypes[3].OneofWrappers = []interface{}{} - file_vega_markets_proto_msgTypes[7].OneofWrappers = []interface{}{ + file_vega_markets_proto_msgTypes[4].OneofWrappers = []interface{}{} + file_vega_markets_proto_msgTypes[8].OneofWrappers = []interface{}{ (*Instrument_Future)(nil), (*Instrument_Spot)(nil), (*Instrument_Perpetual)(nil), } - file_vega_markets_proto_msgTypes[14].OneofWrappers = []interface{}{ + file_vega_markets_proto_msgTypes[9].OneofWrappers = []interface{}{} + file_vega_markets_proto_msgTypes[15].OneofWrappers = []interface{}{} + file_vega_markets_proto_msgTypes[16].OneofWrappers = []interface{}{ (*TradableInstrument_LogNormalRiskModel)(nil), (*TradableInstrument_SimpleRiskModel)(nil), } - file_vega_markets_proto_msgTypes[22].OneofWrappers = []interface{}{} file_vega_markets_proto_msgTypes[24].OneofWrappers = []interface{}{} + file_vega_markets_proto_msgTypes[26].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_markets_proto_rawDesc, NumEnums: 4, - NumMessages: 28, + NumMessages: 30, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/snapshot/v1/snapshot.pb.go b/protos/vega/snapshot/v1/snapshot.pb.go index 0c2bd030d79..beb2193ee96 100644 --- a/protos/vega/snapshot/v1/snapshot.pb.go +++ b/protos/vega/snapshot/v1/snapshot.pb.go @@ -479,6 +479,8 @@ type Payload struct { // *Payload_EthOracleVerifierMisc // *Payload_BankingEvmBridgeStates // *Payload_EvmMultisigTopologies + // *Payload_TxCache + // *Payload_EvmFwdHeartbeats Data isPayload_Data `protobuf_oneof:"data"` } @@ -1081,6 +1083,20 @@ func (x *Payload) GetEvmMultisigTopologies() *EVMMultisigTopologies { return nil } +func (x *Payload) GetTxCache() *TxCache { + if x, ok := x.GetData().(*Payload_TxCache); ok { + return x.TxCache + } + return nil +} + +func (x *Payload) GetEvmFwdHeartbeats() *EVMFwdHeartbeats { + if x, ok := x.GetData().(*Payload_EvmFwdHeartbeats); ok { + return x.EvmFwdHeartbeats + } + return nil +} + type isPayload_Data interface { isPayload_Data() } @@ -1405,6 +1421,14 @@ type Payload_EvmMultisigTopologies struct { EvmMultisigTopologies *EVMMultisigTopologies `protobuf:"bytes,87,opt,name=evm_multisig_topologies,json=evmMultisigTopologies,proto3,oneof"` } +type Payload_TxCache struct { + TxCache *TxCache `protobuf:"bytes,88,opt,name=tx_cache,json=txCache,proto3,oneof"` +} + +type Payload_EvmFwdHeartbeats struct { + EvmFwdHeartbeats *EVMFwdHeartbeats `protobuf:"bytes,89,opt,name=evm_fwd_heartbeats,json=evmFwdHeartbeats,proto3,oneof"` +} + func (*Payload_ActiveAssets) isPayload_Data() {} func (*Payload_PendingAssets) isPayload_Data() {} @@ -1565,6 +1589,10 @@ func (*Payload_BankingEvmBridgeStates) isPayload_Data() {} func (*Payload_EvmMultisigTopologies) isPayload_Data() {} +func (*Payload_TxCache) isPayload_Data() {} + +func (*Payload_EvmFwdHeartbeats) isPayload_Data() {} + type OrderHoldingQuantities struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3137,6 +3165,7 @@ type BankingRecurringTransfers struct { unknownFields protoimpl.UnknownFields RecurringTransfers *v11.RecurringTransfers `protobuf:"bytes,1,opt,name=recurring_transfers,json=recurringTransfers,proto3" json:"recurring_transfers,omitempty"` + NextMetricUpdate int64 `protobuf:"varint,2,opt,name=next_metric_update,json=nextMetricUpdate,proto3" json:"next_metric_update,omitempty"` } func (x *BankingRecurringTransfers) Reset() { @@ -3178,6 +3207,13 @@ func (x *BankingRecurringTransfers) GetRecurringTransfers() *v11.RecurringTransf return nil } +func (x *BankingRecurringTransfers) GetNextMetricUpdate() int64 { + if x != nil { + return x.NextMetricUpdate + } + return 0 +} + type BankingScheduledTransfers struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5461,6 +5497,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 +5756,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 +5818,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"` + AmmPartyIds []*StringMapEntry `protobuf:"bytes,2,rep,name=amm_party_ids,json=ammPartyIds,proto3" json:"amm_party_ids,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) GetAmmPartyIds() []*StringMapEntry { + if x != nil { + return x.AmmPartyIds + } + 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 +6006,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 +6019,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 +6032,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 +6071,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 +6084,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 +6097,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 +6127,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 +6140,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 +6153,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 +6190,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 +6203,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 +6216,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 +6258,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 +6271,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 +6284,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 +6355,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 +6368,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 +6381,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 +6410,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 +6423,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 +6436,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 +6466,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 +6479,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 +6492,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 +6528,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 +6541,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 +6554,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 +6583,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 +6596,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 +6609,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 +6639,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 +6652,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 +6665,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 +6700,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 +6713,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 +6726,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 +6753,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 +6766,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 +6779,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 +6847,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 +6860,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 +6873,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 +6930,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 +6943,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 +6956,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 +6992,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 +7005,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 +7018,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 +7097,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 +7110,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 +7123,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 +7161,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 +7174,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 +7187,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 +7232,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 +7245,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 +7258,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 +7301,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 +7314,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 +7327,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 +7359,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 +7372,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 +7385,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 { @@ -7217,12 +7434,13 @@ type AppState struct { ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` ProtocolVersion string `protobuf:"bytes,5,opt,name=protocol_version,json=protocolVersion,proto3" json:"protocol_version,omitempty"` ProtocolUpgrade bool `protobuf:"varint,6,opt,name=protocol_upgrade,json=protocolUpgrade,proto3" json:"protocol_upgrade,omitempty"` + PrevBlockTime int64 `protobuf:"varint,7,opt,name=prev_block_time,json=prevBlockTime,proto3" json:"prev_block_time,omitempty"` } 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 +7453,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 +7466,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 { @@ -7293,6 +7511,13 @@ func (x *AppState) GetProtocolUpgrade() bool { return false } +func (x *AppState) GetPrevBlockTime() int64 { + if x != nil { + return x.PrevBlockTime + } + return 0 +} + // EpochState details type EpochState struct { state protoimpl.MessageState @@ -7314,7 +7539,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 +7552,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 +7565,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 +7614,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 +7627,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 +7640,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 +7662,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 +7675,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 +7688,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 +7721,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 +7734,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 +7747,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 +7804,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 +7817,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 +7830,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 +7868,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 +7887,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 +7900,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 +7973,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 +7998,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 +8011,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 +8024,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 +8096,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 +8109,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 +8122,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 +8158,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 +8171,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 +8184,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 +8213,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 +8226,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 +8239,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 +8268,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 +8281,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 +8294,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 +8326,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 +8339,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 +8352,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 +8405,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 +8418,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 +8431,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 +8480,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 +8493,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 +8506,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 +8527,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 +8540,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 +8553,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 +8574,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 +8587,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 +8600,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 +8628,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 +8641,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 +8654,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 +8724,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 +8737,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 +8750,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 +8774,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 +8787,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 +8800,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 +8843,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 +8856,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 +8869,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 +8898,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 +8911,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 +8924,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 +8952,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 +8965,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 +8978,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 +9004,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 +9017,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 +9030,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 +9087,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 +9100,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 +9113,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 +9144,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 +9157,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 +9170,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 +9216,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 +9229,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 +9242,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 +9297,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 +9310,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 +9323,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 +9387,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 +9400,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 +9413,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 +9445,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 +9458,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 +9471,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 +9523,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 +9536,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 +9549,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 +9599,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 +9612,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 +9625,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 +9705,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 +9718,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 +9731,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 +9779,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 +9792,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 +9805,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 +9868,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 +9881,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 +9894,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 +9919,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 +9932,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 +9945,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 +9989,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 +10002,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 +10015,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 +10045,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 +10058,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 +10071,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 +10100,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 +10113,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 +10126,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 +10156,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 +10169,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 +10182,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 +10212,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 +10225,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 +10238,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 +10268,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 +10281,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 +10294,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 +10330,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 +10343,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 +10356,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 +10393,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 +10406,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 +10419,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 +10470,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 +10483,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 +10496,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 +10526,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 +10539,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 +10552,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 +10582,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 +10595,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 +10608,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 +10639,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 +10652,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 +10665,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 +10710,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 +10723,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 +10736,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 +10832,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 +10845,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 +10858,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 +10911,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 +10924,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 +10937,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 +10981,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 +10994,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 +11007,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 +11039,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 +11052,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 +11065,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 +11115,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 +11128,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 +11141,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 +11172,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 +11185,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 +11198,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 +11243,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 +11256,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 +11269,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 +11312,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 +11325,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 +11338,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 +11369,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 +11382,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 +11395,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 +11440,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 +11453,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 +11466,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 +11510,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 +11523,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 +11536,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 +11571,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 +11584,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 +11597,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 +11626,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 +11639,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 +11652,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 +11730,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 +11743,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 +11756,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 +11790,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 +11803,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 +11816,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 +11879,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 +11892,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 +11905,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 +11927,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 +11940,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 +11953,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 +11983,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 +11996,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 +12009,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 +12045,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 +12058,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 +12071,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 +12100,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 +12113,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 +12126,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 +12155,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 +12168,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 +12181,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 +12210,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 +12223,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 +12236,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 +12267,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 +12280,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 +12293,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 +12321,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 +12334,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 +12347,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 +12376,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 +12389,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 +12402,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 +12481,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 +12494,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 +12507,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 +12542,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 +12555,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 +12568,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 +12591,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 +12604,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 +12617,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 +12652,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 +12665,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 +12678,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 +12701,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 +12714,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 +12727,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 +12767,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 +12780,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 +12793,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 +12857,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 +12870,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 +12883,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 +12961,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 +12974,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 +12987,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 +13017,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 +13030,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 +13043,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 +13079,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 +13092,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 +13105,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 +13134,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 +13147,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 +13160,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 +13189,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 +13202,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 +13215,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 +13243,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 +13256,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 +13269,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 +13294,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 +13307,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 +13320,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 +13377,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 +13390,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 +13403,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 +13481,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 +13494,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 +13507,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 +13535,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 +13548,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 +13561,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 +13583,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 +13596,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 +13609,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 +13640,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 +13653,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 +13666,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 +13710,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 +13723,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 +13736,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 +13771,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 +13784,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 +13797,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 +13823,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 +13836,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 +13849,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 +13905,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 +13918,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 +13931,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 { @@ -13713,15 +13946,16 @@ type PartyProfile struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` - Alias string `protobuf:"bytes,2,opt,name=alias,proto3" json:"alias,omitempty"` - Metadata []*vega.Metadata `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty"` + PartyId string `protobuf:"bytes,1,opt,name=party_id,json=partyId,proto3" json:"party_id,omitempty"` + Alias string `protobuf:"bytes,2,opt,name=alias,proto3" json:"alias,omitempty"` + Metadata []*vega.Metadata `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty"` + DerivedKeys []string `protobuf:"bytes,4,rep,name=derived_keys,json=derivedKeys,proto3" json:"derived_keys,omitempty"` } 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 +13968,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 +13981,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 +14005,98 @@ func (x *PartyProfile) GetMetadata() []*vega.Metadata { return nil } +func (x *PartyProfile) GetDerivedKeys() []string { + if x != nil { + return x.DerivedKeys + } + 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 +14109,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 +14122,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,93 +14132,596 @@ func (x *MarketLiquidity) GetPriceRange() string { return "" } -var File_vega_snapshot_v1_snapshot_proto protoreflect.FileDescriptor +func (x *MarketLiquidity) GetTick() int64 { + if x != nil { + return x.Tick + } + return 0 +} -var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ - 0x0a, 0x1f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2f, - 0x76, 0x31, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x12, 0x10, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x1a, 0x11, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x23, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2f, - 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x76, - 0x65, 0x67, 0x61, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x76, 0x65, 0x67, 0x61, - 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x12, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9c, 0x01, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 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, 0x30, 0x0a, 0x06, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7b, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, - 0x6c, 0x65, 0x61, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4c, 0x65, - 0x61, 0x66, 0x22, 0xda, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x75, - 0x6e, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 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, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0a, 0x6e, - 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, - 0x56, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x2d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x6e, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x02, 0x6e, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x66, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x02, 0x6f, 0x66, 0x22, 0xd9, 0x37, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x0e, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 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, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x12, 0x57, 0x0a, 0x13, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, - 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 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, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x12, 0x62, 0x61, 0x6e, 0x6b, 0x69, - 0x6e, 0x67, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x4e, 0x0a, - 0x10, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x6b, 0x69, - 0x6e, 0x67, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x62, 0x61, - 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x42, 0x0a, - 0x0c, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x05, 0x20, - 0x01, 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, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65, - 0x65, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x65, - 0x6e, 0x12, 0x5b, 0x0a, 0x15, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x13, 0x62, 0x61, 0x6e, 0x6b, 0x69, - 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, - 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, +func (x *MarketLiquidity) GetAmm() []*AMMValues { + if x != nil { + return x.Amm + } + return nil +} + +type DelayedTx struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tx [][]byte `protobuf:"bytes,1,rep,name=tx,proto3" json:"tx,omitempty"` + Height uint64 `protobuf:"varint,2,opt,name=height,proto3" json:"height,omitempty"` +} + +func (x *DelayedTx) Reset() { + *x = DelayedTx{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[193] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DelayedTx) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DelayedTx) ProtoMessage() {} + +func (x *DelayedTx) 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 DelayedTx.ProtoReflect.Descriptor instead. +func (*DelayedTx) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{193} +} + +func (x *DelayedTx) GetTx() [][]byte { + if x != nil { + return x.Tx + } + return nil +} + +func (x *DelayedTx) GetHeight() uint64 { + if x != nil { + return x.Height + } + return 0 +} + +type TxCache struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Txs []*DelayedTx `protobuf:"bytes,1,rep,name=txs,proto3" json:"txs,omitempty"` +} + +func (x *TxCache) Reset() { + *x = TxCache{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[194] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TxCache) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TxCache) ProtoMessage() {} + +func (x *TxCache) 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 TxCache.ProtoReflect.Descriptor instead. +func (*TxCache) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{194} +} + +func (x *TxCache) GetTxs() []*DelayedTx { + if x != nil { + return x.Txs + } + return nil +} + +type EVMFwdPendingHeartbeat struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BlockHeight uint64 `protobuf:"varint,1,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` + BlockTime uint64 `protobuf:"varint,2,opt,name=block_time,json=blockTime,proto3" json:"block_time,omitempty"` + ContractAddress string `protobuf:"bytes,3,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` + ChainId string `protobuf:"bytes,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` +} + +func (x *EVMFwdPendingHeartbeat) Reset() { + *x = EVMFwdPendingHeartbeat{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[195] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EVMFwdPendingHeartbeat) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EVMFwdPendingHeartbeat) ProtoMessage() {} + +func (x *EVMFwdPendingHeartbeat) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[195] + 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 EVMFwdPendingHeartbeat.ProtoReflect.Descriptor instead. +func (*EVMFwdPendingHeartbeat) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{195} +} + +func (x *EVMFwdPendingHeartbeat) GetBlockHeight() uint64 { + if x != nil { + return x.BlockHeight + } + return 0 +} + +func (x *EVMFwdPendingHeartbeat) GetBlockTime() uint64 { + if x != nil { + return x.BlockTime + } + return 0 +} + +func (x *EVMFwdPendingHeartbeat) GetContractAddress() string { + if x != nil { + return x.ContractAddress + } + return "" +} + +func (x *EVMFwdPendingHeartbeat) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + +type EVMFwdLastSeen struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ChainId string `protobuf:"bytes,1,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` + BlockHeight uint64 `protobuf:"varint,3,opt,name=block_height,json=blockHeight,proto3" json:"block_height,omitempty"` +} + +func (x *EVMFwdLastSeen) Reset() { + *x = EVMFwdLastSeen{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[196] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EVMFwdLastSeen) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EVMFwdLastSeen) ProtoMessage() {} + +func (x *EVMFwdLastSeen) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[196] + 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 EVMFwdLastSeen.ProtoReflect.Descriptor instead. +func (*EVMFwdLastSeen) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{196} +} + +func (x *EVMFwdLastSeen) GetChainId() string { + if x != nil { + return x.ChainId + } + return "" +} + +func (x *EVMFwdLastSeen) GetContractAddress() string { + if x != nil { + return x.ContractAddress + } + return "" +} + +func (x *EVMFwdLastSeen) GetBlockHeight() uint64 { + if x != nil { + return x.BlockHeight + } + return 0 +} + +type EVMFwdHeartbeats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PendingHeartbeats []*EVMFwdPendingHeartbeat `protobuf:"bytes,1,rep,name=pending_heartbeats,json=pendingHeartbeats,proto3" json:"pending_heartbeats,omitempty"` + LastSeen []*EVMFwdLastSeen `protobuf:"bytes,2,rep,name=last_seen,json=lastSeen,proto3" json:"last_seen,omitempty"` +} + +func (x *EVMFwdHeartbeats) Reset() { + *x = EVMFwdHeartbeats{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[197] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EVMFwdHeartbeats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EVMFwdHeartbeats) ProtoMessage() {} + +func (x *EVMFwdHeartbeats) ProtoReflect() protoreflect.Message { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[197] + 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 EVMFwdHeartbeats.ProtoReflect.Descriptor instead. +func (*EVMFwdHeartbeats) Descriptor() ([]byte, []int) { + return file_vega_snapshot_v1_snapshot_proto_rawDescGZIP(), []int{197} +} + +func (x *EVMFwdHeartbeats) GetPendingHeartbeats() []*EVMFwdPendingHeartbeat { + if x != nil { + return x.PendingHeartbeats + } + return nil +} + +func (x *EVMFwdHeartbeats) GetLastSeen() []*EVMFwdLastSeen { + if x != nil { + return x.LastSeen + } + 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"` + Pv string `protobuf:"bytes,4,opt,name=pv,proto3" json:"pv,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[198] + 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[198] + 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) GetPv() string { + if x != nil { + return x.Pv + } + 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"` + AmmPartyId string `protobuf:"bytes,2,opt,name=amm_party_id,json=ammPartyId,proto3" json:"amm_party_id,omitempty"` + Commitment string `protobuf:"bytes,3,opt,name=commitment,proto3" json:"commitment,omitempty"` + Parameters *v12.AMM_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.AMM_Status `protobuf:"varint,9,opt,name=status,proto3,enum=vega.events.v1.AMM_Status" json:"status,omitempty"` + ProposedFee string `protobuf:"bytes,10,opt,name=proposed_fee,json=proposedFee,proto3" json:"proposed_fee,omitempty"` +} + +func (x *PoolMapEntry_Pool) Reset() { + *x = PoolMapEntry_Pool{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_snapshot_v1_snapshot_proto_msgTypes[199] + 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[199] + 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) GetAmmPartyId() string { + if x != nil { + return x.AmmPartyId + } + return "" +} + +func (x *PoolMapEntry_Pool) GetCommitment() string { + if x != nil { + return x.Commitment + } + return "" +} + +func (x *PoolMapEntry_Pool) GetParameters() *v12.AMM_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.AMM_Status { + if x != nil { + return x.Status + } + return v12.AMM_Status(0) +} + +func (x *PoolMapEntry_Pool) GetProposedFee() string { + if x != nil { + return x.ProposedFee + } + return "" +} + +var File_vega_snapshot_v1_snapshot_proto protoreflect.FileDescriptor + +var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ + 0x0a, 0x1f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2f, + 0x76, 0x31, 0x2f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x10, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x1a, 0x11, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x23, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2f, + 0x76, 0x31, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x76, + 0x65, 0x67, 0x61, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x76, 0x65, 0x67, 0x61, + 0x2f, 0x67, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x12, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x0f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9c, 0x01, 0x0a, 0x08, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 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, 0x30, 0x0a, 0x06, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x7b, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x69, 0x73, 0x5f, + 0x6c, 0x65, 0x61, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x73, 0x4c, 0x65, + 0x61, 0x66, 0x22, 0xda, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x68, 0x75, + 0x6e, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0b, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 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, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x52, 0x0a, 0x6e, + 0x6f, 0x64, 0x65, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, + 0x56, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x2d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x6e, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x02, 0x6e, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x66, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x02, 0x6f, 0x66, 0x22, 0xe5, 0x38, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x45, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x0e, 0x70, 0x65, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 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, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x12, 0x57, 0x0a, 0x13, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, + 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 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, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x48, 0x00, 0x52, 0x12, 0x62, 0x61, 0x6e, 0x6b, 0x69, + 0x6e, 0x67, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, 0x12, 0x4e, 0x0a, + 0x10, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x6b, 0x69, + 0x6e, 0x67, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x62, 0x61, + 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x42, 0x0a, + 0x0c, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x18, 0x05, 0x20, + 0x01, 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, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65, + 0x65, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x65, + 0x6e, 0x12, 0x5b, 0x0a, 0x15, 0x62, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x13, 0x62, 0x61, 0x6e, 0x6b, 0x69, + 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, + 0x0a, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x57, @@ -14318,2086 +15135,2209 @@ var file_vega_snapshot_v1_snapshot_proto_rawDesc = []byte{ 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, 0x69, 0x65, 0x73, 0x48, 0x00, 0x52, 0x15, 0x65, 0x76, 0x6d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, - 0x67, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x56, 0x0a, 0x16, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x48, 0x6f, 0x6c, 0x64, - 0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x15, - 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x72, - 0x61, 0x63, 0x6b, 0x65, 0x72, 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, 0x4d, 0x0a, 0x0d, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x6c, 0x64, - 0x69, 0x6e, 0x67, 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, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x0c, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, - 0x67, 0x22, 0x4c, 0x0a, 0x15, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, - 0x52, 0x0a, 0x17, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x4f, 0x70, - 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, - 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, - 0x69, 0x6d, 0x65, 0x22, 0xf2, 0x02, 0x0a, 0x0f, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 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, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x54, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4f, - 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x73, 0x12, 0x61, 0x0a, 0x17, - 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x67, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x74, + 0x78, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x58, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x6e, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x52, 0x15, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, - 0x75, 0x73, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x73, 0x12, - 0x57, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x65, 0x73, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x2e, 0x54, 0x78, 0x43, 0x61, 0x63, 0x68, 0x65, 0x48, 0x00, 0x52, 0x07, 0x74, 0x78, 0x43, 0x61, + 0x63, 0x68, 0x65, 0x12, 0x52, 0x0a, 0x12, 0x65, 0x76, 0x6d, 0x5f, 0x66, 0x77, 0x64, 0x5f, 0x68, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x18, 0x59, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x56, 0x4d, 0x46, 0x77, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x73, 0x48, 0x00, 0x52, 0x10, 0x65, 0x76, 0x6d, 0x46, 0x77, 0x64, 0x48, 0x65, 0x61, + 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x56, 0x0a, 0x16, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x51, + 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x71, 0x75, 0x61, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x48, 0x6f, 0x6c, 0x64, + 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x72, 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, 0x4d, + 0x0a, 0x0d, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 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, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x48, 0x6f, + 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x0c, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x48, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x4c, 0x0a, + 0x15, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x17, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x73, 0x22, 0xe0, 0x02, 0x0a, 0x13, 0x53, 0x70, 0x6f, - 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 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, 0x21, 0x0a, - 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x74, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x12, - 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x52, 0x11, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, - 0x59, 0x0a, 0x14, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x6d, 0x61, - 0x78, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x0d, 0x6d, 0x61, - 0x78, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x22, 0x5a, 0x0a, 0x1e, 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, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x62, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xfb, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 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, 0x50, 0x0a, 0x0f, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x3d, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, - 0x6c, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 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, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x6f, 0x72, 0x61, - 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0xa7, 0x01, 0x0a, 0x0a, 0x4f, 0x72, 0x61, 0x63, - 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x64, - 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x07, 0x73, - 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 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, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x50, 0x61, 0x69, 0x72, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x09, - 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, - 0x61, 0x22, 0x38, 0x0a, 0x0e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, - 0x61, 0x69, 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, 0x43, 0x0a, 0x07, 0x57, - 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x22, 0x67, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x6f, - 0x74, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x0a, 0x14, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 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, 0x90, 0x01, 0x0a, 0x0e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, - 0x61, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x40, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x65, 0x72, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x73, 0x0a, 0x12, - 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x12, 0x29, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, - 0x15, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x65, - 0x78, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x22, 0x37, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x33, 0x0a, 0x0c, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, - 0x34, 0x0a, 0x0d, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x12, 0x23, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x3a, 0x0a, 0x13, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x06, + 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6f, + 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, + 0xf2, 0x02, 0x0a, 0x0f, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x54, 0x61, 0x72, + 0x67, 0x65, 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, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, + 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x70, + 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x04, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x73, 0x12, 0x61, 0x0a, 0x17, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, + 0x73, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x65, 0x73, 0x74, 0x52, 0x15, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x4f, 0x70, + 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x6d, + 0x61, 0x78, 0x5f, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, + 0x73, 0x74, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x4f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x65, 0x73, 0x74, 0x73, 0x22, 0xe0, 0x02, 0x0a, 0x13, 0x53, 0x70, 0x6f, 0x74, 0x4c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x54, 0x61, 0x72, 0x67, 0x65, 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, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x12, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x64, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, + 0x6b, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x59, 0x0a, 0x14, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, + 0x61, 0x6b, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x61, + 0x6b, 0x65, 0x52, 0x12, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x4f, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x65, 0x64, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x22, 0x5a, 0x0a, 0x1e, 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, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x22, 0xfb, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 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, 0x50, 0x0a, 0x0f, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x12, 0x3d, 0x0a, 0x0b, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x5f, 0x64, + 0x61, 0x74, 0x61, 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, 0x4f, 0x72, 0x61, + 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x6f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x22, 0xa7, 0x01, 0x0a, 0x0a, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x52, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x72, 0x73, 0x12, 0x34, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 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, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, + 0x69, 0x72, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x22, 0x38, 0x0a, + 0x0e, 0x4f, 0x72, 0x61, 0x63, 0x6c, 0x65, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, 0x69, 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, 0x43, 0x0a, 0x07, 0x57, 0x69, 0x74, 0x6e, 0x65, + 0x73, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x67, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x6f, 0x74, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x6f, 0x74, 0x65, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x3e, 0x0a, 0x14, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x6f, + 0x72, 0x77, 0x61, 0x72, 0x64, 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, 0x90, 0x01, 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x6b, 0x65, + 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x63, 0x6b, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x19, 0x0a, + 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x73, 0x0a, 0x12, 0x43, 0x6f, 0x6c, 0x6c, + 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x29, + 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x65, 0x78, 0x74, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x22, 0x37, 0x0a, + 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x73, 0x12, 0x23, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x33, 0x0a, 0x0c, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x34, 0x0a, 0x0d, 0x50, + 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x73, 0x22, 0x50, 0x0a, 0x0a, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, - 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, - 0x66, 0x12, 0x30, 0x0a, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x61, 0x6c, 0x22, 0x42, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, - 0x0a, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x07, - 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x05, 0x54, 0x78, 0x52, 0x65, - 0x66, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x4e, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, - 0x64, 0x65, 0x78, 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, 0x22, 0x54, - 0x0a, 0x12, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x61, 0x6c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x61, 0x6c, 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, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x61, 0x6c, 0x73, 0x22, 0x46, 0x0a, 0x0f, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x44, - 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x52, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x22, 0xa1, 0x01, 0x0a, - 0x0b, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x66, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, - 0x12, 0x3c, 0x0a, 0x1b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x45, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x40, - 0x0a, 0x1d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x53, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x45, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x22, 0x59, 0x0a, 0x13, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x74, 0x0a, 0x19, 0x42, - 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x57, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x75, - 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, - 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x12, 0x72, - 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x73, 0x22, 0x74, 0x0a, 0x19, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x57, - 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x7e, 0x0a, 0x23, 0x42, 0x61, 0x6e, 0x6b, 0x69, - 0x6e, 0x67, 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, 0x73, 0x12, 0x57, - 0x0a, 0x13, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x52, 0x12, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x23, 0x42, 0x61, 0x6e, 0x6b, - 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x6f, 0x76, 0x65, - 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, - 0x61, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x74, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, - 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, 0x74, 0x54, 0x69, 0x6d, + 0x73, 0x22, 0x3a, 0x0a, 0x13, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x06, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x50, 0x0a, + 0x0a, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x72, + 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x30, 0x0a, + 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 0x6c, 0x52, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x22, + 0x42, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x07, 0x64, 0x65, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, 0x07, 0x64, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x05, 0x54, 0x78, 0x52, 0x65, 0x66, 0x12, 0x14, 0x0a, + 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, + 0x73, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 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, 0x22, 0x54, 0x0a, 0x12, 0x42, 0x61, + 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, + 0x12, 0x3e, 0x0a, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 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, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x61, 0x6c, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x73, + 0x22, 0x46, 0x0a, 0x0f, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x52, + 0x07, 0x64, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x42, 0x61, 0x6e, + 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x66, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x66, 0x73, 0x12, 0x3c, 0x0a, 0x1b, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x6d, 0x61, + 0x72, 0x79, 0x45, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x40, 0x0a, 0x1d, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x61, 0x72, + 0x79, 0x5f, 0x65, 0x74, 0x68, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x19, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x61, 0x72, 0x79, 0x45, 0x74, 0x68, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x59, 0x0a, 0x13, + 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x42, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 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, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa2, 0x01, 0x0a, 0x19, 0x42, 0x61, 0x6e, 0x6b, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x57, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, + 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x12, 0x72, 0x65, 0x63, 0x75, + 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x2c, + 0x0a, 0x12, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x78, 0x74, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x74, 0x0a, 0x19, + 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x57, 0x0a, 0x11, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x41, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x22, 0x58, 0x0a, 0x12, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x42, 0x72, 0x69, - 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x62, 0x72, 0x69, 0x64, - 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x0b, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x5e, 0x0a, 0x16, - 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x45, 0x56, 0x4d, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 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, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, - 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x25, 0x0a, 0x0a, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x65, - 0x78, 0x74, 0x5f, 0x63, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6e, 0x65, 0x78, - 0x74, 0x43, 0x70, 0x22, 0x5c, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, - 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x22, 0x46, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7d, 0x0a, 0x11, 0x44, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x32, - 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x6d, 0x65, 0x22, 0x7e, 0x0a, 0x23, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 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, 0x73, 0x12, 0x57, 0x0a, 0x13, 0x72, 0x65, 0x63, + 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6f, 0x76, 0x65, + 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x12, + 0x72, 0x65, 0x63, 0x75, 0x72, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x23, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x61, 0x0a, 0x11, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x64, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x0f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x41, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x58, 0x0a, + 0x12, 0x42, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x42, + 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x62, 0x72, 0x69, 0x64, + 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x5e, 0x0a, 0x16, 0x42, 0x61, 0x6e, 0x6b, 0x69, + 0x6e, 0x67, 0x45, 0x56, 0x4d, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 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, 0x42, 0x72, + 0x69, 0x64, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x62, 0x72, 0x69, 0x64, 0x67, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x25, 0x0a, 0x0a, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x70, 0x22, 0x5c, + 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x73, 0x74, + 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x63, 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, + 0x69, 0x6c, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x46, 0x0a, 0x10, + 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7d, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x65, 0x6c, + 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, + 0x0c, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x0c, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x75, 0x6e, 0x64, 0x65, - 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x75, 0x74, 0x6f, 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, 0x22, 0x9a, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x12, 0x1c, 0x0a, 0x03, 0x79, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x03, 0x79, 0x65, 0x73, 0x12, - 0x1a, 0x0a, 0x02, 0x6e, 0x6f, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x02, 0x6e, 0x6f, 0x12, 0x24, 0x0a, 0x07, 0x69, - 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x22, 0x51, 0x0a, 0x11, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x45, - 0x6e, 0x61, 0x63, 0x74, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 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, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x73, 0x22, 0x50, 0x0a, 0x10, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, - 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 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, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x11, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x45, 0x0a, 0x0e, - 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x41, 0x75, 0x74, 0x6f, 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, 0x22, + 0x9a, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x2a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x03, + 0x79, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x56, 0x6f, 0x74, 0x65, 0x52, 0x03, 0x79, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x02, 0x6e, 0x6f, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x6f, + 0x74, 0x65, 0x52, 0x02, 0x6e, 0x6f, 0x12, 0x24, 0x0a, 0x07, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, + 0x6f, 0x74, 0x65, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x51, 0x0a, 0x11, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x6e, 0x61, 0x63, 0x74, 0x65, + 0x64, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 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, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x73, 0x22, 0x65, 0x0a, 0x15, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x62, 0x61, - 0x74, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 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, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x22, 0xd8, 0x01, 0x0a, 0x0e, 0x47, 0x6f, 0x76, - 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x70, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 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, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x53, - 0x0a, 0x13, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x5f, 0x64, 0x61, 0x74, 0x61, 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, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x11, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, - 0x61, 0x74, 0x61, 0x22, 0x76, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x63, - 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, 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, 0x12, 0x34, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 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, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xe1, 0x01, 0x0a, 0x0f, - 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, - 0x3c, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 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, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x08, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x0a, - 0x1a, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x17, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x53, 0x0a, 0x1a, 0x70, 0x65, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x52, 0x17, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x22, - 0xf6, 0x01, 0x0a, 0x0c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x6f, 0x6b, - 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, 0x1d, 0x0a, - 0x03, 0x62, 0x75, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x03, 0x62, 0x75, 0x79, 0x12, 0x1f, 0x0a, 0x04, - 0x73, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x12, 0x2a, 0x0a, - 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x64, 0x65, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x75, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x28, - 0x0a, 0x10, 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, - 0x64, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, 0x22, 0x3b, 0x0a, 0x09, 0x4e, 0x65, 0x74, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x06, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x30, 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x4d, 0x61, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x76, 0x61, 0x6c, 0x22, 0x35, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x3b, - 0x0a, 0x0b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 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, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x0a, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, - 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, 0x0a, - 0x03, 0x72, 0x65, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x22, - 0x9a, 0x01, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x5f, 0x66, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x46, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x46, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x9a, 0x01, 0x0a, - 0x0f, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x12, 0x32, 0x0a, 0x05, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x05, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x32, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 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, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3c, 0x0a, 0x0c, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 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, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x09, 0x50, 0x61, 0x73, 0x74, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0xf4, 0x04, 0x0a, - 0x0c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x20, 0x0a, - 0x0b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x12, - 0x3d, 0x0a, 0x0b, 0x66, 0x70, 0x5f, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 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, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x4d, - 0x61, 0x70, 0x52, 0x0a, 0x66, 0x70, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x6e, 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6e, 0x6f, 0x77, - 0x12, 0x16, 0x0a, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x73, 0x18, 0x07, 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, 0x69, 0x63, - 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x06, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x33, - 0x0a, 0x16, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x4d, 0x0a, 0x11, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x22, + 0x50, 0x0a, 0x10, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x12, 0x3c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 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, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x73, 0x22, 0x88, 0x01, 0x0a, 0x11, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x45, 0x0a, 0x0e, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x2c, + 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x73, 0x22, 0x65, 0x0a, 0x15, + 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x61, 0x74, 0x63, 0x68, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 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, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, - 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x72, 0x65, 0x66, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, + 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x0e, 0x62, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x73, 0x22, 0xd8, 0x01, 0x0a, 0x0e, 0x47, 0x6f, 0x76, 0x65, 0x72, 0x6e, 0x61, 0x6e, + 0x63, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x2c, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x5f, 0x64, 0x61, 0x74, 0x61, 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, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0c, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x53, 0x0a, 0x13, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, + 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, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, + 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x52, 0x11, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x22, 0x76, + 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x63, 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, 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, + 0x12, 0x34, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1c, 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, 0x52, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xe1, 0x01, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x6b, 0x69, + 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x61, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 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, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x73, 0x5f, 0x6e, 0x6f, 0x77, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x09, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x73, 0x4e, 0x6f, 0x77, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x73, 0x5f, 0x70, 0x61, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x61, 0x73, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x73, 0x50, 0x61, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, - 0x73, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x52, 0x65, 0x61, 0x63, - 0x68, 0x65, 0x64, 0x22, 0xf8, 0x02, 0x0a, 0x0c, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x2e, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, - 0x64, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x2e, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, - 0x62, 0x65, 0x67, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x32, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, + 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x08, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x74, 0x61, 0x6b, + 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x73, 0x74, + 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, + 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x53, 0x0a, 0x1a, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, + 0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, + 0x79, 0x52, 0x17, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x22, 0xf6, 0x01, 0x0a, 0x0c, 0x4d, + 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x6f, 0x6b, 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, 0x1d, 0x0a, 0x03, 0x62, 0x75, 0x79, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x52, 0x03, 0x62, 0x75, 0x79, 0x12, 0x1f, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x64, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, + 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x65, 0x67, + 0x67, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x49, 0x64, 0x73, 0x22, 0x3b, 0x0a, 0x09, 0x4e, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x2e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x22, 0x30, 0x0a, 0x0a, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, + 0x61, 0x6c, 0x22, 0x35, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x3b, 0x0a, 0x0b, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 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, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x42, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x22, 0x9a, 0x01, 0x0a, 0x0a, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1f, + 0x0a, 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x36, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x9a, 0x01, 0x0a, 0x0f, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x05, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x12, + 0x32, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 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, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x05, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3c, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 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, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x22, 0x53, 0x0a, 0x09, 0x50, 0x61, 0x73, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x65, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0xf4, 0x04, 0x0a, 0x0c, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0b, 0x66, 0x70, + 0x5f, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 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, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x0a, 0x66, + 0x70, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6e, 0x6f, 0x77, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6e, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x18, 0x07, 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, 0x69, 0x63, 0x65, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x52, 0x06, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4d, + 0x0a, 0x11, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x0f, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x2f, 0x0a, + 0x14, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x72, 0x65, 0x66, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x44, + 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x4d, 0x61, 0x70, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x6e, + 0x6f, 0x77, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x09, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, + 0x4e, 0x6f, 0x77, 0x12, 0x3c, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x5f, 0x70, 0x61, + 0x73, 0x74, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x73, 0x74, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x50, 0x61, 0x73, + 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x5f, 0x72, + 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x63, 0x6f, + 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x52, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x22, 0xf8, + 0x02, 0x0a, 0x0c, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2c, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x3b, 0x0a, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x74, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x14, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, - 0x73, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x6e, 0x74, 0x22, 0x75, - 0x0a, 0x0d, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x50, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 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, 0x68, 0x61, 0x72, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, 0x61, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, - 0x76, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x16, 0x0a, - 0x06, 0x76, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x22, 0xa9, 0x01, 0x0a, 0x0b, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x76, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6d, 0x76, 0x70, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x70, 0x65, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x41, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x03, 0x6c, - 0x70, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x71, 0x75, 0x69, - 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x50, 0x52, 0x03, 0x6c, 0x70, 0x73, 0x12, 0x0c, - 0x0a, 0x01, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x72, 0x12, 0x13, 0x0a, 0x05, - 0x70, 0x5f, 0x6d, 0x76, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x4d, 0x76, - 0x70, 0x22, 0x84, 0x01, 0x0a, 0x0b, 0x46, 0x65, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, - 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x74, 0x69, - 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x76, 0x67, - 0x12, 0x16, 0x0a, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x22, 0xa1, 0x09, 0x0a, 0x0a, 0x53, 0x70, 0x6f, - 0x74, 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, - 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x65, + 0x67, 0x69, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x62, 0x65, 0x67, 0x69, 0x6e, + 0x12, 0x27, 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x73, + 0x74, 0x6f, 0x70, 0x12, 0x32, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x09, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x45, 0x71, 0x75, + 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x4c, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 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, 0x68, 0x61, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x68, 0x61, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x73, 0x68, 0x61, + 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x22, 0xa9, 0x01, 0x0a, 0x0b, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x76, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, + 0x76, 0x70, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x03, 0x6c, 0x70, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, + 0x72, 0x65, 0x4c, 0x50, 0x52, 0x03, 0x6c, 0x70, 0x73, 0x12, 0x0c, 0x0a, 0x01, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x72, 0x12, 0x13, 0x0a, 0x05, 0x70, 0x5f, 0x6d, 0x76, 0x70, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x4d, 0x76, 0x70, 0x22, 0x84, 0x01, 0x0a, + 0x0b, 0x46, 0x65, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x11, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x64, + 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, + 0x72, 0x61, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x76, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x76, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x22, 0xa1, 0x09, 0x0a, 0x0a, 0x53, 0x70, 0x6f, 0x74, 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, 0x0d, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x52, + 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x43, 0x0a, + 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, - 0x69, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x0d, 0x70, 0x65, 0x67, 0x67, 0x65, - 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0c, - 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0f, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, - 0x62, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x42, - 0x65, 0x73, 0x74, 0x42, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, - 0x65, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, - 0x61, 0x73, 0x74, 0x42, 0x65, 0x73, 0x74, 0x41, 0x73, 0x6b, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x69, 0x64, 0x42, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0c, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x64, 0x5f, 0x61, 0x73, 0x6b, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x69, 0x64, 0x41, 0x73, 0x6b, 0x12, 0x35, - 0x0a, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x14, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x71, - 0x75, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1a, 0x6c, 0x61, - 0x73, 0x74, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x44, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0c, 0x65, 0x71, 0x75, 0x69, - 0x74, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x0b, 0x65, - 0x71, 0x75, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x0c, 0x66, 0x65, 0x65, 0x5f, - 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x46, 0x65, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x66, - 0x65, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x65, - 0x78, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x78, 0x74, 0x4d, 0x61, 0x72, - 0x6b, 0x54, 0x6f, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x64, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, - 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x14, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x52, 0x12, 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x43, 0x0a, 0x0d, 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x67, + 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0c, 0x70, 0x65, 0x67, 0x67, 0x65, + 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x22, 0x0a, + 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x65, 0x73, 0x74, 0x42, 0x69, + 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x61, + 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x65, + 0x73, 0x74, 0x41, 0x73, 0x6b, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x69, + 0x64, 0x5f, 0x62, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x61, 0x73, + 0x74, 0x4d, 0x69, 0x64, 0x42, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6d, 0x69, 0x64, 0x5f, 0x61, 0x73, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, + 0x61, 0x73, 0x74, 0x4d, 0x69, 0x64, 0x41, 0x73, 0x6b, 0x12, 0x35, 0x0a, 0x17, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x71, 0x75, + 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0c, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x71, 0x75, + 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x0b, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x0c, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x70, 0x6c, 0x69, 0x74, + 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, + 0x53, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x66, 0x65, 0x65, 0x53, 0x70, 0x6c, + 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x78, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x54, 0x6f, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, + 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, + 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x3d, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x12, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x38, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x09, 0x66, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x61, + 0x73, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x68, 0x61, 0x73, 0x54, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 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, 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, 0x0d, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x52, + 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x43, 0x0a, + 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x43, 0x0a, 0x0d, 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x67, + 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0c, 0x70, 0x65, 0x67, 0x67, 0x65, + 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x22, 0x0a, + 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x65, 0x73, 0x74, 0x42, 0x69, + 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x61, + 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x65, + 0x73, 0x74, 0x41, 0x73, 0x6b, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x69, + 0x64, 0x5f, 0x62, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x61, 0x73, + 0x74, 0x4d, 0x69, 0x64, 0x42, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x6d, 0x69, 0x64, 0x5f, 0x61, 0x73, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, + 0x61, 0x73, 0x74, 0x4d, 0x69, 0x64, 0x41, 0x73, 0x6b, 0x12, 0x35, 0x0a, 0x17, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1a, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x71, 0x75, + 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0c, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x71, 0x75, + 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x0b, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x66, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x72, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x12, + 0x28, 0x0a, 0x10, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x6c, + 0x6f, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x69, 0x73, 0x6b, 0x46, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4c, 0x6f, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x1d, 0x72, 0x69, 0x73, + 0x6b, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, + 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x1a, 0x72, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x43, 0x6f, 0x6e, 0x73, + 0x65, 0x6e, 0x73, 0x75, 0x73, 0x52, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0c, + 0x66, 0x65, 0x65, 0x5f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, + 0x72, 0x52, 0x0b, 0x66, 0x65, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x27, + 0x0a, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x65, 0x78, 0x74, 0x5f, + 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x78, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x54, 0x6f, + 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, + 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x64, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x15, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, + 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x65, 0x64, + 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x3d, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x12, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x33, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x66, 0x65, 0x65, 0x73, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, 0x66, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x16, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x68, 0x61, 0x73, 0x54, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x4c, - 0x0a, 0x10, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 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, - 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, - 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, - 0x69, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x12, 0x43, 0x0a, 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 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, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x0d, 0x70, 0x65, 0x67, 0x67, 0x65, - 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0c, - 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x0f, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x73, 0x74, 0x5f, - 0x62, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x42, - 0x65, 0x73, 0x74, 0x42, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, - 0x65, 0x73, 0x74, 0x5f, 0x61, 0x73, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6c, - 0x61, 0x73, 0x74, 0x42, 0x65, 0x73, 0x74, 0x41, 0x73, 0x6b, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x64, 0x5f, 0x62, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x69, 0x64, 0x42, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0c, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x69, 0x64, 0x5f, 0x61, 0x73, 0x6b, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x69, 0x64, 0x41, 0x73, 0x6b, 0x12, 0x35, - 0x0a, 0x17, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x14, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x71, - 0x75, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1a, 0x6c, 0x61, - 0x73, 0x74, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x44, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0c, 0x65, 0x71, 0x75, 0x69, - 0x74, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x71, 0x75, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x0b, 0x65, - 0x71, 0x75, 0x69, 0x74, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x69, 0x73, 0x6b, - 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x66, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x5f, 0x6c, 0x6f, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x72, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x4c, 0x6f, 0x6e, 0x67, 0x12, 0x41, - 0x0a, 0x1d, 0x72, 0x69, 0x73, 0x6b, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x6f, - 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x63, 0x68, 0x65, 0x64, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x72, 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, - 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x73, 0x75, 0x73, 0x52, 0x65, 0x61, 0x63, 0x68, 0x65, - 0x64, 0x12, 0x40, 0x0a, 0x0c, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x74, 0x65, - 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x53, 0x70, - 0x6c, 0x69, 0x74, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x66, 0x65, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, - 0x74, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2d, 0x0a, 0x13, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x78, 0x74, 0x4d, - 0x61, 0x72, 0x6b, 0x54, 0x6f, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, - 0x65, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, + 0x53, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x14, 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, - 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x19, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x52, 0x12, 0x65, 0x78, 0x70, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x6f, 0x70, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x66, 0x65, - 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x46, 0x65, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, 0x66, 0x65, 0x65, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x6d, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x1c, 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, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x11, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5e, 0x0a, 0x15, 0x6d, 0x61, 0x72, - 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, - 0x6f, 0x72, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, - 0x61, 0x74, 0x6f, 0x72, 0x52, 0x13, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, - 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x7e, 0x0a, 0x23, 0x69, 0x6e, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x11, 0x70, 0x61, 0x72, 0x74, 0x79, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5e, 0x0a, 0x15, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x1d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x52, + 0x13, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x7e, 0x0a, 0x23, 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, 0x18, 0x1e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, + 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x22, 0x6e, 0x65, 0x78, 0x74, 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, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x73, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, - 0x6f, 0x72, 0x48, 0x00, 0x52, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x63, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x1e, 0x6e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x63, - 0x75, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x22, 0x6e, 0x65, 0x78, - 0x74, 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, 0x18, - 0x1f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1e, 0x6e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x43, 0x61, 0x6c, 0x63, 0x12, 0x4c, 0x0a, 0x10, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, - 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x20, 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, 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, + 0x12, 0x4c, 0x0a, 0x10, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x18, 0x20, 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, 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, 0xc0, 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, 0x44, 0x0a, 0x0d, 0x61, + 0x6d, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 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, 0x61, 0x6d, 0x6d, 0x50, 0x61, 0x72, 0x74, 0x79, 0x49, 0x64, + 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, 0xed, 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, 0x70, 0x76, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x70, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0xaa, 0x03, 0x0a, 0x04, 0x50, + 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x61, 0x6d, 0x6d, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6d, 0x6d, 0x50, 0x61, + 0x72, 0x74, 0x79, 0x49, 0x64, 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, 0x53, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 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, 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, 0x32, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x4d, 0x4d, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, 0x64, + 0x5f, 0x66, 0x65, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x70, + 0x6f, 0x73, 0x65, 0x64, 0x46, 0x65, 0x65, 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, 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, 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, + 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, 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, 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, + 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, 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, 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, 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, + 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, 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, - 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, 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, + 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, 0xe5, 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, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, + 0x70, 0x72, 0x65, 0x76, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 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, - 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, + 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, 0x8e, 0x01, 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, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, + 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x72, + 0x69, 0x76, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 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, 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, 0x22, 0x33, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x54, 0x78, 0x12, + 0x0e, 0x0a, 0x02, 0x74, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x02, 0x74, 0x78, 0x12, + 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x38, 0x0a, 0x07, 0x54, 0x78, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x12, 0x2d, 0x0a, 0x03, 0x74, 0x78, 0x73, 0x18, 0x01, 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, 0x65, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x54, 0x78, 0x52, 0x03, 0x74, 0x78, + 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x16, 0x45, 0x56, 0x4d, 0x46, 0x77, 0x64, 0x50, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 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, 0x29, + 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, + 0x63, 0x74, 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, 0x79, 0x0a, 0x0e, 0x45, 0x56, 0x4d, 0x46, 0x77, 0x64, 0x4c, 0x61, + 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 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, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 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, + 0xaa, 0x01, 0x0a, 0x10, 0x45, 0x56, 0x4d, 0x46, 0x77, 0x64, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 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, 0x45, 0x56, 0x4d, 0x46, 0x77, 0x64, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x52, 0x11, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x73, 0x12, 0x3d, 0x0a, + 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x65, 0x6e, 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, 0x45, 0x56, 0x4d, 0x46, 0x77, 0x64, 0x4c, 0x61, 0x73, 0x74, 0x53, 0x65, + 0x65, 0x6e, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 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 +17353,257 @@ 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, 200) 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 + (*DelayedTx)(nil), // 194: vega.snapshot.v1.DelayedTx + (*TxCache)(nil), // 195: vega.snapshot.v1.TxCache + (*EVMFwdPendingHeartbeat)(nil), // 196: vega.snapshot.v1.EVMFwdPendingHeartbeat + (*EVMFwdLastSeen)(nil), // 197: vega.snapshot.v1.EVMFwdLastSeen + (*EVMFwdHeartbeats)(nil), // 198: vega.snapshot.v1.EVMFwdHeartbeats + (*PoolMapEntry_Curve)(nil), // 199: vega.snapshot.v1.PoolMapEntry.Curve + (*PoolMapEntry_Pool)(nil), // 200: vega.snapshot.v1.PoolMapEntry.Pool + (*v1.Signer)(nil), // 201: vega.data.v1.Signer + (*v1.Property)(nil), // 202: vega.data.v1.Property + (*vega.Account)(nil), // 203: vega.Account + (*vega.Asset)(nil), // 204: vega.Asset + (*vega.Withdrawal)(nil), // 205: vega.Withdrawal + (*vega.Deposit)(nil), // 206: vega.Deposit + (*v11.AssetAction)(nil), // 207: vega.checkpoint.v1.AssetAction + (*v11.RecurringTransfers)(nil), // 208: vega.checkpoint.v1.RecurringTransfers + (*v11.ScheduledTransferAtTime)(nil), // 209: vega.checkpoint.v1.ScheduledTransferAtTime + (*v11.GovernanceTransfer)(nil), // 210: vega.checkpoint.v1.GovernanceTransfer + (*v11.ScheduledGovernanceTransferAtTime)(nil), // 211: vega.checkpoint.v1.ScheduledGovernanceTransferAtTime + (*v11.BridgeState)(nil), // 212: vega.checkpoint.v1.BridgeState + (*vega.Delegation)(nil), // 213: vega.Delegation + (*vega.Proposal)(nil), // 214: vega.Proposal + (*vega.Vote)(nil), // 215: vega.Vote + (*v12.StakeLinking)(nil), // 216: vega.events.v1.StakeLinking + (*vega.StakeTotalSupply)(nil), // 217: vega.StakeTotalSupply + (*vega.Order)(nil), // 218: vega.Order + (*vega.NetworkParameter)(nil), // 219: vega.NetworkParameter + (*vega.PriceMonitoringTrigger)(nil), // 220: vega.PriceMonitoringTrigger + (vega.Market_TradingMode)(0), // 221: vega.Market.TradingMode + (vega.AuctionTrigger)(0), // 222: vega.AuctionTrigger + (*vega.AuctionDuration)(nil), // 223: vega.AuctionDuration + (*vega.Market)(nil), // 224: vega.Market + (*v12.FeesStats)(nil), // 225: vega.events.v1.FeesStats + (*v12.StopOrderEvent)(nil), // 226: vega.events.v1.StopOrderEvent + (*v11.MarketState)(nil), // 227: vega.checkpoint.v1.MarketState + (*v12.ValidatorUpdate)(nil), // 228: vega.events.v1.ValidatorUpdate + (*vega.RankingScore)(nil), // 229: vega.RankingScore + (*vega.LiquidityProvision)(nil), // 230: vega.LiquidityProvision + (*vega.LiquiditySLAParameters)(nil), // 231: vega.LiquiditySLAParameters + (*v12.PaidLiquidityFeesStats)(nil), // 232: vega.events.v1.PaidLiquidityFeesStats + (*vega.KeyValueBundle)(nil), // 233: vega.KeyValueBundle + (*v11.MarketActivityTracker)(nil), // 234: vega.checkpoint.v1.MarketActivityTracker + (*v11.TakerNotionalVolume)(nil), // 235: vega.checkpoint.v1.TakerNotionalVolume + (*v11.MarketToPartyTakerNotionalVolume)(nil), // 236: vega.checkpoint.v1.MarketToPartyTakerNotionalVolume + (*v11.EpochPartyTakerFees)(nil), // 237: vega.checkpoint.v1.EpochPartyTakerFees + (*v12.ERC20MultiSigSignerEvent)(nil), // 238: vega.events.v1.ERC20MultiSigSignerEvent + (*v12.ERC20MultiSigThresholdSetEvent)(nil), // 239: vega.events.v1.ERC20MultiSigThresholdSetEvent + (*v12.ProtocolUpgradeEvent)(nil), // 240: vega.events.v1.ProtocolUpgradeEvent + (*vega.ReferralProgram)(nil), // 241: vega.ReferralProgram + (*vega.VolumeDiscountProgram)(nil), // 242: vega.VolumeDiscountProgram + (*vega.LiquidationStrategy)(nil), // 243: vega.LiquidationStrategy + (*vega.CompositePriceConfiguration)(nil), // 244: vega.CompositePriceConfiguration + (*vega.Trade)(nil), // 245: vega.Trade + (*vega.Metadata)(nil), // 246: vega.Metadata + (*v12.AMM_ConcentratedLiquidityParameters)(nil), // 247: vega.events.v1.AMM.ConcentratedLiquidityParameters + (v12.AMM_Status)(0), // 248: vega.events.v1.AMM.Status } var file_vega_snapshot_v1_snapshot_proto_depIdxs = []int32{ 0, // 0: vega.snapshot.v1.Snapshot.format:type_name -> vega.snapshot.v1.Format @@ -16673,290 +17626,305 @@ 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 - 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 - 8, // 86: vega.snapshot.v1.SpotLiquidityTarget.previous_total_stake:type_name -> vega.snapshot.v1.TimestampedTotalStake - 8, // 87: vega.snapshot.v1.SpotLiquidityTarget.max_total_stake:type_name -> vega.snapshot.v1.TimestampedTotalStake - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 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 - 58, // 137: vega.snapshot.v1.PriceMonitor.bounds:type_name -> vega.snapshot.v1.PriceBound - 59, // 138: vega.snapshot.v1.PriceMonitor.price_range_cache:type_name -> vega.snapshot.v1.PriceRangeCache - 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 - 64, // 147: vega.snapshot.v1.EquityShare.lps:type_name -> vega.snapshot.v1.EquityShareLP - 213, // 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 - 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 - 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 - 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 - 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 + 154, // 82: vega.snapshot.v1.Payload.evm_multisig_topologies:type_name -> vega.snapshot.v1.EVMMultisigTopologies + 195, // 83: vega.snapshot.v1.Payload.tx_cache:type_name -> vega.snapshot.v1.TxCache + 198, // 84: vega.snapshot.v1.Payload.evm_fwd_heartbeats:type_name -> vega.snapshot.v1.EVMFwdHeartbeats + 6, // 85: vega.snapshot.v1.HoldingAccountTracker.order_holding:type_name -> vega.snapshot.v1.OrderHoldingQuantities + 9, // 86: vega.snapshot.v1.LiquidityTarget.previous_open_interests:type_name -> vega.snapshot.v1.TimestampedOpenInterest + 9, // 87: vega.snapshot.v1.LiquidityTarget.max_open_interests:type_name -> vega.snapshot.v1.TimestampedOpenInterest + 8, // 88: vega.snapshot.v1.SpotLiquidityTarget.previous_total_stake:type_name -> vega.snapshot.v1.TimestampedTotalStake + 8, // 89: vega.snapshot.v1.SpotLiquidityTarget.max_total_stake:type_name -> vega.snapshot.v1.TimestampedTotalStake + 12, // 90: vega.snapshot.v1.LiquiditySupplied.bid_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair + 12, // 91: vega.snapshot.v1.LiquiditySupplied.ask_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair + 15, // 92: vega.snapshot.v1.OracleDataBatch.oracle_data:type_name -> vega.snapshot.v1.OracleData + 201, // 93: vega.snapshot.v1.OracleData.signers:type_name -> vega.data.v1.Signer + 16, // 94: vega.snapshot.v1.OracleData.data:type_name -> vega.snapshot.v1.OracleDataPair + 202, // 95: vega.snapshot.v1.OracleData.meta_data:type_name -> vega.data.v1.Property + 18, // 96: vega.snapshot.v1.Witness.resources:type_name -> vega.snapshot.v1.Resource + 19, // 97: vega.snapshot.v1.EventForwarder.buckets:type_name -> vega.snapshot.v1.EventForwarderBucket + 203, // 98: vega.snapshot.v1.CollateralAccounts.accounts:type_name -> vega.Account + 204, // 99: vega.snapshot.v1.CollateralAssets.assets:type_name -> vega.Asset + 204, // 100: vega.snapshot.v1.ActiveAssets.assets:type_name -> vega.Asset + 204, // 101: vega.snapshot.v1.PendingAssets.assets:type_name -> vega.Asset + 204, // 102: vega.snapshot.v1.PendingAssetUpdates.assets:type_name -> vega.Asset + 205, // 103: vega.snapshot.v1.Withdrawal.withdrawal:type_name -> vega.Withdrawal + 206, // 104: vega.snapshot.v1.Deposit.deposit:type_name -> vega.Deposit + 26, // 105: vega.snapshot.v1.BankingWithdrawals.withdrawals:type_name -> vega.snapshot.v1.Withdrawal + 27, // 106: vega.snapshot.v1.BankingDeposits.deposit:type_name -> vega.snapshot.v1.Deposit + 207, // 107: vega.snapshot.v1.BankingAssetActions.asset_action:type_name -> vega.checkpoint.v1.AssetAction + 208, // 108: vega.snapshot.v1.BankingRecurringTransfers.recurring_transfers:type_name -> vega.checkpoint.v1.RecurringTransfers + 209, // 109: vega.snapshot.v1.BankingScheduledTransfers.transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledTransferAtTime + 210, // 110: vega.snapshot.v1.BankingRecurringGovernanceTransfers.recurring_transfers:type_name -> vega.checkpoint.v1.GovernanceTransfer + 211, // 111: vega.snapshot.v1.BankingScheduledGovernanceTransfers.transfers_at_time:type_name -> vega.checkpoint.v1.ScheduledGovernanceTransferAtTime + 212, // 112: vega.snapshot.v1.BankingBridgeState.bridge_state:type_name -> vega.checkpoint.v1.BridgeState + 212, // 113: vega.snapshot.v1.BankingEVMBridgeStates.bridge_states:type_name -> vega.checkpoint.v1.BridgeState + 213, // 114: vega.snapshot.v1.DelegationActive.delegations:type_name -> vega.Delegation + 213, // 115: vega.snapshot.v1.DelegationPending.delegations:type_name -> vega.Delegation + 213, // 116: vega.snapshot.v1.DelegationPending.undelegation:type_name -> vega.Delegation + 214, // 117: vega.snapshot.v1.ProposalData.proposal:type_name -> vega.Proposal + 215, // 118: vega.snapshot.v1.ProposalData.yes:type_name -> vega.Vote + 215, // 119: vega.snapshot.v1.ProposalData.no:type_name -> vega.Vote + 215, // 120: vega.snapshot.v1.ProposalData.invalid:type_name -> vega.Vote + 44, // 121: vega.snapshot.v1.GovernanceEnacted.proposals:type_name -> vega.snapshot.v1.ProposalData + 44, // 122: vega.snapshot.v1.GovernanceActive.proposals:type_name -> vega.snapshot.v1.ProposalData + 44, // 123: vega.snapshot.v1.BatchProposalData.batch_proposal:type_name -> vega.snapshot.v1.ProposalData + 214, // 124: vega.snapshot.v1.BatchProposalData.proposals:type_name -> vega.Proposal + 47, // 125: vega.snapshot.v1.GovernanceBatchActive.batch_proposals:type_name -> vega.snapshot.v1.BatchProposalData + 214, // 126: vega.snapshot.v1.GovernanceNode.proposals:type_name -> vega.Proposal + 44, // 127: vega.snapshot.v1.GovernanceNode.proposal_data:type_name -> vega.snapshot.v1.ProposalData + 47, // 128: vega.snapshot.v1.GovernanceNode.batch_proposal_data:type_name -> vega.snapshot.v1.BatchProposalData + 216, // 129: vega.snapshot.v1.StakingAccount.events:type_name -> vega.events.v1.StakeLinking + 50, // 130: vega.snapshot.v1.StakingAccounts.accounts:type_name -> vega.snapshot.v1.StakingAccount + 217, // 131: vega.snapshot.v1.StakingAccounts.pending_stake_total_supply:type_name -> vega.StakeTotalSupply + 218, // 132: vega.snapshot.v1.MatchingBook.buy:type_name -> vega.Order + 218, // 133: vega.snapshot.v1.MatchingBook.sell:type_name -> vega.Order + 219, // 134: vega.snapshot.v1.NetParams.params:type_name -> vega.NetworkParameter + 220, // 135: vega.snapshot.v1.PriceBound.trigger:type_name -> vega.PriceMonitoringTrigger + 58, // 136: vega.snapshot.v1.PriceRangeCache.bound:type_name -> vega.snapshot.v1.PriceBound + 57, // 137: vega.snapshot.v1.PriceRangeCache.range:type_name -> vega.snapshot.v1.PriceRange + 54, // 138: vega.snapshot.v1.PriceMonitor.fp_horizons:type_name -> vega.snapshot.v1.DecimalMap + 58, // 139: vega.snapshot.v1.PriceMonitor.bounds:type_name -> vega.snapshot.v1.PriceBound + 59, // 140: vega.snapshot.v1.PriceMonitor.price_range_cache:type_name -> vega.snapshot.v1.PriceRangeCache + 54, // 141: vega.snapshot.v1.PriceMonitor.ref_price_cache:type_name -> vega.snapshot.v1.DecimalMap + 60, // 142: vega.snapshot.v1.PriceMonitor.prices_now:type_name -> vega.snapshot.v1.CurrentPrice + 61, // 143: vega.snapshot.v1.PriceMonitor.prices_past:type_name -> vega.snapshot.v1.PastPrice + 221, // 144: vega.snapshot.v1.AuctionState.mode:type_name -> vega.Market.TradingMode + 221, // 145: vega.snapshot.v1.AuctionState.default_mode:type_name -> vega.Market.TradingMode + 222, // 146: vega.snapshot.v1.AuctionState.trigger:type_name -> vega.AuctionTrigger + 223, // 147: vega.snapshot.v1.AuctionState.end:type_name -> vega.AuctionDuration + 222, // 148: vega.snapshot.v1.AuctionState.extension:type_name -> vega.AuctionTrigger + 64, // 149: vega.snapshot.v1.EquityShare.lps:type_name -> vega.snapshot.v1.EquityShareLP + 224, // 150: vega.snapshot.v1.SpotMarket.market:type_name -> vega.Market + 62, // 151: vega.snapshot.v1.SpotMarket.price_monitor:type_name -> vega.snapshot.v1.PriceMonitor + 63, // 152: vega.snapshot.v1.SpotMarket.auction_state:type_name -> vega.snapshot.v1.AuctionState + 84, // 153: vega.snapshot.v1.SpotMarket.pegged_orders:type_name -> vega.snapshot.v1.PeggedOrders + 218, // 154: vega.snapshot.v1.SpotMarket.expiring_orders:type_name -> vega.Order + 65, // 155: vega.snapshot.v1.SpotMarket.equity_share:type_name -> vega.snapshot.v1.EquityShare + 66, // 156: vega.snapshot.v1.SpotMarket.fee_splitter:type_name -> vega.snapshot.v1.FeeSplitter + 83, // 157: vega.snapshot.v1.SpotMarket.stop_orders:type_name -> vega.snapshot.v1.StopOrders + 218, // 158: vega.snapshot.v1.SpotMarket.expiring_stop_orders:type_name -> vega.Order + 225, // 159: vega.snapshot.v1.SpotMarket.fees_stats:type_name -> vega.events.v1.FeesStats + 193, // 160: vega.snapshot.v1.SpotMarket.market_liquidity:type_name -> vega.snapshot.v1.MarketLiquidity + 224, // 161: vega.snapshot.v1.Market.market:type_name -> vega.Market + 62, // 162: vega.snapshot.v1.Market.price_monitor:type_name -> vega.snapshot.v1.PriceMonitor + 63, // 163: vega.snapshot.v1.Market.auction_state:type_name -> vega.snapshot.v1.AuctionState + 84, // 164: vega.snapshot.v1.Market.pegged_orders:type_name -> vega.snapshot.v1.PeggedOrders + 218, // 165: vega.snapshot.v1.Market.expiring_orders:type_name -> vega.Order + 65, // 166: vega.snapshot.v1.Market.equity_share:type_name -> vega.snapshot.v1.EquityShare + 66, // 167: vega.snapshot.v1.Market.fee_splitter:type_name -> vega.snapshot.v1.FeeSplitter + 83, // 168: vega.snapshot.v1.Market.stop_orders:type_name -> vega.snapshot.v1.StopOrders + 218, // 169: vega.snapshot.v1.Market.expiring_stop_orders:type_name -> vega.Order + 73, // 170: vega.snapshot.v1.Market.product:type_name -> vega.snapshot.v1.Product + 225, // 171: vega.snapshot.v1.Market.fees_stats:type_name -> vega.events.v1.FeesStats + 69, // 172: vega.snapshot.v1.Market.party_margin_factor:type_name -> vega.snapshot.v1.PartyMarginFactor + 189, // 173: vega.snapshot.v1.Market.mark_price_calculator:type_name -> vega.snapshot.v1.CompositePriceCalculator + 189, // 174: vega.snapshot.v1.Market.internal_composite_price_calculator:type_name -> vega.snapshot.v1.CompositePriceCalculator + 193, // 175: vega.snapshot.v1.Market.market_liquidity:type_name -> vega.snapshot.v1.MarketLiquidity + 70, // 176: vega.snapshot.v1.Market.amm:type_name -> vega.snapshot.v1.AmmState + 72, // 177: vega.snapshot.v1.AmmState.sqrter:type_name -> vega.snapshot.v1.StringMapEntry + 72, // 178: vega.snapshot.v1.AmmState.amm_party_ids:type_name -> vega.snapshot.v1.StringMapEntry + 71, // 179: vega.snapshot.v1.AmmState.pools:type_name -> vega.snapshot.v1.PoolMapEntry + 200, // 180: vega.snapshot.v1.PoolMapEntry.pool:type_name -> vega.snapshot.v1.PoolMapEntry.Pool + 77, // 181: vega.snapshot.v1.Product.perps:type_name -> vega.snapshot.v1.Perps + 74, // 182: vega.snapshot.v1.Perps.external_data_point:type_name -> vega.snapshot.v1.DataPoint + 74, // 183: vega.snapshot.v1.Perps.internal_data_point:type_name -> vega.snapshot.v1.DataPoint + 76, // 184: vega.snapshot.v1.Perps.external_twap_data:type_name -> vega.snapshot.v1.TWAPData + 76, // 185: vega.snapshot.v1.Perps.internal_twap_data:type_name -> vega.snapshot.v1.TWAPData + 75, // 186: vega.snapshot.v1.Perps.auction_intervals:type_name -> vega.snapshot.v1.AuctionIntervals + 78, // 187: vega.snapshot.v1.PricedStopOrders.falls_bellow:type_name -> vega.snapshot.v1.OrdersAtPrice + 78, // 188: vega.snapshot.v1.PricedStopOrders.rises_above:type_name -> vega.snapshot.v1.OrdersAtPrice + 82, // 189: vega.snapshot.v1.TrailingStopOrders.falls_bellow:type_name -> vega.snapshot.v1.OffsetsAtPrice + 82, // 190: vega.snapshot.v1.TrailingStopOrders.rises_above:type_name -> vega.snapshot.v1.OffsetsAtPrice + 81, // 191: vega.snapshot.v1.OffsetsAtPrice.offsets:type_name -> vega.snapshot.v1.OrdersAtOffset + 226, // 192: vega.snapshot.v1.StopOrders.stop_orders:type_name -> vega.events.v1.StopOrderEvent + 79, // 193: vega.snapshot.v1.StopOrders.priced_stop_orders:type_name -> vega.snapshot.v1.PricedStopOrders + 80, // 194: vega.snapshot.v1.StopOrders.trailing_stop_orders:type_name -> vega.snapshot.v1.TrailingStopOrders + 218, // 195: vega.snapshot.v1.PeggedOrders.parked_orders:type_name -> vega.Order + 68, // 196: vega.snapshot.v1.ExecutionMarkets.markets:type_name -> vega.snapshot.v1.Market + 67, // 197: vega.snapshot.v1.ExecutionMarkets.spot_markets:type_name -> vega.snapshot.v1.SpotMarket + 227, // 198: vega.snapshot.v1.ExecutionMarkets.settled_markets:type_name -> vega.checkpoint.v1.MarketState + 87, // 199: vega.snapshot.v1.ExecutionMarkets.successors:type_name -> vega.snapshot.v1.Successors + 85, // 200: vega.snapshot.v1.ExecutionMarkets.sla_network_params:type_name -> vega.snapshot.v1.SLANetworkParams + 88, // 201: vega.snapshot.v1.MarketPositions.positions:type_name -> vega.snapshot.v1.Position + 90, // 202: vega.snapshot.v1.MarketPositions.parties_records:type_name -> vega.snapshot.v1.PartyPositionStats + 92, // 203: vega.snapshot.v1.SettlementState.last_settled_positions:type_name -> vega.snapshot.v1.LastSettledPosition + 93, // 204: vega.snapshot.v1.SettlementState.trades:type_name -> vega.snapshot.v1.SettlementTrade + 97, // 205: vega.snapshot.v1.RewardsPendingPayouts.scheduled_rewards_payout:type_name -> vega.snapshot.v1.ScheduledRewardsPayout + 98, // 206: vega.snapshot.v1.ScheduledRewardsPayout.rewards_payout:type_name -> vega.snapshot.v1.RewardsPayout + 99, // 207: vega.snapshot.v1.RewardsPayout.reward_party_amount:type_name -> vega.snapshot.v1.RewardsPartyAmount + 102, // 208: vega.snapshot.v1.VoteSpamPolicy.party_to_vote:type_name -> vega.snapshot.v1.PartyProposalVoteCount + 156, // 209: vega.snapshot.v1.VoteSpamPolicy.banned_parties:type_name -> vega.snapshot.v1.BannedParty + 103, // 210: vega.snapshot.v1.VoteSpamPolicy.token_balance:type_name -> vega.snapshot.v1.PartyTokenBalance + 104, // 211: vega.snapshot.v1.VoteSpamPolicy.recent_blocks_reject_stats:type_name -> vega.snapshot.v1.BlockRejectStats + 105, // 212: vega.snapshot.v1.SimpleSpamPolicy.party_to_count:type_name -> vega.snapshot.v1.SpamPartyTransactionCount + 156, // 213: vega.snapshot.v1.SimpleSpamPolicy.banned_parties:type_name -> vega.snapshot.v1.BannedParty + 103, // 214: vega.snapshot.v1.SimpleSpamPolicy.token_balance:type_name -> vega.snapshot.v1.PartyTokenBalance + 107, // 215: vega.snapshot.v1.Notary.notary_sigs:type_name -> vega.snapshot.v1.NotarySigs + 111, // 216: vega.snapshot.v1.StakeVerifierDeposited.pending_deposited:type_name -> vega.snapshot.v1.StakeVerifierPending + 111, // 217: vega.snapshot.v1.StakeVerifierRemoved.pending_removed:type_name -> vega.snapshot.v1.StakeVerifierPending + 113, // 218: vega.snapshot.v1.L2EthOracles.chain_id_eth_oracles:type_name -> vega.snapshot.v1.ChainIdEthOracles + 114, // 219: vega.snapshot.v1.ChainIdEthOracles.last_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock + 116, // 220: vega.snapshot.v1.ChainIdEthOracles.call_results:type_name -> vega.snapshot.v1.EthContractCallResults + 115, // 221: vega.snapshot.v1.ChainIdEthOracles.misc:type_name -> vega.snapshot.v1.EthOracleVerifierMisc + 118, // 222: vega.snapshot.v1.EthOracleVerifierMisc.buckets:type_name -> vega.snapshot.v1.EthVerifierBucket + 114, // 223: vega.snapshot.v1.EthOracleVerifierMisc.patch_block:type_name -> vega.snapshot.v1.EthOracleVerifierLastBlock + 117, // 224: vega.snapshot.v1.EthContractCallResults.pending_contract_call_result:type_name -> vega.snapshot.v1.EthContractCallResult + 125, // 225: vega.snapshot.v1.Topology.validator_data:type_name -> vega.snapshot.v1.ValidatorState + 119, // 226: vega.snapshot.v1.Topology.pending_pub_key_rotations:type_name -> vega.snapshot.v1.PendingKeyRotation + 128, // 227: vega.snapshot.v1.Topology.validator_performance:type_name -> vega.snapshot.v1.ValidatorPerformance + 120, // 228: vega.snapshot.v1.Topology.pending_ethereum_key_rotations:type_name -> vega.snapshot.v1.PendingEthereumKeyRotation + 122, // 229: vega.snapshot.v1.Topology.signatures:type_name -> vega.snapshot.v1.ToplogySignatures + 120, // 230: vega.snapshot.v1.Topology.unsolved_ethereum_key_rotations:type_name -> vega.snapshot.v1.PendingEthereumKeyRotation + 123, // 231: vega.snapshot.v1.ToplogySignatures.pending_signatures:type_name -> vega.snapshot.v1.PendingERC20MultisigControlSignature + 124, // 232: vega.snapshot.v1.ToplogySignatures.issued_signatures:type_name -> vega.snapshot.v1.IssuedERC20MultisigControlSignature + 228, // 233: vega.snapshot.v1.ValidatorState.validator_update:type_name -> vega.events.v1.ValidatorUpdate + 126, // 234: vega.snapshot.v1.ValidatorState.heartbeat_tracker:type_name -> vega.snapshot.v1.HeartbeatTracker + 229, // 235: vega.snapshot.v1.ValidatorState.ranking_score:type_name -> vega.RankingScore + 127, // 236: vega.snapshot.v1.ValidatorPerformance.validator_perf_stats:type_name -> vega.snapshot.v1.PerformanceStats + 132, // 237: vega.snapshot.v1.LiquidityPartiesLiquidityOrders.party_orders:type_name -> vega.snapshot.v1.PartyOrders + 218, // 238: vega.snapshot.v1.PartyOrders.orders:type_name -> vega.Order + 132, // 239: vega.snapshot.v1.LiquidityPartiesOrders.party_orders:type_name -> vega.snapshot.v1.PartyOrders + 230, // 240: vega.snapshot.v1.LiquidityProvisions.liquidity_provisions:type_name -> vega.LiquidityProvision + 136, // 241: vega.snapshot.v1.LiquidityScores.scores:type_name -> vega.snapshot.v1.LiquidityScore + 231, // 242: vega.snapshot.v1.LiquidityV2Parameters.market_sla_parameters:type_name -> vega.LiquiditySLAParameters + 232, // 243: vega.snapshot.v1.LiquidityV2PaidFeesStats.stats:type_name -> vega.events.v1.PaidLiquidityFeesStats + 230, // 244: vega.snapshot.v1.LiquidityV2Provisions.liquidity_provisions:type_name -> vega.LiquidityProvision + 230, // 245: vega.snapshot.v1.LiquidityV2PendingProvisions.pending_liquidity_provisions:type_name -> vega.LiquidityProvision + 142, // 246: vega.snapshot.v1.LiquidityV2Performances.performance_per_party:type_name -> vega.snapshot.v1.LiquidityV2PerformancePerParty + 136, // 247: vega.snapshot.v1.LiquidityV2Scores.scores:type_name -> vega.snapshot.v1.LiquidityScore + 12, // 248: vega.snapshot.v1.LiquidityV2Supplied.bid_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair + 12, // 249: vega.snapshot.v1.LiquidityV2Supplied.ask_cache:type_name -> vega.snapshot.v1.LiquidityOffsetProbabilityPair + 148, // 250: vega.snapshot.v1.FloatingPointConsensus.next_time_trigger:type_name -> vega.snapshot.v1.NextTimeTrigger + 146, // 251: vega.snapshot.v1.FloatingPointConsensus.state_variables:type_name -> vega.snapshot.v1.StateVarInternalState + 147, // 252: vega.snapshot.v1.StateVarInternalState.validators_results:type_name -> vega.snapshot.v1.FloatingPointValidatorResult + 233, // 253: vega.snapshot.v1.FloatingPointValidatorResult.bundle:type_name -> vega.KeyValueBundle + 234, // 254: vega.snapshot.v1.MarketTracker.market_activity:type_name -> vega.checkpoint.v1.MarketActivityTracker + 235, // 255: vega.snapshot.v1.MarketTracker.taker_notional_volume:type_name -> vega.checkpoint.v1.TakerNotionalVolume + 236, // 256: vega.snapshot.v1.MarketTracker.market_to_party_taker_notional_volume:type_name -> vega.checkpoint.v1.MarketToPartyTakerNotionalVolume + 237, // 257: vega.snapshot.v1.MarketTracker.epoch_taker_fees:type_name -> vega.checkpoint.v1.EpochPartyTakerFees + 238, // 258: vega.snapshot.v1.SignerEventsPerAddress.events:type_name -> vega.events.v1.ERC20MultiSigSignerEvent + 150, // 259: vega.snapshot.v1.ERC20MultiSigTopologyVerified.events_per_address:type_name -> vega.snapshot.v1.SignerEventsPerAddress + 239, // 260: vega.snapshot.v1.ERC20MultiSigTopologyVerified.threshold:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent + 238, // 261: vega.snapshot.v1.ERC20MultiSigTopologyPending.pending_signers:type_name -> vega.events.v1.ERC20MultiSigSignerEvent + 239, // 262: vega.snapshot.v1.ERC20MultiSigTopologyPending.pending_threshold_set:type_name -> vega.events.v1.ERC20MultiSigThresholdSetEvent + 151, // 263: vega.snapshot.v1.EVMMultisigTopology.verified:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyVerified + 152, // 264: vega.snapshot.v1.EVMMultisigTopology.pending:type_name -> vega.snapshot.v1.ERC20MultiSigTopologyPending + 153, // 265: vega.snapshot.v1.EVMMultisigTopologies.evm_multisig_topology:type_name -> vega.snapshot.v1.EVMMultisigTopology + 161, // 266: vega.snapshot.v1.ProofOfWork.tx_at_height:type_name -> vega.snapshot.v1.TransactionsAtHeight + 161, // 267: vega.snapshot.v1.ProofOfWork.tid_at_height:type_name -> vega.snapshot.v1.TransactionsAtHeight + 156, // 268: vega.snapshot.v1.ProofOfWork.banned:type_name -> vega.snapshot.v1.BannedParty + 157, // 269: vega.snapshot.v1.ProofOfWork.pow_params:type_name -> vega.snapshot.v1.ProofOfWorkParams + 158, // 270: vega.snapshot.v1.ProofOfWork.pow_state:type_name -> vega.snapshot.v1.ProofOfWorkState + 163, // 271: vega.snapshot.v1.ProofOfWork.nonce_refs_at_height:type_name -> vega.snapshot.v1.NonceRefsAtHeight + 159, // 272: vega.snapshot.v1.ProofOfWorkState.pow_state:type_name -> vega.snapshot.v1.ProofOfWorkBlockState + 160, // 273: vega.snapshot.v1.ProofOfWorkBlockState.party_state:type_name -> vega.snapshot.v1.ProofOfWorkPartyStateForBlock + 162, // 274: vega.snapshot.v1.NonceRefsAtHeight.refs:type_name -> vega.snapshot.v1.NonceRef + 240, // 275: vega.snapshot.v1.ProtocolUpgradeProposals.active_proposals:type_name -> vega.events.v1.ProtocolUpgradeEvent + 165, // 276: vega.snapshot.v1.ProtocolUpgradeProposals.accepted_proposal:type_name -> vega.snapshot.v1.AcceptedProtocolUpgradeProposal + 167, // 277: vega.snapshot.v1.Teams.teams:type_name -> vega.snapshot.v1.Team + 168, // 278: vega.snapshot.v1.Team.referrer:type_name -> vega.snapshot.v1.Membership + 168, // 279: vega.snapshot.v1.Team.referees:type_name -> vega.snapshot.v1.Membership + 170, // 280: vega.snapshot.v1.TeamSwitches.team_switches:type_name -> vega.snapshot.v1.TeamSwitch + 172, // 281: vega.snapshot.v1.Vesting.parties_reward:type_name -> vega.snapshot.v1.PartyReward + 177, // 282: vega.snapshot.v1.PartyReward.asset_locked:type_name -> vega.snapshot.v1.AssetLocked + 179, // 283: vega.snapshot.v1.PartyReward.in_vesting:type_name -> vega.snapshot.v1.InVesting + 176, // 284: vega.snapshot.v1.ReferralProgramData.factor_by_referee:type_name -> vega.snapshot.v1.FactorByReferee + 241, // 285: vega.snapshot.v1.ReferralProgramData.current_program:type_name -> vega.ReferralProgram + 241, // 286: vega.snapshot.v1.ReferralProgramData.new_program:type_name -> vega.ReferralProgram + 174, // 287: vega.snapshot.v1.ReferralProgramData.sets:type_name -> vega.snapshot.v1.ReferralSet + 168, // 288: vega.snapshot.v1.ReferralSet.referrer:type_name -> vega.snapshot.v1.Membership + 168, // 289: vega.snapshot.v1.ReferralSet.referees:type_name -> vega.snapshot.v1.Membership + 175, // 290: vega.snapshot.v1.ReferralSet.running_volumes:type_name -> vega.snapshot.v1.RunningVolume + 178, // 291: vega.snapshot.v1.AssetLocked.epoch_balances:type_name -> vega.snapshot.v1.EpochBalance + 181, // 292: vega.snapshot.v1.ActivityStreak.parties_activity_streak:type_name -> vega.snapshot.v1.PartyActivityStreak + 184, // 293: vega.snapshot.v1.VolumeDiscountProgram.epoch_party_volumes:type_name -> vega.snapshot.v1.EpochPartyVolumes + 185, // 294: vega.snapshot.v1.VolumeDiscountProgram.average_party_volume:type_name -> vega.snapshot.v1.PartyVolume + 242, // 295: vega.snapshot.v1.VolumeDiscountProgram.current_program:type_name -> vega.VolumeDiscountProgram + 242, // 296: vega.snapshot.v1.VolumeDiscountProgram.new_program:type_name -> vega.VolumeDiscountProgram + 183, // 297: vega.snapshot.v1.VolumeDiscountProgram.factors_by_party:type_name -> vega.snapshot.v1.VolumeDiscountStats + 185, // 298: vega.snapshot.v1.EpochPartyVolumes.party_volume:type_name -> vega.snapshot.v1.PartyVolume + 243, // 299: vega.snapshot.v1.Liquidation.config:type_name -> vega.LiquidationStrategy + 187, // 300: vega.snapshot.v1.BankingTransferFeeDiscounts.party_asset_discount:type_name -> vega.snapshot.v1.PartyAssetAmount + 244, // 301: vega.snapshot.v1.CompositePriceCalculator.price_configuration:type_name -> vega.CompositePriceConfiguration + 245, // 302: vega.snapshot.v1.CompositePriceCalculator.trades:type_name -> vega.Trade + 55, // 303: vega.snapshot.v1.CompositePriceCalculator.book_price_at_time:type_name -> vega.snapshot.v1.TimePrice + 191, // 304: vega.snapshot.v1.Parties.profiles:type_name -> vega.snapshot.v1.PartyProfile + 246, // 305: vega.snapshot.v1.PartyProfile.metadata:type_name -> vega.Metadata + 192, // 306: vega.snapshot.v1.MarketLiquidity.amm:type_name -> vega.snapshot.v1.AMMValues + 194, // 307: vega.snapshot.v1.TxCache.txs:type_name -> vega.snapshot.v1.DelayedTx + 196, // 308: vega.snapshot.v1.EVMFwdHeartbeats.pending_heartbeats:type_name -> vega.snapshot.v1.EVMFwdPendingHeartbeat + 197, // 309: vega.snapshot.v1.EVMFwdHeartbeats.last_seen:type_name -> vega.snapshot.v1.EVMFwdLastSeen + 247, // 310: vega.snapshot.v1.PoolMapEntry.Pool.parameters:type_name -> vega.events.v1.AMM.ConcentratedLiquidityParameters + 199, // 311: vega.snapshot.v1.PoolMapEntry.Pool.lower:type_name -> vega.snapshot.v1.PoolMapEntry.Curve + 199, // 312: vega.snapshot.v1.PoolMapEntry.Pool.upper:type_name -> vega.snapshot.v1.PoolMapEntry.Curve + 248, // 313: vega.snapshot.v1.PoolMapEntry.Pool.status:type_name -> vega.events.v1.AMM.Status + 314, // [314:314] is the sub-list for method output_type + 314, // [314:314] is the sub-list for method input_type + 314, // [314:314] is the sub-list for extension type_name + 314, // [314:314] is the sub-list for extension extendee + 0, // [0:314] is the sub-list for field type_name } func init() { file_vega_snapshot_v1_snapshot_proto_init() } @@ -17794,7 +18762,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 +18774,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 +18786,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 +18798,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 +18810,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,7 +18822,7 @@ 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.(*OrdersAtPrice); i { + switch v := v.(*AuctionIntervals); i { case 0: return &v.state case 1: @@ -17866,7 +18834,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PricedStopOrders); i { + switch v := v.(*TWAPData); i { case 0: return &v.state case 1: @@ -17878,7 +18846,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrailingStopOrders); i { + switch v := v.(*Perps); i { case 0: return &v.state case 1: @@ -17890,7 +18858,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OrdersAtOffset); i { + switch v := v.(*OrdersAtPrice); i { case 0: return &v.state case 1: @@ -17902,7 +18870,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OffsetsAtPrice); i { + switch v := v.(*PricedStopOrders); i { case 0: return &v.state case 1: @@ -17914,7 +18882,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopOrders); i { + switch v := v.(*TrailingStopOrders); i { case 0: return &v.state case 1: @@ -17926,7 +18894,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PeggedOrders); i { + switch v := v.(*OrdersAtOffset); i { case 0: return &v.state case 1: @@ -17938,7 +18906,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SLANetworkParams); i { + switch v := v.(*OffsetsAtPrice); i { case 0: return &v.state case 1: @@ -17950,7 +18918,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExecutionMarkets); i { + switch v := v.(*StopOrders); i { case 0: return &v.state case 1: @@ -17962,7 +18930,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Successors); i { + switch v := v.(*PeggedOrders); i { case 0: return &v.state case 1: @@ -17974,7 +18942,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Position); i { + switch v := v.(*SLANetworkParams); i { case 0: return &v.state case 1: @@ -17986,7 +18954,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MarketPositions); i { + switch v := v.(*ExecutionMarkets); i { case 0: return &v.state case 1: @@ -17998,7 +18966,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyPositionStats); i { + switch v := v.(*Successors); i { case 0: return &v.state case 1: @@ -18010,7 +18978,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SettlementState); i { + switch v := v.(*Position); i { case 0: return &v.state case 1: @@ -18022,7 +18990,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LastSettledPosition); i { + switch v := v.(*MarketPositions); i { case 0: return &v.state case 1: @@ -18034,7 +19002,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SettlementTrade); i { + switch v := v.(*PartyPositionStats); i { case 0: return &v.state case 1: @@ -18046,7 +19014,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppState); i { + switch v := v.(*SettlementState); i { case 0: return &v.state case 1: @@ -18058,7 +19026,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EpochState); i { + switch v := v.(*LastSettledPosition); i { case 0: return &v.state case 1: @@ -18070,7 +19038,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RewardsPendingPayouts); i { + switch v := v.(*SettlementTrade); i { case 0: return &v.state case 1: @@ -18082,7 +19050,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ScheduledRewardsPayout); i { + switch v := v.(*AppState); i { case 0: return &v.state case 1: @@ -18094,7 +19062,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RewardsPayout); i { + switch v := v.(*EpochState); i { case 0: return &v.state case 1: @@ -18106,7 +19074,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RewardsPartyAmount); i { + switch v := v.(*RewardsPendingPayouts); i { case 0: return &v.state case 1: @@ -18118,7 +19086,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LimitState); i { + switch v := v.(*ScheduledRewardsPayout); i { case 0: return &v.state case 1: @@ -18130,7 +19098,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VoteSpamPolicy); i { + switch v := v.(*RewardsPayout); i { case 0: return &v.state case 1: @@ -18142,7 +19110,7 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } file_vega_snapshot_v1_snapshot_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartyProposalVoteCount); i { + switch v := v.(*RewardsPartyAmount); i { case 0: return &v.state case 1: @@ -18154,6 +19122,42 @@ func file_vega_snapshot_v1_snapshot_proto_init() { } } 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 + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + 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 + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + 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 + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + 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 +19169,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 +19181,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 +19193,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 +19205,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 +19217,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 +19229,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 +19241,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 +19253,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 +19265,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 +19277,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 +19289,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 +19301,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 +19313,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 +19325,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 +19337,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 +19349,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 +19361,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 +19373,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 +19385,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 +19397,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 +19409,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 +19421,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 +19433,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 +19445,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 +19457,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 +19469,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 +19481,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 +19493,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 +19505,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 +19517,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 +19529,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 +19541,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 +19553,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 +19565,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 +19577,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 +19589,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 +19601,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 +19613,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 +19625,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 +19637,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 +19649,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 +19661,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 +19673,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 +19685,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 +19697,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 +19709,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 +19721,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 +19733,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 +19745,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 +19757,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 +19769,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 +19781,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 +19793,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 +19805,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 +19817,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 +19829,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 +19841,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 +19853,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 +19865,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 +19877,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 +19889,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 +19901,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 +19913,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 +19925,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 +19937,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 +19949,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 +19961,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 +19973,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 +19985,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 +19997,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 +20009,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 +20021,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 +20033,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 +20045,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 +20057,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 +20069,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 +20081,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 +20093,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 +20105,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 +20117,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 +20129,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 +20141,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 +20153,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 +20165,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 +20177,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 +20189,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 +20201,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 +20213,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 +20225,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 +20249,90 @@ 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.(*DelayedTx); 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.(*TxCache); 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[195].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EVMFwdPendingHeartbeat); 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[196].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EVMFwdLastSeen); 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[197].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EVMFwdHeartbeats); 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[198].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[199].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), @@ -19315,20 +20415,22 @@ func file_vega_snapshot_v1_snapshot_proto_init() { (*Payload_EthOracleVerifierMisc)(nil), (*Payload_BankingEvmBridgeStates)(nil), (*Payload_EvmMultisigTopologies)(nil), + (*Payload_TxCache)(nil), + (*Payload_EvmFwdHeartbeats)(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: 200, NumExtensions: 0, NumServices: 0, }, diff --git a/protos/vega/vega.pb.go b/protos/vega/vega.pb.go index 205f9f42017..eae82563ee0 100644 --- a/protos/vega/vega.pb.go +++ b/protos/vega/vega.pb.go @@ -241,6 +241,8 @@ const ( AuctionTrigger_AUCTION_TRIGGER_UNABLE_TO_DEPLOY_LP_ORDERS AuctionTrigger = 6 // Market is suspended and put into auction via governance AuctionTrigger_AUCTION_TRIGGER_GOVERNANCE_SUSPENSION AuctionTrigger = 7 + // Market is suspended in response to a long block + AuctionTrigger_AUCTION_TRIGGER_LONG_BLOCK AuctionTrigger = 8 ) // Enum value maps for AuctionTrigger. @@ -254,6 +256,7 @@ var ( 5: "AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET", 6: "AUCTION_TRIGGER_UNABLE_TO_DEPLOY_LP_ORDERS", 7: "AUCTION_TRIGGER_GOVERNANCE_SUSPENSION", + 8: "AUCTION_TRIGGER_LONG_BLOCK", } AuctionTrigger_value = map[string]int32{ "AUCTION_TRIGGER_UNSPECIFIED": 0, @@ -264,6 +267,7 @@ var ( "AUCTION_TRIGGER_LIQUIDITY_TARGET_NOT_MET": 5, "AUCTION_TRIGGER_UNABLE_TO_DEPLOY_LP_ORDERS": 6, "AUCTION_TRIGGER_GOVERNANCE_SUSPENSION": 7, + "AUCTION_TRIGGER_LONG_BLOCK": 8, } ) @@ -464,6 +468,8 @@ const ( OrderError_ORDER_ERROR_PEGGED_ORDERS_NOT_ALLOWED_IN_ISOLATED_MARGIN_MODE OrderError = 52 // Order price does not respect market's required tick size OrderError_ORDER_ERROR_PRICE_NOT_IN_TICK_SIZE OrderError = 53 + // Order price exceeds the max price of the capped future market + OrderError_ORDER_ERROR_PRICE_MUST_BE_LESS_THAN_OR_EQUAL_TO_MAX_PRICE OrderError = 54 ) // Enum value maps for OrderError. @@ -521,6 +527,7 @@ var ( 51: "ORDER_ERROR_ISOLATED_MARGIN_CHECK_FAILED", 52: "ORDER_ERROR_PEGGED_ORDERS_NOT_ALLOWED_IN_ISOLATED_MARGIN_MODE", 53: "ORDER_ERROR_PRICE_NOT_IN_TICK_SIZE", + 54: "ORDER_ERROR_PRICE_MUST_BE_LESS_THAN_OR_EQUAL_TO_MAX_PRICE", } OrderError_value = map[string]int32{ "ORDER_ERROR_UNSPECIFIED": 0, @@ -575,6 +582,7 @@ var ( "ORDER_ERROR_ISOLATED_MARGIN_CHECK_FAILED": 51, "ORDER_ERROR_PEGGED_ORDERS_NOT_ALLOWED_IN_ISOLATED_MARGIN_MODE": 52, "ORDER_ERROR_PRICE_NOT_IN_TICK_SIZE": 53, + "ORDER_ERROR_PRICE_MUST_BE_LESS_THAN_OR_EQUAL_TO_MAX_PRICE": 54, } ) @@ -928,6 +936,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 general account. + TransferType_TRANSFER_TYPE_AMM_LOW TransferType = 49 + // Transfer from an AMM's general account to their owner's general account. + TransferType_TRANSFER_TYPE_AMM_HIGH TransferType = 50 + // Transfer releasing an AMM's general account upon closure. + TransferType_TRANSFER_TYPE_AMM_RELEASE TransferType = 51 ) // Enum value maps for TransferType. @@ -976,6 +990,9 @@ var ( 46: "TRANSFER_TYPE_ORDER_MARGIN_HIGH", 47: "TRANSFER_TYPE_ISOLATED_MARGIN_LOW", 48: "TRANSFER_TYPE_ISOLATED_MARGIN_HIGH", + 49: "TRANSFER_TYPE_AMM_LOW", + 50: "TRANSFER_TYPE_AMM_HIGH", + 51: "TRANSFER_TYPE_AMM_RELEASE", } TransferType_value = map[string]int32{ "TRANSFER_TYPE_UNSPECIFIED": 0, @@ -1021,6 +1038,9 @@ var ( "TRANSFER_TYPE_ORDER_MARGIN_HIGH": 46, "TRANSFER_TYPE_ISOLATED_MARGIN_LOW": 47, "TRANSFER_TYPE_ISOLATED_MARGIN_HIGH": 48, + "TRANSFER_TYPE_AMM_LOW": 49, + "TRANSFER_TYPE_AMM_HIGH": 50, + "TRANSFER_TYPE_AMM_RELEASE": 51, } ) @@ -1191,6 +1211,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 +1222,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, } ) @@ -2278,6 +2302,8 @@ type PartyProfile struct { // Metadata to associate to a party, in a key/value format where the key // describes the type of metadata in the value field. Metadata []*Metadata `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty"` + // Derived keys for the party. + DerivedKeys []string `protobuf:"bytes,4,rep,name=derived_keys,json=derivedKeys,proto3" json:"derived_keys,omitempty"` } func (x *PartyProfile) Reset() { @@ -2333,6 +2359,13 @@ func (x *PartyProfile) GetMetadata() []*Metadata { return nil } +func (x *PartyProfile) GetDerivedKeys() []string { + if x != nil { + return x.DerivedKeys + } + return nil +} + // Generic structure holding a key/value pair. type Metadata struct { state protoimpl.MessageState @@ -3802,6 +3835,10 @@ type PriceLevel struct { NumberOfOrders uint64 `protobuf:"varint,2,opt,name=number_of_orders,json=numberOfOrders,proto3" json:"number_of_orders,omitempty"` // Volume at the price level. Volume uint64 `protobuf:"varint,3,opt,name=volume,proto3" json:"volume,omitempty"` + // Volume of AMM's at the price level. + AmmVolume uint64 `protobuf:"varint,4,opt,name=amm_volume,json=ammVolume,proto3" json:"amm_volume,omitempty"` + // Estimated AMM volume at the price level. + AmmVolumeEstimated uint64 `protobuf:"varint,5,opt,name=amm_volume_estimated,json=ammVolumeEstimated,proto3" json:"amm_volume_estimated,omitempty"` } func (x *PriceLevel) Reset() { @@ -3857,6 +3894,20 @@ func (x *PriceLevel) GetVolume() uint64 { return 0 } +func (x *PriceLevel) GetAmmVolume() uint64 { + if x != nil { + return x.AmmVolume + } + return 0 +} + +func (x *PriceLevel) GetAmmVolumeEstimated() uint64 { + if x != nil { + return x.AmmVolumeEstimated + } + return 0 +} + // Represents market depth or order book data for the specified market on Vega type MarketDepth struct { state protoimpl.MessageState @@ -6475,6 +6526,8 @@ type PriceMonitoringBounds struct { Trigger *PriceMonitoringTrigger `protobuf:"bytes,3,opt,name=trigger,proto3" json:"trigger,omitempty"` // Reference price used to calculate the valid price range. This field is an unsigned integer scaled to the market's decimal places. ReferencePrice string `protobuf:"bytes,4,opt,name=reference_price,json=referencePrice,proto3" json:"reference_price,omitempty"` + // Has this bound been triggered yet or is it still active. + Active bool `protobuf:"varint,5,opt,name=active,proto3" json:"active,omitempty"` } func (x *PriceMonitoringBounds) Reset() { @@ -6537,6 +6590,13 @@ func (x *PriceMonitoringBounds) GetReferencePrice() string { return "" } +func (x *PriceMonitoringBounds) GetActive() bool { + if x != nil { + return x.Active + } + return false +} + // Represents Vega domain specific error information over gRPC/Protobuf type ErrorDetail struct { state protoimpl.MessageState @@ -6686,6 +6746,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 +6845,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 @@ -7217,6 +7286,8 @@ type EthereumConfig struct { TokenVestingContract *EthereumContractConfig `protobuf:"bytes,6,opt,name=token_vesting_contract,json=tokenVestingContract,proto3" json:"token_vesting_contract,omitempty"` // Contract configuration of the multisig control contract for this Ethereum network. MultisigControlContract *EthereumContractConfig `protobuf:"bytes,7,opt,name=multisig_control_contract,json=multisigControlContract,proto3" json:"multisig_control_contract,omitempty"` + // Approximate block time of the EVM chain as a duration e.g. 12s, 250ms. + BlockTime string `protobuf:"bytes,8,opt,name=block_time,json=blockTime,proto3" json:"block_time,omitempty"` } func (x *EthereumConfig) Reset() { @@ -7300,6 +7371,13 @@ func (x *EthereumConfig) GetMultisigControlContract() *EthereumContractConfig { return nil } +func (x *EthereumConfig) GetBlockTime() string { + if x != nil { + return x.BlockTime + } + return "" +} + // EVM Chain configuration details. type EVMBridgeConfig struct { state protoimpl.MessageState @@ -9720,6 +9798,111 @@ func (x *ActivityStreakBenefitTier) GetVestingMultiplier() string { return "" } +type LongBlockAuction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Threshold for a long block. + Threshold string `protobuf:"bytes,1,opt,name=threshold,proto3" json:"threshold,omitempty"` + // Auction duration for the given threshold. + Duration string `protobuf:"bytes,2,opt,name=duration,proto3" json:"duration,omitempty"` +} + +func (x *LongBlockAuction) Reset() { + *x = LongBlockAuction{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_vega_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LongBlockAuction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LongBlockAuction) ProtoMessage() {} + +func (x *LongBlockAuction) ProtoReflect() protoreflect.Message { + mi := &file_vega_vega_proto_msgTypes[83] + 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 LongBlockAuction.ProtoReflect.Descriptor instead. +func (*LongBlockAuction) Descriptor() ([]byte, []int) { + return file_vega_vega_proto_rawDescGZIP(), []int{83} +} + +func (x *LongBlockAuction) GetThreshold() string { + if x != nil { + return x.Threshold + } + return "" +} + +func (x *LongBlockAuction) GetDuration() string { + if x != nil { + return x.Duration + } + return "" +} + +type LongBlockAuctionDurationTable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Slice of thresholds and durations for corresponding auctions. + ThresholdAndDuration []*LongBlockAuction `protobuf:"bytes,1,rep,name=threshold_and_duration,json=thresholdAndDuration,proto3" json:"threshold_and_duration,omitempty"` +} + +func (x *LongBlockAuctionDurationTable) Reset() { + *x = LongBlockAuctionDurationTable{} + if protoimpl.UnsafeEnabled { + mi := &file_vega_vega_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LongBlockAuctionDurationTable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LongBlockAuctionDurationTable) ProtoMessage() {} + +func (x *LongBlockAuctionDurationTable) ProtoReflect() protoreflect.Message { + mi := &file_vega_vega_proto_msgTypes[84] + 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 LongBlockAuctionDurationTable.ProtoReflect.Descriptor instead. +func (*LongBlockAuctionDurationTable) Descriptor() ([]byte, []int) { + return file_vega_vega_proto_rawDescGZIP(), []int{84} +} + +func (x *LongBlockAuctionDurationTable) GetThresholdAndDuration() []*LongBlockAuction { + if x != nil { + return x.ThresholdAndDuration + } + return nil +} + type StopOrder_SizeOverrideValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -9732,7 +9915,7 @@ type StopOrder_SizeOverrideValue struct { func (x *StopOrder_SizeOverrideValue) Reset() { *x = StopOrder_SizeOverrideValue{} if protoimpl.UnsafeEnabled { - mi := &file_vega_vega_proto_msgTypes[83] + mi := &file_vega_vega_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9745,7 +9928,7 @@ func (x *StopOrder_SizeOverrideValue) String() string { func (*StopOrder_SizeOverrideValue) ProtoMessage() {} func (x *StopOrder_SizeOverrideValue) ProtoReflect() protoreflect.Message { - mi := &file_vega_vega_proto_msgTypes[83] + mi := &file_vega_vega_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9773,392 +9956,389 @@ var File_vega_vega_proto protoreflect.FileDescriptor var file_vega_vega_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x76, 0x65, 0x67, 0x61, 0x1a, 0x12, 0x76, 0x65, 0x67, 0x61, 0x2f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 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, 0x08, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 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, 0xbd, 0x10, 0x0a, - 0x09, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0b, 0x6f, 0x63, - 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x01, 0x52, 0x09, 0x6f, 0x63, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, - 0x22, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x73, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x45, 0x78, - 0x70, 0x69, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x03, 0x52, 0x0e, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, - 0x01, 0x12, 0x4d, 0x0a, 0x11, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x72, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 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, - 0x22, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x19, - 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x0a, 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, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x4f, 0x0a, 0x10, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, - 0x72, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x48, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x15, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, - 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, - 0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x13, 0x73, 0x69, 0x7a, - 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x12, 0x56, 0x0a, 0x13, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, - 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x53, - 0x69, 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x48, 0x06, 0x52, 0x11, 0x73, 0x69, 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x12, 0x38, 0x0a, 0x17, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x15, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, - 0x63, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x1a, 0x33, 0x0a, 0x11, 0x53, 0x69, - 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, - 0x80, 0x01, 0x0a, 0x13, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x21, 0x53, 0x49, 0x5a, 0x45, 0x5f, - 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, - 0x0a, 0x1a, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x5f, - 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x22, - 0x0a, 0x1e, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x5f, - 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x02, 0x22, 0x6a, 0x0a, 0x0e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x5f, 0x53, - 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x5f, - 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x53, - 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x52, - 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x53, 0x55, 0x42, 0x4d, 0x49, 0x54, 0x10, 0x02, 0x22, 0x7b, - 0x0a, 0x10, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x1d, 0x54, 0x52, 0x49, 0x47, 0x47, 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, 0x21, 0x0a, 0x1d, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, - 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x49, 0x53, 0x45, 0x53, - 0x5f, 0x41, 0x42, 0x4f, 0x56, 0x45, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x54, 0x52, 0x49, 0x47, - 0x47, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, - 0x4c, 0x4c, 0x53, 0x5f, 0x42, 0x45, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x22, 0x9d, 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, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, - 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, - 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x58, 0x50, - 0x49, 0x52, 0x45, 0x44, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x06, 0x22, 0xe4, 0x04, 0x0a, 0x0f, - 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, - 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, - 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, - 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4e, 0x4f, - 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x52, - 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, - 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x48, 0x45, 0x5f, 0x50, 0x41, - 0x53, 0x54, 0x10, 0x02, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, - 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x36, - 0x0a, 0x32, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, - 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x52, 0x45, 0x41, - 0x43, 0x48, 0x45, 0x44, 0x10, 0x04, 0x12, 0x3e, 0x0a, 0x3a, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, - 0x44, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x5f, 0x41, 0x5f, 0x50, 0x4f, 0x53, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x38, 0x0a, 0x34, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x49, 0x4e, - 0x47, 0x5f, 0x54, 0x48, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, - 0x12, 0x39, 0x0a, 0x35, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, - 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, - 0x4c, 0x49, 0x4e, 0x4b, 0x45, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, 0x4e, 0x54, 0x41, 0x47, - 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x07, 0x12, 0x42, 0x0a, 0x3e, 0x52, - 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, - 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, - 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x4f, 0x50, - 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x08, 0x12, - 0x3d, 0x0a, 0x39, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, - 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x43, - 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x4f, 0x43, 0x4f, 0x5f, - 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x10, 0x09, 0x12, 0x42, - 0x0a, 0x3e, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, - 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x53, 0x49, - 0x5a, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x55, - 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x5f, 0x53, 0x50, 0x4f, 0x54, - 0x10, 0x0a, 0x42, 0x09, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x6f, 0x63, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x42, 0x0d, 0x0a, - 0x0b, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x42, 0x12, 0x0a, 0x10, - 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, - 0x13, 0x0a, 0x11, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6f, 0x76, - 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x59, 0x0a, 0x05, - 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 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, 0x4e, 0x0a, 0x0a, 0x52, 0x69, 0x73, 0x6b, 0x46, - 0x61, 0x63, 0x74, 0x6f, 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, 0x14, 0x0a, - 0x05, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x6e, 0x67, 0x22, 0x5a, 0x0a, 0x0b, 0x50, 0x65, 0x67, 0x67, 0x65, - 0x64, 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, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x0c, 0x49, 0x63, 0x65, 0x62, 0x65, 0x72, 0x67, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x65, 0x61, 0x6b, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, 0x69, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x12, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x5f, - 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x11, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x22, 0x80, 0x0a, 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 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, 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, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x69, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x52, 0x04, - 0x73, 0x69, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x3b, 0x0a, 0x0d, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x52, 0x0b, 0x74, 0x69, - 0x6d, 0x65, 0x49, 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2a, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, - 0x72, 0x64, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x19, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x0c, 0x70, 0x65, - 0x67, 0x67, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x52, 0x0b, 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x6f, - 0x6e, 0x6c, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x4f, - 0x6e, 0x6c, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, 0x5f, 0x6f, 0x6e, - 0x6c, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, 0x64, 0x75, 0x63, 0x65, - 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0d, 0x69, 0x63, 0x65, 0x62, 0x65, 0x72, 0x67, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x49, 0x63, 0x65, 0x62, 0x65, 0x72, 0x67, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x48, - 0x01, 0x52, 0x0c, 0x69, 0x63, 0x65, 0x62, 0x65, 0x72, 0x67, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x88, - 0x01, 0x01, 0x22, 0xb6, 0x01, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x46, 0x6f, 0x72, - 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, - 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, - 0x43, 0x45, 0x5f, 0x47, 0x54, 0x43, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x49, 0x4d, 0x45, - 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x47, 0x54, 0x54, 0x10, 0x02, 0x12, - 0x15, 0x0a, 0x11, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, - 0x5f, 0x49, 0x4f, 0x43, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, - 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x46, 0x4f, 0x4b, 0x10, 0x04, 0x12, 0x15, 0x0a, - 0x11, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x47, - 0x46, 0x41, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, - 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x06, 0x22, 0x4f, 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, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x10, 0x03, 0x22, 0xc9, 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, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x58, 0x50, - 0x49, 0x52, 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, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x45, - 0x44, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, - 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x41, 0x4c, 0x4c, 0x59, 0x5f, 0x46, 0x49, 0x4c, - 0x4c, 0x45, 0x44, 0x10, 0x07, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x50, 0x41, 0x52, 0x4b, 0x45, 0x44, 0x10, 0x08, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x63, 0x65, 0x62, 0x65, 0x72, 0x67, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x1d, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xa0, 0x01, 0x0a, 0x11, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x21, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x12, 0x23, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x02, 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, 0x43, 0x0a, 0x17, 0x70, 0x61, 0x73, 0x73, 0x69, - 0x76, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x15, 0x70, 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0xd3, 0x01, 0x0a, - 0x16, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x76, 0x65, 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, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, - 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x69, 0x6e, 0x64, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, - 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x6e, 0x64, 0x22, 0xfc, 0x04, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 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, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x79, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x79, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x6c, - 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x6c, 0x6c, 0x65, - 0x72, 0x12, 0x28, 0x0a, 0x09, 0x61, 0x67, 0x67, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, 0x64, 0x65, - 0x52, 0x09, 0x61, 0x67, 0x67, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x62, - 0x75, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x62, 0x75, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x6c, 0x6c, - 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, - 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 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, 0x24, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x65, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x09, 0x62, - 0x75, 0x79, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x08, 0x62, 0x75, 0x79, 0x65, 0x72, - 0x46, 0x65, 0x65, 0x12, 0x28, 0x0a, 0x0a, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x66, 0x65, - 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, - 0x65, 0x65, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x46, 0x65, 0x65, 0x12, 0x2e, 0x0a, - 0x13, 0x62, 0x75, 0x79, 0x65, 0x72, 0x5f, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, - 0x61, 0x74, 0x63, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x62, 0x75, 0x79, 0x65, - 0x72, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x30, 0x0a, - 0x14, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x73, 0x65, 0x6c, - 0x6c, 0x65, 0x72, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, - 0x1f, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x22, 0x6f, 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, 0x10, - 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, - 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, - 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x10, - 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, - 0x4b, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x42, 0x41, 0x44, 0x10, - 0x03, 0x22, 0x98, 0x04, 0x0a, 0x03, 0x46, 0x65, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x6b, - 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, - 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, - 0x72, 0x65, 0x46, 0x65, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, - 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x6d, - 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x22, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, - 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x46, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, - 0x66, 0x65, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x6c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, - 0x65, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x61, 0x6b, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x24, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x72, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x21, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, - 0x72, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x5f, - 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, - 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x72, 0x65, 0x72, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2f, 0x0a, 0x08, - 0x54, 0x72, 0x61, 0x64, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x64, - 0x65, 0x73, 0x18, 0x01, 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, 0x22, 0xf2, 0x01, - 0x0a, 0x06, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x65, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x77, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x6f, 0x70, 0x65, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x6c, 0x6f, - 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x08, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x08, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x22, 0x64, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x5f, 0x6f, 0x66, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x22, 0x9d, 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 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, 0x22, 0x0a, 0x03, 0x62, 0x75, 0x79, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x03, 0x62, 0x75, 0x79, 0x12, 0x24, 0x0a, 0x04, 0x73, 0x65, 0x6c, - 0x6c, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x12, - 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xdd, 0x01, 0x0a, 0x11, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1b, + 0x72, 0x6b, 0x65, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8e, 0x01, 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, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x65, 0x72, + 0x69, 0x76, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x72, 0x69, 0x76, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x32, 0x0a, 0x08, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0xbd, 0x10, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, + 0x0a, 0x0b, 0x6f, 0x63, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x09, 0x6f, 0x63, 0x6f, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x79, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x2e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, + 0x48, 0x03, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x11, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x20, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, + 0x72, 0x2e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x10, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 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, 0x22, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x0a, + 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, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x4f, 0x0a, 0x10, 0x72, 0x65, + 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x48, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x15, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x53, 0x69, 0x7a, 0x65, + 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x13, 0x73, 0x69, 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x12, 0x56, 0x0a, 0x13, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6f, 0x76, 0x65, + 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x2e, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x48, 0x06, 0x52, 0x11, 0x73, 0x69, 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x16, 0x0a, 0x05, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x67, + 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, + 0x65, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x15, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x69, 0x6e, + 0x67, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x1a, 0x33, + 0x0a, 0x11, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x13, 0x53, 0x69, 0x7a, 0x65, 0x4f, 0x76, 0x65, 0x72, + 0x72, 0x69, 0x64, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x21, 0x53, + 0x49, 0x5a, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x54, + 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, + 0x49, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, + 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, + 0x49, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x4f, 0x53, 0x49, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x22, 0x6a, 0x0a, 0x0e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, + 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x58, 0x50, 0x49, + 0x52, 0x59, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x45, 0x58, 0x50, + 0x49, 0x52, 0x59, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x43, 0x41, 0x4e, + 0x43, 0x45, 0x4c, 0x53, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, + 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x53, 0x55, 0x42, 0x4d, 0x49, 0x54, + 0x10, 0x02, 0x22, 0x7b, 0x0a, 0x10, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x1d, 0x54, 0x52, 0x49, 0x47, 0x47, 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, 0x21, 0x0a, 0x1d, 0x54, 0x52, 0x49, + 0x47, 0x47, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, + 0x49, 0x53, 0x45, 0x53, 0x5f, 0x41, 0x42, 0x4f, 0x56, 0x45, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, + 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x46, 0x41, 0x4c, 0x4c, 0x53, 0x5f, 0x42, 0x45, 0x4c, 0x4f, 0x57, 0x10, 0x02, 0x22, + 0x9d, 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, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x03, + 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, + 0x45, 0x52, 0x45, 0x44, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x06, 0x22, + 0xe4, 0x04, 0x0a, 0x0f, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, + 0x47, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x01, 0x12, + 0x27, 0x0a, 0x23, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x48, + 0x45, 0x5f, 0x50, 0x41, 0x53, 0x54, 0x10, 0x02, 0x12, 0x28, 0x0a, 0x24, 0x52, 0x45, 0x4a, 0x45, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4d, 0x55, 0x53, + 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, + 0x10, 0x03, 0x12, 0x36, 0x0a, 0x32, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x50, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, + 0x5f, 0x52, 0x45, 0x41, 0x43, 0x48, 0x45, 0x44, 0x10, 0x04, 0x12, 0x3e, 0x0a, 0x3a, 0x52, 0x45, + 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, + 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x5f, 0x41, 0x5f, + 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x38, 0x0a, 0x34, 0x52, 0x45, + 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, + 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x43, 0x4c, + 0x4f, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x48, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x39, 0x0a, 0x35, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, + 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x4b, 0x45, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x43, 0x45, + 0x4e, 0x54, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x07, 0x12, + 0x42, 0x0a, 0x3e, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4e, + 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, + 0x47, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x08, 0x12, 0x3d, 0x0a, 0x39, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, + 0x45, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, + 0x4f, 0x43, 0x4f, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x53, + 0x10, 0x09, 0x12, 0x42, 0x0a, 0x3e, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x5f, + 0x53, 0x50, 0x4f, 0x54, 0x10, 0x0a, 0x42, 0x09, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6f, 0x63, 0x6f, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x69, + 0x64, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0x59, 0x0a, 0x05, 0x50, 0x61, 0x72, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 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, 0x4e, 0x0a, 0x0a, 0x52, + 0x69, 0x73, 0x6b, 0x46, 0x61, 0x63, 0x74, 0x6f, 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, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x6e, 0x67, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x6e, 0x67, 0x22, 0x5a, 0x0a, 0x0b, 0x50, + 0x65, 0x67, 0x67, 0x65, 0x64, 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, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x0c, 0x49, 0x63, 0x65, 0x62, + 0x65, 0x72, 0x67, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x65, 0x61, 0x6b, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x70, 0x65, 0x61, + 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x11, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x52, 0x65, 0x6d, + 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0x80, 0x0a, 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 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, 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, 0x12, 0x1e, 0x0a, 0x04, 0x73, 0x69, 0x64, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x69, + 0x64, 0x65, 0x52, 0x04, 0x73, 0x69, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, + 0x12, 0x3b, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, + 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x24, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x62, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x34, + 0x0a, 0x0c, 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x12, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x65, 0x67, 0x67, + 0x65, 0x64, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x0b, 0x70, 0x65, 0x67, 0x67, 0x65, 0x64, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, + 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x70, + 0x6f, 0x73, 0x74, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x64, 0x75, 0x63, + 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x72, 0x65, + 0x64, 0x75, 0x63, 0x65, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0d, 0x69, 0x63, 0x65, 0x62, + 0x65, 0x72, 0x67, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, 0x63, 0x65, 0x62, 0x65, 0x72, 0x67, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x48, 0x01, 0x52, 0x0c, 0x69, 0x63, 0x65, 0x62, 0x65, 0x72, 0x67, 0x4f, 0x72, + 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x22, 0xb6, 0x01, 0x0a, 0x0b, 0x54, 0x69, 0x6d, 0x65, 0x49, + 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, + 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, + 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x47, 0x54, 0x43, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, + 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x47, 0x54, + 0x54, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, + 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x4f, 0x43, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x49, + 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x46, 0x4f, 0x4b, 0x10, + 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, + 0x43, 0x45, 0x5f, 0x47, 0x46, 0x41, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x49, 0x4d, 0x45, + 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x06, 0x22, + 0x4f, 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, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x01, 0x12, 0x0f, 0x0a, + 0x0b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x10, 0x02, 0x12, 0x10, + 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x10, 0x03, + 0x22, 0xc9, 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, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 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, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, + 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x41, 0x4c, 0x4c, 0x59, + 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x07, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x50, 0x41, 0x52, 0x4b, 0x45, 0x44, 0x10, 0x08, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x69, 0x63, 0x65, 0x62, + 0x65, 0x72, 0x67, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x42, 0x0a, 0x1d, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x05, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xa0, 0x01, + 0x0a, 0x11, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, + 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, + 0x18, 0x02, 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, 0x43, 0x0a, 0x17, 0x70, + 0x61, 0x73, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x61, 0x66, + 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x15, 0x70, 0x61, 0x73, 0x73, 0x69, + 0x76, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x22, 0xd3, 0x01, 0x0a, 0x16, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 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, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x64, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, + 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x22, 0xfc, 0x04, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x64, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 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, 0x14, 0x0a, + 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x79, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x79, 0x65, 0x72, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x09, 0x61, 0x67, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x53, 0x69, 0x64, 0x65, 0x52, 0x09, 0x61, 0x67, 0x67, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x12, + 0x1b, 0x0a, 0x09, 0x62, 0x75, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x62, 0x75, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x65, 0x6c, 0x6c, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x65, 0x6c, 0x6c, 0x4f, 0x72, 0x64, 0x65, 0x72, 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, 0x24, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, + 0x72, 0x61, 0x64, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x26, 0x0a, 0x09, 0x62, 0x75, 0x79, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x08, 0x62, + 0x75, 0x79, 0x65, 0x72, 0x46, 0x65, 0x65, 0x12, 0x28, 0x0a, 0x0a, 0x73, 0x65, 0x6c, 0x6c, 0x65, + 0x72, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x46, 0x65, 0x65, 0x52, 0x09, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x46, 0x65, + 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x62, 0x75, 0x79, 0x65, 0x72, 0x5f, 0x61, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, + 0x62, 0x75, 0x79, 0x65, 0x72, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x12, 0x73, 0x65, 0x6c, 0x6c, 0x65, 0x72, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x22, 0x6f, 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, 0x10, 0x0a, 0x0c, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, + 0x4c, 0x54, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, + 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x47, + 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, + 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x4f, 0x55, 0x54, 0x5f, + 0x42, 0x41, 0x44, 0x10, 0x03, 0x22, 0x98, 0x04, 0x0a, 0x03, 0x46, 0x65, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, + 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x46, 0x65, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x12, 0x39, + 0x0a, 0x19, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x16, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x22, 0x69, 0x6e, 0x66, + 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x46, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x1d, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, + 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1a, 0x6c, + 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x6d, 0x61, 0x6b, + 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x5f, + 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, + 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x46, 0x65, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x24, 0x69, 0x6e, 0x66, 0x72, + 0x61, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, + 0x72, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x45, 0x0a, 0x1f, 0x6c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x65, 0x72, + 0x72, 0x65, 0x72, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x1c, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x46, 0x65, 0x65, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x72, 0x65, 0x72, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x2f, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x64, 0x65, 0x53, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x06, + 0x74, 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x01, 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, 0x22, 0xf2, 0x01, 0x0a, 0x06, 0x43, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x67, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x69, 0x67, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, + 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, + 0x6f, 0x70, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6f, 0x70, 0x65, 0x6e, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2a, + 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x0e, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6e, 0x6f, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0xb5, 0x01, 0x0a, 0x0a, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x61, 0x6d, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x09, 0x61, 0x6d, 0x6d, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, + 0x61, 0x6d, 0x6d, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x65, 0x73, 0x74, 0x69, 0x6d, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x61, 0x6d, 0x6d, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x22, 0x9d, + 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 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, 0x22, 0x0a, 0x03, 0x62, 0x75, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, @@ -10167,1447 +10347,1488 @@ var file_vega_vega_proto_rawDesc = []byte{ 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, - 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x38, - 0x0a, 0x18, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x16, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xf7, 0x02, 0x0a, 0x08, 0x50, 0x6f, 0x73, - 0x69, 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, 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, 0x12, 0x1f, 0x0a, - 0x0b, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x70, 0x6e, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x50, 0x6e, - 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x5f, - 0x70, 0x6e, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x75, 0x6e, 0x72, 0x65, 0x61, - 0x6c, 0x69, 0x73, 0x65, 0x64, 0x50, 0x6e, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x76, 0x65, 0x72, - 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x6c, 0x6f, 0x73, 0x73, 0x5f, - 0x73, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x6c, 0x6f, 0x73, 0x73, - 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x0f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x22, 0x3d, 0x0a, 0x0d, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, - 0x61, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x22, 0x83, 0x03, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 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, 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, 0x2d, 0x0a, - 0x12, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x63, 0x72, 0x65, 0x64, 0x69, - 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2b, 0x0a, 0x11, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x7c, 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, 0x0f, 0x0a, 0x0b, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, - 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4e, - 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x4a, - 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x22, 0xa8, 0x03, 0x0a, 0x0a, 0x57, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 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, 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, 0x61, 0x73, 0x73, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xdd, + 0x01, 0x0a, 0x11, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x55, 0x70, + 0x64, 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, 0x22, 0x0a, 0x03, 0x62, 0x75, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x52, 0x03, 0x62, 0x75, 0x79, 0x12, 0x24, 0x0a, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x04, 0x73, 0x65, 0x6c, 0x6c, 0x12, 0x27, 0x0a, 0x0f, 0x73, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, + 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, + 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xf7, + 0x02, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x69, 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, 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, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, + 0x5f, 0x70, 0x6e, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x61, 0x6c, + 0x69, 0x73, 0x65, 0x64, 0x50, 0x6e, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x75, 0x6e, 0x72, 0x65, 0x61, + 0x6c, 0x69, 0x73, 0x65, 0x64, 0x5f, 0x70, 0x6e, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x75, 0x6e, 0x72, 0x65, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, 0x50, 0x6e, 0x6c, 0x12, 0x2e, + 0x0a, 0x13, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3a, 0x0a, + 0x19, 0x6c, 0x6f, 0x73, 0x73, 0x5f, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x17, 0x6c, 0x6f, 0x73, 0x73, 0x53, 0x6f, 0x63, 0x69, 0x61, 0x6c, 0x69, 0x73, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x0f, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3d, 0x0a, 0x0d, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x83, 0x03, 0x0a, 0x07, 0x44, 0x65, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 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, 0x12, 0x14, 0x0a, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, + 0x65, 0x74, 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, 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, 0x2d, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0x7c, 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, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x50, 0x45, 0x4e, + 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, + 0x43, 0x45, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1d, + 0x0a, 0x19, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x55, 0x50, 0x4c, 0x49, 0x43, 0x41, + 0x54, 0x45, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x22, 0xa8, 0x03, + 0x0a, 0x0a, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 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, 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, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 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, 0x2b, 0x0a, 0x11, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, + 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x77, 0x69, 0x74, + 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x23, 0x0a, 0x03, 0x65, 0x78, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x45, 0x78, 0x74, 0x52, + 0x03, 0x65, 0x78, 0x74, 0x22, 0x5c, 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, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x4f, 0x50, 0x45, 0x4e, 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, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, + 0x10, 0x03, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x44, 0x0a, 0x0b, 0x57, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x45, 0x78, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x72, + 0x63, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x45, 0x78, 0x74, 0x48, 0x00, + 0x52, 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, 0x42, 0x05, 0x0a, 0x03, 0x65, 0x78, 0x74, 0x22, 0x3d, + 0x0a, 0x10, 0x45, 0x72, 0x63, 0x32, 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x45, + 0x78, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, + 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa3, 0x01, + 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 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, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, - 0x2f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x61, - 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, - 0x65, 0x66, 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, 0x2b, 0x0a, 0x11, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x13, 0x77, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x03, 0x65, 0x78, 0x74, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x45, 0x78, 0x74, 0x52, 0x03, 0x65, 0x78, 0x74, 0x22, 0x5c, - 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, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 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, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x49, 0x5a, 0x45, 0x44, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x07, - 0x10, 0x08, 0x22, 0x44, 0x0a, 0x0b, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x45, 0x78, - 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x63, 0x32, 0x30, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x72, 0x63, 0x32, 0x30, 0x57, 0x69, 0x74, - 0x68, 0x64, 0x72, 0x61, 0x77, 0x45, 0x78, 0x74, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x63, 0x32, - 0x30, 0x42, 0x05, 0x0a, 0x03, 0x65, 0x78, 0x74, 0x22, 0x3d, 0x0a, 0x10, 0x45, 0x72, 0x63, 0x32, - 0x30, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x45, 0x78, 0x74, 0x12, 0x29, 0x0a, 0x10, - 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 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, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3f, 0x0a, - 0x0f, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x61, 0x6d, 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, 0x22, 0xb3, - 0x01, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, - 0x72, 0x12, 0x2d, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, - 0x61, 0x6c, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x69, - 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x49, 0x64, 0x22, 0xc5, 0x06, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, - 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x46, 0x6f, 0x72, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x0c, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, - 0x63, 0x6f, 0x70, 0x65, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, - 0x65, 0x12, 0x40, 0x0a, 0x10, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x5f, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x53, 0x63, 0x6f, - 0x70, 0x65, 0x52, 0x0f, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x53, 0x63, - 0x6f, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x70, - 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, - 0x70, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x5f, 0x70, 0x65, 0x72, 0x66, - 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x54, - 0x6f, 0x70, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x13, - 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x74, 0x61, 0x6b, 0x69, - 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x6b, 0x0a, - 0x33, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x2e, 0x6e, 0x6f, 0x74, 0x69, - 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, - 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, - 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x12, 0x4f, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x14, 0x64, 0x69, 0x73, + 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x46, 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6d, 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, 0x22, 0xb3, 0x01, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x46, + 0x69, 0x6e, 0x61, 0x6e, 0x63, 0x69, 0x61, 0x6c, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x22, 0xc5, 0x06, 0x0a, 0x10, 0x44, + 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, + 0x28, 0x0a, 0x10, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x46, 0x6f, 0x72, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, + 0x06, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x73, 0x12, 0x34, 0x0a, 0x0c, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x40, 0x0a, 0x10, 0x69, 0x6e, 0x64, 0x69, 0x76, + 0x69, 0x64, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, + 0x75, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x0f, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, + 0x64, 0x75, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x65, 0x61, + 0x6d, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x74, + 0x65, 0x61, 0x6d, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x5f, 0x74, 0x6f, + 0x70, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x54, 0x6f, 0x70, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, + 0x72, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x6b, 0x0a, 0x33, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x6c, 0x6f, 0x63, 0x6b, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x4f, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x12, 0x29, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x6b, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x61, 0x6e, - 0x6b, 0x52, 0x09, 0x72, 0x61, 0x6e, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x17, - 0x63, 0x61, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x14, 0x63, 0x61, 0x70, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x46, 0x65, 0x65, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, - 0x61, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x6d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x46, 0x0a, 0x04, - 0x52, 0x61, 0x6e, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x61, - 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, - 0x61, 0x6e, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x72, 0x65, 0x5f, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x73, 0x68, 0x61, 0x72, 0x65, 0x52, - 0x61, 0x74, 0x69, 0x6f, 0x22, 0xe6, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, - 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x0b, 0x66, - 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x0a, 0x74, 0x6f, - 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x09, 0x74, - 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 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, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xa7, 0x01, - 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, - 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, - 0x08, 0x0a, 0x06, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0xef, 0x02, 0x0a, 0x0b, 0x4c, 0x65, 0x64, 0x67, - 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x37, 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x33, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 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, 0x26, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, 0x5f, 0x0a, 0x13, 0x50, 0x6f, 0x73, - 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x2e, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 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, 0x74, 0x0a, 0x0e, 0x4c, 0x65, - 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x07, - 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x22, 0xa8, 0x03, 0x0a, 0x0c, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, - 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, - 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x38, 0x0a, 0x18, 0x63, 0x6f, - 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x63, 0x6f, - 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, - 0x18, 0x05, 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, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x12, 0x31, 0x0a, 0x0b, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x6d, 0x61, 0x72, 0x67, - 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, - 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, - 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0xd6, 0x04, 0x0a, 0x0d, - 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x27, 0x0a, - 0x0f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x75, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, 0x70, 0x12, 0x23, - 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, - 0x77, 0x61, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x22, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x69, 0x6e, + 0x79, 0x52, 0x14, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x29, 0x0a, 0x0a, 0x72, 0x61, 0x6e, 0x6b, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x52, 0x61, 0x6e, 0x6b, 0x52, 0x09, 0x72, 0x61, 0x6e, 0x6b, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x17, 0x63, 0x61, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x14, 0x63, 0x61, 0x70, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x46, 0x65, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x30, + 0x0a, 0x11, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x10, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x88, 0x01, 0x01, + 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x63, 0x61, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, + 0x66, 0x65, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x22, 0x46, 0x0a, 0x04, 0x52, 0x61, 0x6e, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x61, + 0x72, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x73, 0x68, 0x61, 0x72, 0x65, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x22, 0xe6, 0x01, 0x0a, 0x0f, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, + 0x0a, 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x2c, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x09, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 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, 0x1d, 0x0a, 0x0a, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x69, 0x6e, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x0e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x42, + 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x22, 0xef, 0x02, + 0x0a, 0x0b, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x37, 0x0a, + 0x0c, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0b, 0x66, 0x72, 0x6f, 0x6d, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x52, 0x09, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 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, 0x26, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x72, 0x6f, + 0x6d, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x66, 0x72, 0x6f, 0x6d, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x74, + 0x6f, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x6f, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x22, + 0x5f, 0x0a, 0x13, 0x50, 0x6f, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 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, 0x74, 0x0a, 0x0e, 0x4c, 0x65, 0x64, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x76, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x65, 0x64, 0x67, 0x65, + 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x35, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xa8, 0x03, 0x0a, 0x0c, 0x4d, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x74, + 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, + 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, + 0x12, 0x38, 0x0a, 0x18, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x72, + 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x16, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x61, + 0x72, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x12, 0x31, 0x0a, 0x0b, 0x6d, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, + 0x52, 0x0a, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x22, 0xd6, 0x04, 0x0a, 0x0d, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x75, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, + 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x66, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x61, 0x74, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x77, 0x61, 0x70, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x54, 0x77, 0x61, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x74, 0x77, 0x61, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x77, 0x61, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, + 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4e, + 0x75, 0x6d, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x38, 0x0a, 0x18, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x22, 0x6e, + 0x65, 0x78, 0x74, 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, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1e, 0x6e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, 0x63, 0x12, 0x5b, 0x0a, 0x1d, 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, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, + 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x1a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, + 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x1e, 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, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x1e, 0x6e, 0x65, 0x78, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x43, 0x61, 0x6c, - 0x63, 0x12, 0x5b, 0x0a, 0x1d, 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, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x1a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x34, - 0x0a, 0x16, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x79, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x1e, 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, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x1b, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x22, 0x53, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x3c, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, - 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x44, 0x61, 0x74, - 0x61, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x0d, 0x0a, 0x0a, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x61, 0x72, 0x6b, - 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, - 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, 0x0e, 0x62, 0x65, 0x73, 0x74, 0x5f, - 0x62, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x62, 0x65, 0x73, 0x74, 0x42, 0x69, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x26, 0x0a, - 0x0f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x62, 0x65, 0x73, 0x74, 0x42, 0x69, 0x64, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x62, 0x65, 0x73, 0x74, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, - 0x2a, 0x0a, 0x11, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x76, 0x6f, - 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x62, 0x65, 0x73, 0x74, - 0x4f, 0x66, 0x66, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x31, 0x0a, 0x15, 0x62, - 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x62, 0x65, 0x73, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x42, 0x69, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x33, - 0x0a, 0x16, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x62, 0x69, - 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, - 0x62, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x42, 0x69, 0x64, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x17, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x63, 0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x4f, 0x66, 0x66, 0x65, 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x62, 0x65, - 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x62, 0x65, - 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x12, 0x28, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6d, 0x69, 0x64, 0x5f, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x63, 0x4d, 0x69, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, - 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x69, - 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x10, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x13, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x72, - 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x54, - 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x11, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x74, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, - 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, + 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x1b, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x53, 0x0a, 0x0b, 0x50, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x3c, 0x0a, 0x0e, 0x70, 0x65, 0x72, + 0x70, 0x65, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, + 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, + 0x75, 0x61, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0xe3, 0x0d, 0x0a, 0x0a, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x24, 0x0a, + 0x0e, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x65, 0x73, 0x74, 0x42, 0x69, 0x64, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x69, 0x64, 0x5f, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x62, 0x65, + 0x73, 0x74, 0x42, 0x69, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x62, + 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x65, 0x73, 0x74, 0x4f, 0x66, 0x66, 0x65, 0x72, + 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x6f, 0x66, + 0x66, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0f, 0x62, 0x65, 0x73, 0x74, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x12, 0x31, 0x0a, 0x15, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x12, 0x62, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x42, 0x69, 0x64, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x5f, 0x62, 0x69, 0x64, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x62, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x42, 0x69, 0x64, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x17, 0x62, 0x65, 0x73, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x62, 0x65, 0x73, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x4f, 0x66, 0x66, 0x65, 0x72, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x37, 0x0a, 0x18, 0x62, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x15, 0x62, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x4f, 0x66, + 0x66, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x69, 0x64, + 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, + 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x5f, 0x6d, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x4d, 0x69, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6f, + 0x70, 0x65, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x61, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, + 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x61, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, + 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x13, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, + 0x52, 0x11, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x54, 0x72, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, - 0x11, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x10, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x6b, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, - 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x75, 0x70, - 0x70, 0x6c, 0x69, 0x65, 0x64, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x53, 0x0a, 0x17, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x18, 0x18, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, - 0x6e, 0x67, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x15, 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, - 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x60, 0x0a, - 0x1c, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x1a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x65, 0x65, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x52, 0x19, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x65, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, - 0x35, 0x0a, 0x0c, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x1b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6d, - 0x61, 0x72, 0x6b, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x1c, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x78, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x54, 0x6f, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, - 0x61, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, 0x65, 0x64, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x77, - 0x74, 0x68, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, - 0x00, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, - 0x01, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x6c, 0x61, 0x18, 0x20, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x4c, 0x41, 0x52, 0x14, 0x6c, + 0x67, 0x67, 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x75, 0x70, + 0x70, 0x6c, 0x69, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x53, 0x74, 0x61, 0x6b, 0x65, + 0x12, 0x53, 0x0a, 0x17, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x18, 0x18, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x52, 0x15, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x42, + 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x12, 0x60, 0x0a, 0x1c, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x65, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x46, 0x65, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x52, 0x19, 0x6c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x65, 0x65, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x0b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x13, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x65, 0x78, 0x74, 0x4d, + 0x61, 0x72, 0x6b, 0x54, 0x6f, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x64, + 0x65, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x74, 0x5f, 0x67, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x47, 0x72, 0x6f, 0x77, 0x74, 0x68, 0x12, 0x39, 0x0a, 0x0c, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x44, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x16, 0x6c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x6c, + 0x61, 0x18, 0x20, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x53, 0x6c, 0x61, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x21, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x13, 0x6e, 0x65, 0x78, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x43, - 0x6c, 0x6f, 0x73, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x0f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x6d, 0x61, 0x72, 0x6b, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x10, 0x6d, 0x61, 0x72, - 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x23, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, - 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x0f, - 0x0a, 0x0d, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x72, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 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, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0c, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xdf, 0x01, 0x0a, 0x19, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x46, 0x65, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, - 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, - 0x2a, 0x0a, 0x11, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x71, 0x75, 0x69, - 0x74, 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x61, - 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x76, 0x61, 0x6c, - 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, - 0x65, 0x72, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, - 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x76, 0x65, 0x72, - 0x61, 0x67, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, - 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x22, 0x92, 0x04, - 0x0a, 0x14, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x53, 0x4c, 0x41, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x26, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 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, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x20, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 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, 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, 0x03, 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, 0x04, 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, 0x05, 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, 0x45, 0x0a, 0x1f, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, - 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x66, 0x65, 0x65, 0x5f, - 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x1c, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x46, 0x65, 0x65, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x12, 0x2d, 0x0a, - 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x18, 0x07, 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, 0x08, 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, 0x09, 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, 0xc8, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, - 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, - 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x07, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x22, 0x51, 0x0a, - 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, - 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, - 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, - 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, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x70, - 0x6f, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 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, 0x04, 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, 0x05, 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, 0x25, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x6c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, - 0x73, 0x69, 0x73, 0x4c, 0x6f, 0x61, 0x64, 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, 0x08, 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, 0x09, 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, 0x35, 0x0a, 0x17, 0x63, 0x61, 0x6e, 0x5f, 0x70, 0x72, 0x6f, - 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x65, 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x3f, 0x0a, 0x1c, - 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, - 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, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x73, 0x0a, 0x17, 0x4c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3d, - 0x0a, 0x0f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, - 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x6c, - 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xd2, 0x04, - 0x0a, 0x12, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 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, 0x12, - 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 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, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 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, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, - 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x73, 0x65, 0x6c, - 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x73, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x31, - 0x0a, 0x04, 0x62, 0x75, 0x79, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, - 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x62, 0x75, 0x79, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x22, 0x9d, 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, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 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, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, - 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x45, 0x44, 0x10, 0x05, 0x12, 0x12, - 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, - 0x10, 0x06, 0x22, 0xad, 0x01, 0x0a, 0x10, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4c, - 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x22, 0x45, 0x0a, 0x11, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4c, 0x32, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4c, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0xd0, 0x03, 0x0a, 0x0e, 0x45, 0x74, - 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x0a, 0x0a, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, - 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, - 0x65, 0x72, 0x61, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x17, 0x73, 0x74, 0x61, 0x6b, - 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x61, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x15, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, - 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x52, - 0x0a, 0x16, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x14, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x12, 0x58, 0x0a, 0x19, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x17, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x22, 0xda, 0x02, 0x0a, - 0x0f, 0x45, 0x56, 0x4d, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, - 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x1a, 0x63, 0x6f, - 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x18, 0x63, 0x6f, - 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x19, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x17, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x10, 0x45, 0x56, 0x4d, - 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x2f, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x56, 0x4d, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x6a, - 0x0a, 0x16, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x15, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x42, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xac, 0x01, 0x0a, 0x0f, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x66, 0x69, 0x72, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x6c, 0x61, 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xb0, 0x01, 0x0a, 0x05, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, - 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, - 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x2a, 0x0a, 0x0a, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8e, 0x01, 0x0a, - 0x12, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, - 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x06, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x53, 0x0a, - 0x09, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x6e, - 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x22, 0x9b, 0x02, 0x0a, 0x0c, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, - 0x6f, 0x72, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, - 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, - 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, - 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x22, 0xab, 0x02, 0x0a, 0x0b, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x63, 0x6f, 0x72, 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, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, - 0x61, 0x77, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, - 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x65, 0x72, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, - 0x72, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, 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, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, - 0x73, 0x65, 0x64, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x53, 0x4c, 0x41, 0x52, 0x14, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x6c, 0x61, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x6f, + 0x75, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x65, 0x78, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x40, 0x0a, + 0x0f, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0d, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x43, 0x0a, 0x10, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x6d, 0x61, 0x72, 0x6b, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x22, 0x72, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 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, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6c, 0x61, + 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0x56, 0x0a, 0x13, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x3f, 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x63, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x22, 0xdf, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x46, 0x65, 0x65, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x5f, + 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x65, 0x71, 0x75, 0x69, 0x74, 0x79, 0x4c, 0x69, 0x6b, 0x65, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x15, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x56, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x74, + 0x61, 0x6b, 0x65, 0x22, 0x92, 0x04, 0x0a, 0x14, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x4c, 0x41, 0x12, 0x14, 0x0a, 0x05, + 0x70, 0x61, 0x72, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x72, + 0x74, 0x79, 0x12, 0x50, 0x0a, 0x26, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 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, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 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, 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, 0x03, 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, 0x04, 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, 0x05, 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, 0x45, 0x0a, 0x1f, + 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1c, 0x68, 0x79, 0x73, 0x74, 0x65, 0x72, 0x65, 0x73, 0x69, + 0x73, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x46, 0x65, 0x65, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, + 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x18, 0x07, 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, 0x08, 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, 0x09, 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, 0xe0, 0x01, 0x0a, 0x15, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x6f, 0x75, 0x6e, + 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, + 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, + 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x51, 0x0a, 0x0b, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x6e, 0x65, 0x72, 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, 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, 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, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 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, 0x04, 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, 0x05, 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, 0x25, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x6c, 0x6f, 0x61, 0x64, + 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x4c, 0x6f, 0x61, 0x64, 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, 0x08, 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, 0x09, 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, 0x35, 0x0a, 0x17, 0x63, 0x61, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x65, 0x5f, 0x73, 0x70, 0x6f, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x63, 0x61, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x65, + 0x53, 0x70, 0x6f, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 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, 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, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x73, 0x0a, 0x17, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, + 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x0f, + 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x0e, 0x6c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xd2, 0x04, 0x0a, 0x12, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 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, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 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, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 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, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x66, 0x65, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x66, 0x65, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x73, 0x65, 0x6c, 0x6c, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x73, 0x65, 0x6c, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x04, + 0x62, 0x75, 0x79, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x04, 0x62, 0x75, 0x79, 0x73, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, 0x61, + 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x22, 0x9d, 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, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 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, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, + 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x55, 0x4e, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x45, 0x44, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x06, + 0x22, 0xad, 0x01, 0x0a, 0x10, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4c, 0x32, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, + 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x22, 0x45, 0x0a, 0x11, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4c, 0x32, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x4c, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0xef, 0x03, 0x0a, 0x0e, 0x45, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x17, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, + 0x67, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x15, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x42, 0x72, + 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x52, 0x0a, 0x16, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x14, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x12, 0x58, 0x0a, 0x19, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, + 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x17, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xda, 0x02, 0x0a, 0x0f, 0x45, 0x56, + 0x4d, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1d, 0x0a, + 0x0a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x5a, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x6c, 0x61, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x18, 0x63, 0x6f, 0x6c, 0x6c, 0x61, + 0x74, 0x65, 0x72, 0x61, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x19, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x45, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x17, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x73, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x43, 0x0a, 0x10, 0x45, 0x56, 0x4d, 0x42, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x45, 0x56, 0x4d, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x6a, 0x0a, 0x16, 0x45, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 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, + 0x36, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x15, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xac, 0x01, 0x0a, 0x0f, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, + 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, + 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, + 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6c, 0x61, 0x73, + 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0xb0, 0x01, 0x0a, 0x05, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x73, + 0x65, 0x71, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x52, 0x0a, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x12, 0x2a, 0x0a, 0x0a, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, + 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x12, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x21, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0b, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6f, + 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x72, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x53, 0x0a, 0x09, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x6f, 0x66, 0x66, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x22, + 0x9b, 0x02, 0x0a, 0x0c, 0x52, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x42, + 0x0a, 0x0f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb3, - 0x05, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x12, 0x1c, 0x0a, 0x0a, 0x74, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x29, - 0x0a, 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x75, 0x6d, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, 0x66, - 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x66, - 0x6f, 0x55, 0x72, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, - 0x61, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2e, - 0x0a, 0x13, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x65, - 0x67, 0x61, 0x74, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, - 0x6b, 0x65, 0x64, 0x42, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, - 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x6b, 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, - 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x0b, 0x72, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x6b, - 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x10, 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, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, - 0x72, 0x55, 0x72, 0x6c, 0x22, 0x9c, 0x01, 0x0a, 0x07, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x64, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x69, - 0x6d, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x78, - 0x69, 0x6d, 0x75, 0x6d, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x61, 0x78, 0x69, - 0x6d, 0x75, 0x6d, 0x22, 0xad, 0x02, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x69, 0x6e, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x10, 0x74, - 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x53, 0x65, 0x74, 0x52, 0x0f, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x0c, 0x65, 0x72, 0x73, 0x61, 0x74, 0x7a, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0b, 0x65, 0x72, 0x73, 0x61, - 0x74, 0x7a, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0c, 0x70, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x75, - 0x70, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x75, 0x70, 0x74, - 0x69, 0x6d, 0x65, 0x22, 0x70, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 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, 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, 0xa4, 0x03, 0x0a, 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 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, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 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, 0x2e, 0x0a, 0x13, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, - 0x67, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x4f, 0x66, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, - 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x08, 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, 0x04, 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, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, - 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x22, 0x5d, 0x0a, 0x0d, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x19, 0x0a, + 0x74, 0x6f, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x76, 0x6f, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x76, 0x6f, 0x74, + 0x69, 0x6e, 0x67, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x6b, + 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xab, 0x02, + 0x0a, 0x0b, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x63, 0x6f, 0x72, 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, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x61, 0x77, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2b, 0x0a, + 0x11, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x63, 0x6f, + 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x69, 0x67, 0x53, 0x63, 0x6f, 0x72, + 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, + 0x63, 0x6f, 0x72, 0x65, 0x18, 0x04, 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, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x64, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x19, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb3, 0x05, 0x0a, 0x04, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, + 0x0a, 0x74, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x6d, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x74, 0x68, 0x65, 0x72, 0x65, 0x75, 0x6d, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x66, 0x6f, 0x55, 0x72, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, + 0x12, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x6b, 0x65, + 0x64, 0x42, 0x79, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x73, + 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, + 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, + 0x42, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x2c, + 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x73, + 0x74, 0x61, 0x6b, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x49, + 0x6e, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x6b, + 0x65, 0x12, 0x2e, 0x0a, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x44, 0x61, 0x74, 0x61, 0x52, 0x09, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x0b, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x34, 0x0a, 0x0c, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x0b, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x37, 0x0a, 0x0d, 0x72, 0x61, 0x6e, 0x6b, 0x69, 0x6e, 0x67, + 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x10, 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, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, + 0x6c, 0x22, 0x9c, 0x01, 0x0a, 0x07, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x64, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x64, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x22, 0xad, 0x02, 0x0a, 0x08, 0x4e, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x21, 0x0a, + 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x69, 0x6e, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x10, 0x74, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, + 0x74, 0x52, 0x0f, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x12, 0x30, 0x0a, 0x0c, 0x65, 0x72, 0x73, 0x61, 0x74, 0x7a, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0b, 0x65, 0x72, 0x73, 0x61, 0x74, 0x7a, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x0d, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x76, 0x65, + 0x67, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x74, 0x52, 0x0c, 0x70, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x70, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, + 0x22, 0x70, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 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, 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, 0xa4, 0x03, 0x0a, 0x06, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 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, 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, 0x9b, 0x01, 0x0a, 0x12, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x49, 0x64, 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, - 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x12, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, - 0x20, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x49, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x03, - 0x6b, 0x76, 0x62, 0x18, 0x03, 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, - 0x03, 0x6b, 0x76, 0x62, 0x22, 0x6b, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x6f, 0x6c, 0x65, - 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6c, - 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x56, 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x0a, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x5f, 0x76, 0x61, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, - 0x63, 0x61, 0x6c, 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x73, 0x63, - 0x61, 0x6c, 0x61, 0x72, 0x56, 0x61, 0x6c, 0x12, 0x32, 0x0a, 0x0a, 0x76, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, - 0x52, 0x09, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x12, 0x32, 0x0a, 0x0a, 0x6d, - 0x61, 0x74, 0x72, 0x69, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x56, 0x61, 0x6c, 0x42, - 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x53, 0x63, 0x61, 0x6c, - 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, - 0x0b, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0x36, 0x0a, 0x0b, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x27, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x89, 0x02, 0x0a, 0x0f, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x18, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, - 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, - 0x65, 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, - 0x12, 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, - 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, - 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, - 0x67, 0x54, 0x69, 0x65, 0x72, 0x73, 0x22, 0x9b, 0x01, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x25, - 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, - 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x6d, 0x69, 0x6e, - 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x74, 0x69, 0x6f, - 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x34, - 0x0a, 0x16, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x22, 0xf6, 0x01, 0x0a, 0x0b, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, - 0x54, 0x69, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x25, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x21, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, - 0x6d, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x12, 0x34, 0x0a, - 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, - 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x44, - 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x45, 0x0a, - 0x13, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, - 0x69, 0x65, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x05, 0x74, - 0x69, 0x65, 0x72, 0x73, 0x22, 0x79, 0x0a, 0x12, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, - 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x6d, 0x69, - 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x62, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6d, 0x69, 0x6e, - 0x69, 0x6d, 0x75, 0x6d, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x22, - 0x7f, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x65, 0x72, 0x12, 0x32, - 0x0a, 0x15, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, - 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x72, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, - 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x22, 0xdd, 0x01, 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, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, - 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, - 0x67, 0x61, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, - 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, - 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x22, 0x53, 0x0a, 0x1a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6b, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x35, - 0x0a, 0x05, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x76, 0x65, 0x67, 0x61, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6b, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x05, - 0x74, 0x69, 0x65, 0x72, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x19, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, - 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, - 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x72, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x76, 0x65, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x2a, 0x39, 0x0a, 0x04, 0x53, 0x69, 0x64, 0x65, 0x12, - 0x14, 0x0a, 0x10, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x42, 0x55, - 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x4c, 0x4c, - 0x10, 0x02, 0x2a, 0x99, 0x02, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, - 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x0e, 0x49, 0x4e, 0x54, - 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, - 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x4d, 0x10, 0x3c, 0x12, 0x11, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, - 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x35, 0x4d, 0x10, 0xac, 0x02, 0x12, 0x12, 0x0a, 0x0d, 0x49, - 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x35, 0x4d, 0x10, 0x84, 0x07, 0x12, - 0x12, 0x0a, 0x0d, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x33, 0x30, 0x4d, - 0x10, 0x88, 0x0e, 0x12, 0x11, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, - 0x49, 0x31, 0x48, 0x10, 0x90, 0x1c, 0x12, 0x11, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, - 0x41, 0x4c, 0x5f, 0x49, 0x34, 0x48, 0x10, 0xc0, 0x70, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, - 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x36, 0x48, 0x10, 0xe0, 0xa8, 0x01, 0x12, 0x12, 0x0a, - 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x38, 0x48, 0x10, 0x80, 0xe1, - 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, - 0x32, 0x48, 0x10, 0xc0, 0xd1, 0x02, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, - 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x44, 0x10, 0x80, 0xa3, 0x05, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, - 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x37, 0x44, 0x10, 0x80, 0xf5, 0x24, 0x2a, 0x94, - 0x01, 0x0a, 0x0e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x43, 0x4c, 0x4f, - 0x53, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x5f, - 0x4f, 0x55, 0x54, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, - 0x53, 0x45, 0x44, 0x10, 0x04, 0x2a, 0xb0, 0x02, 0x0a, 0x0e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x55, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x42, 0x41, 0x54, - 0x43, 0x48, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, - 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, - 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, - 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x10, 0x04, 0x12, 0x2c, 0x0a, 0x28, 0x41, - 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4c, - 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, - 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x10, 0x05, 0x12, 0x32, 0x0a, 0x2a, 0x41, 0x55, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x41, - 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x5f, 0x4c, 0x50, - 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x06, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x29, 0x0a, - 0x25, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, - 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, - 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x2a, 0x8b, 0x01, 0x0a, 0x0f, 0x50, 0x65, 0x67, - 0x67, 0x65, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x1c, - 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, - 0x0a, 0x14, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, - 0x43, 0x45, 0x5f, 0x4d, 0x49, 0x44, 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x45, 0x47, 0x47, - 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, - 0x54, 0x5f, 0x42, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x45, 0x47, 0x47, 0x45, - 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, - 0x5f, 0x41, 0x53, 0x4b, 0x10, 0x03, 0x2a, 0xe2, 0x11, 0x0a, 0x0a, 0x4f, 0x72, 0x64, 0x65, 0x72, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, - 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x45, - 0x51, 0x55, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, - 0x52, 0x45, 0x4d, 0x41, 0x49, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x04, - 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x05, 0x12, 0x1f, - 0x0a, 0x1b, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, - 0x4d, 0x4f, 0x56, 0x41, 0x4c, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x06, 0x12, - 0x2b, 0x0a, 0x27, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x44, 0x41, 0x54, 0x45, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x07, 0x12, 0x27, 0x0a, 0x23, + 0x79, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 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, 0x2e, 0x0a, 0x13, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x5f, + 0x6f, 0x66, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x4f, 0x66, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x74, 0x49, 0x64, 0x12, + 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, + 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, 0x04, 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, 0x12, 0x1c, 0x0a, 0x07, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x74, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x74, 0x65, 0x61, 0x6d, 0x5f, 0x69, 0x64, 0x22, 0x5d, 0x0a, 0x0d, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x49, 0x64, 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, + 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, 0x9b, 0x01, 0x0a, 0x12, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, + 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, 0x12, 0x1f, 0x0a, + 0x0b, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x20, 0x0a, 0x0c, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x76, 0x61, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x49, 0x64, 0x12, 0x19, + 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x6b, 0x76, 0x62, + 0x18, 0x03, 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, 0x03, 0x6b, 0x76, + 0x62, 0x22, 0x6b, 0x0a, 0x0e, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x75, 0x6e, + 0x64, 0x6c, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, + 0x6e, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, + 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb4, + 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x32, 0x0a, 0x0a, 0x73, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x63, 0x61, 0x6c, + 0x61, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x73, 0x63, 0x61, 0x6c, 0x61, + 0x72, 0x56, 0x61, 0x6c, 0x12, 0x32, 0x0a, 0x0a, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x5f, 0x76, + 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x76, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x12, 0x32, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x72, + 0x69, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, + 0x00, 0x52, 0x09, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x56, 0x61, 0x6c, 0x42, 0x07, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x53, 0x63, 0x61, 0x6c, 0x61, 0x72, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0b, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x36, 0x0a, 0x0b, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x27, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x89, 0x02, 0x0a, 0x0f, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, + 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, + 0x65, 0x67, 0x61, 0x2e, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, + 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, + 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x0d, 0x73, + 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, + 0x67, 0x54, 0x69, 0x65, 0x72, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, + 0x65, 0x72, 0x73, 0x22, 0x9b, 0x01, 0x0a, 0x11, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x65, + 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x25, 0x6d, 0x69, 0x6e, + 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, + 0x6d, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, + 0x72, 0x22, 0xf6, 0x01, 0x0a, 0x0b, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, + 0x72, 0x12, 0x50, 0x0a, 0x25, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x61, + 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x21, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x4e, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x61, 0x6b, 0x65, 0x72, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x69, 0x6e, + 0x69, 0x6d, 0x75, 0x6d, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x66, 0x61, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x38, 0x0a, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x45, 0x0a, 0x13, 0x56, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, + 0x73, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, + 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x05, 0x74, 0x69, 0x65, 0x72, + 0x73, 0x22, 0x79, 0x0a, 0x12, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x65, 0x6e, 0x65, + 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, 0x6d, 0x69, 0x6e, 0x69, 0x6d, + 0x75, 0x6d, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, + 0x6d, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x75, 0x6d, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, + 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x22, 0x7f, 0x0a, 0x0b, + 0x53, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x6d, + 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6d, 0x69, 0x6e, 0x69, + 0x6d, 0x75, 0x6d, 0x53, 0x74, 0x61, 0x6b, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, + 0x3c, 0x0a, 0x1a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x18, 0x72, 0x65, 0x66, 0x65, 0x72, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x22, 0xdd, 0x01, + 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, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x5f, 0x74, 0x69, 0x65, + 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, + 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, + 0x72, 0x52, 0x0c, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, + 0x37, 0x0a, 0x18, 0x65, 0x6e, 0x64, 0x5f, 0x6f, 0x66, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, + 0x6d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x15, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0c, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x53, 0x0a, + 0x1a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x42, + 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x73, 0x12, 0x35, 0x0a, 0x05, 0x74, + 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x76, 0x65, 0x67, + 0x61, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, + 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, 0x52, 0x05, 0x74, 0x69, 0x65, + 0x72, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x19, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6b, 0x42, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x54, 0x69, 0x65, 0x72, + 0x12, 0x36, 0x0a, 0x17, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, + 0x74, 0x79, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x12, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x69, 0x65, 0x72, 0x22, 0x4c, 0x0a, 0x10, 0x4c, 0x6f, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x6d, 0x0a, 0x1d, 0x4c, 0x6f, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x41, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x4c, 0x0a, 0x16, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x76, 0x65, 0x67, 0x61, 0x2e, 0x4c, 0x6f, 0x6e, 0x67, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x74, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x41, 0x6e, 0x64, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2a, 0x39, 0x0a, 0x04, 0x53, 0x69, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x49, 0x44, + 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x0c, 0x0a, 0x08, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x42, 0x55, 0x59, 0x10, 0x01, 0x12, 0x0d, 0x0a, + 0x09, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x4c, 0x4c, 0x10, 0x02, 0x2a, 0x99, 0x02, 0x0a, + 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x54, + 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x0e, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, + 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, + 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x4d, + 0x10, 0x3c, 0x12, 0x11, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, + 0x35, 0x4d, 0x10, 0xac, 0x02, 0x12, 0x12, 0x0a, 0x0d, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, + 0x4c, 0x5f, 0x49, 0x31, 0x35, 0x4d, 0x10, 0x84, 0x07, 0x12, 0x12, 0x0a, 0x0d, 0x49, 0x4e, 0x54, + 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x33, 0x30, 0x4d, 0x10, 0x88, 0x0e, 0x12, 0x11, 0x0a, + 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x48, 0x10, 0x90, 0x1c, + 0x12, 0x11, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x34, 0x48, + 0x10, 0xc0, 0x70, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, + 0x49, 0x36, 0x48, 0x10, 0xe0, 0xa8, 0x01, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, + 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x38, 0x48, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x49, + 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x32, 0x48, 0x10, 0xc0, 0xd1, 0x02, + 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x31, 0x44, + 0x10, 0x80, 0xa3, 0x05, 0x12, 0x12, 0x0a, 0x0c, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, + 0x5f, 0x49, 0x37, 0x44, 0x10, 0x80, 0xf5, 0x24, 0x2a, 0x94, 0x01, 0x0a, 0x0e, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x1b, 0x50, + 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, + 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x01, 0x12, + 0x1e, 0x0a, 0x1a, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x02, 0x12, + 0x1e, 0x0a, 0x1a, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x45, 0x53, 0x53, 0x45, 0x44, 0x10, 0x04, 0x2a, + 0xd0, 0x02, 0x0a, 0x0e, 0x41, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, + 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, + 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, 0x01, 0x12, 0x1b, + 0x0a, 0x17, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, + 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x41, + 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x50, + 0x52, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, + 0x49, 0x54, 0x59, 0x10, 0x04, 0x12, 0x2c, 0x0a, 0x28, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, + 0x54, 0x59, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x4d, 0x45, + 0x54, 0x10, 0x05, 0x12, 0x32, 0x0a, 0x2a, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, + 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, + 0x5f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x5f, 0x4c, 0x50, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x53, 0x10, 0x06, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x55, 0x43, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x47, 0x4f, 0x56, 0x45, 0x52, + 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x55, 0x53, 0x50, 0x45, 0x4e, 0x53, 0x49, 0x4f, 0x4e, + 0x10, 0x07, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x52, + 0x49, 0x47, 0x47, 0x45, 0x52, 0x5f, 0x4c, 0x4f, 0x4e, 0x47, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, + 0x10, 0x08, 0x2a, 0x8b, 0x01, 0x0a, 0x0f, 0x50, 0x65, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, + 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x45, 0x47, 0x47, + 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x4d, 0x49, 0x44, + 0x10, 0x01, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, + 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x42, 0x49, 0x44, 0x10, + 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x46, 0x45, + 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x41, 0x53, 0x4b, 0x10, 0x03, + 0x2a, 0xa1, 0x12, 0x0a, 0x0a, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x1b, 0x0a, 0x17, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, - 0x4e, 0x43, 0x45, 0x10, 0x08, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x44, 0x49, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, - 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x09, 0x12, 0x1d, 0x0a, 0x19, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x41, 0x49, - 0x4c, 0x55, 0x52, 0x45, 0x10, 0x0a, 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, - 0x0b, 0x12, 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x49, - 0x44, 0x10, 0x0c, 0x12, 0x1d, 0x0a, 0x19, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, - 0x10, 0x0d, 0x12, 0x23, 0x0a, 0x1f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x46, - 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0e, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x47, - 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x0f, - 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x10, - 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x11, 0x12, 0x23, - 0x0a, 0x1f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, - 0x45, 0x10, 0x12, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, - 0x13, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x14, 0x12, - 0x2e, 0x0a, 0x2a, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, - 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x55, 0x4e, 0x44, - 0x53, 0x5f, 0x54, 0x4f, 0x5f, 0x50, 0x41, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x15, 0x12, - 0x25, 0x0a, 0x21, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, - 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x10, 0x16, 0x12, 0x25, 0x0a, 0x21, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x49, - 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x17, 0x12, 0x37, 0x0a, - 0x33, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, - 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x47, 0x46, 0x4e, 0x5f, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x5f, 0x41, 0x55, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x18, 0x12, 0x3f, 0x0a, 0x3b, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x4c, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x01, 0x12, + 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, + 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x49, 0x44, 0x10, + 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x43, 0x45, + 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x52, 0x45, 0x4d, 0x41, 0x49, 0x4e, + 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x04, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, + 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x46, + 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x41, 0x4c, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x06, 0x12, 0x2b, 0x0a, 0x27, 0x4f, 0x52, 0x44, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x41, 0x54, 0x45, + 0x54, 0x49, 0x4d, 0x45, 0x10, 0x07, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4f, 0x52, + 0x44, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x08, 0x12, + 0x20, 0x0a, 0x1c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, + 0x44, 0x49, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, + 0x09, 0x12, 0x1d, 0x0a, 0x19, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x0a, + 0x12, 0x19, 0x0a, 0x15, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x4e, 0x4f, 0x54, 0x5f, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x10, 0x0b, 0x12, 0x20, 0x0a, 0x1c, 0x4f, + 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x12, 0x1d, 0x0a, + 0x19, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x52, + 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x23, 0x0a, 0x1f, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x47, + 0x49, 0x4e, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, + 0x0e, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, + 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x0f, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x52, + 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, + 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, + 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x11, 0x12, 0x23, 0x0a, 0x1f, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, + 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x43, 0x45, 0x10, 0x12, 0x12, 0x1c, 0x0a, + 0x18, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x13, 0x12, 0x1c, 0x0a, 0x18, 0x4f, + 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, + 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x14, 0x12, 0x2e, 0x0a, 0x2a, 0x4f, 0x52, 0x44, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, + 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x54, 0x4f, 0x5f, 0x50, + 0x41, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x15, 0x12, 0x25, 0x0a, 0x21, 0x4f, 0x52, 0x44, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, + 0x43, 0x54, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x16, + 0x12, 0x25, 0x0a, 0x21, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x5f, + 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x17, 0x12, 0x37, 0x0a, 0x33, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, + 0x4e, 0x44, 0x5f, 0x47, 0x46, 0x4e, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, + 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x18, + 0x12, 0x3f, 0x0a, 0x3b, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x47, 0x46, 0x41, 0x5f, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x4e, + 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, + 0x19, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x4f, + 0x5f, 0x47, 0x54, 0x54, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x5f, 0x45, 0x58, 0x50, + 0x49, 0x52, 0x59, 0x41, 0x54, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x41, 0x54, 0x5f, + 0x42, 0x45, 0x46, 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x41, 0x54, + 0x10, 0x1b, 0x12, 0x2c, 0x0a, 0x28, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x48, 0x41, 0x56, 0x45, 0x5f, 0x47, 0x54, + 0x43, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x41, 0x54, 0x10, 0x1c, + 0x12, 0x2a, 0x0a, 0x26, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x4f, 0x5f, + 0x46, 0x4f, 0x4b, 0x5f, 0x4f, 0x52, 0x5f, 0x49, 0x4f, 0x43, 0x10, 0x1d, 0x12, 0x2a, 0x0a, 0x26, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, + 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x4f, 0x5f, 0x47, 0x46, 0x41, 0x5f, + 0x4f, 0x52, 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x1e, 0x12, 0x2c, 0x0a, 0x28, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, + 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x5f, 0x47, 0x46, 0x41, 0x5f, 0x4f, 0x52, + 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x1f, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, - 0x44, 0x5f, 0x47, 0x46, 0x41, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, - 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x5f, 0x54, 0x52, - 0x41, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x19, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, - 0x45, 0x4e, 0x44, 0x5f, 0x54, 0x4f, 0x5f, 0x47, 0x54, 0x54, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, - 0x55, 0x54, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x41, 0x54, 0x10, 0x1a, 0x12, 0x29, 0x0a, - 0x25, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x58, 0x50, - 0x49, 0x52, 0x59, 0x41, 0x54, 0x5f, 0x42, 0x45, 0x46, 0x4f, 0x52, 0x45, 0x5f, 0x43, 0x52, 0x45, - 0x41, 0x54, 0x45, 0x44, 0x41, 0x54, 0x10, 0x1b, 0x12, 0x2c, 0x0a, 0x28, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x48, - 0x41, 0x56, 0x45, 0x5f, 0x47, 0x54, 0x43, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x49, - 0x52, 0x59, 0x41, 0x54, 0x10, 0x1c, 0x12, 0x2a, 0x0a, 0x26, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, - 0x4e, 0x44, 0x5f, 0x54, 0x4f, 0x5f, 0x46, 0x4f, 0x4b, 0x5f, 0x4f, 0x52, 0x5f, 0x49, 0x4f, 0x43, - 0x10, 0x1d, 0x12, 0x2a, 0x0a, 0x26, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x54, - 0x4f, 0x5f, 0x47, 0x46, 0x41, 0x5f, 0x4f, 0x52, 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x1e, 0x12, 0x2c, - 0x0a, 0x28, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, - 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x52, 0x4f, 0x4d, 0x5f, - 0x47, 0x46, 0x41, 0x5f, 0x4f, 0x52, 0x5f, 0x47, 0x46, 0x4e, 0x10, 0x1f, 0x12, 0x34, 0x0a, 0x30, + 0x44, 0x5f, 0x49, 0x4f, 0x43, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, + 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x20, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, - 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x49, 0x4f, 0x43, 0x5f, 0x4f, 0x52, 0x44, 0x45, + 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x4f, 0x4b, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x20, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x46, 0x4f, - 0x4b, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x41, - 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x21, 0x12, 0x23, 0x0a, 0x1f, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, - 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x22, 0x12, 0x22, 0x0a, - 0x1e, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x55, 0x53, - 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x54, 0x54, 0x5f, 0x4f, 0x52, 0x5f, 0x47, 0x54, 0x43, 0x10, - 0x23, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, - 0x43, 0x45, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x24, 0x12, 0x33, 0x0a, 0x2f, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x42, 0x55, 0x59, 0x5f, 0x43, 0x41, - 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, - 0x45, 0x53, 0x54, 0x5f, 0x41, 0x53, 0x4b, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x25, 0x12, - 0x37, 0x0a, 0x33, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, - 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x52, - 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x5f, 0x54, - 0x4f, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x28, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x4c, 0x5f, 0x43, 0x41, 0x4e, - 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, - 0x53, 0x54, 0x5f, 0x42, 0x49, 0x44, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x29, 0x12, 0x30, - 0x0a, 0x2c, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x46, - 0x46, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x52, 0x45, - 0x41, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x2a, - 0x12, 0x2a, 0x0a, 0x26, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, - 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x53, - 0x45, 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x2b, 0x12, 0x45, 0x0a, 0x41, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, - 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, 0x5f, 0x4f, 0x4e, - 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x10, 0x2c, 0x12, 0x2e, 0x0a, 0x2a, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x50, - 0x52, 0x49, 0x43, 0x45, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, - 0x52, 0x10, 0x2d, 0x12, 0x35, 0x0a, 0x31, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x4d, 0x45, - 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x47, 0x47, - 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x2e, 0x12, 0x38, 0x0a, 0x34, 0x4f, 0x52, - 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x50, 0x45, - 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, 0x4e, 0x54, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4f, - 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x42, 0x4f, 0x55, 0x4e, - 0x44, 0x53, 0x10, 0x2f, 0x12, 0x26, 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x50, 0x45, 0x47, - 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x10, 0x30, 0x12, 0x2b, 0x0a, 0x27, - 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x4f, 0x53, 0x54, - 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x55, 0x4c, - 0x44, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x45, 0x10, 0x31, 0x12, 0x3b, 0x0a, 0x37, 0x4f, 0x52, 0x44, - 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, - 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x55, 0x4c, 0x44, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x32, 0x12, 0x2c, 0x0a, 0x28, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x53, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x4d, - 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x49, 0x4c, - 0x45, 0x44, 0x10, 0x33, 0x12, 0x41, 0x0a, 0x3d, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x49, 0x4e, - 0x5f, 0x49, 0x53, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, - 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x34, 0x12, 0x26, 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, 0x52, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x54, - 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x43, 0x4b, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x35, 0x22, - 0x04, 0x08, 0x26, 0x10, 0x26, 0x22, 0x04, 0x08, 0x27, 0x10, 0x27, 0x2a, 0x82, 0x01, 0x0a, 0x0b, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x18, 0x43, - 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48, 0x41, - 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, - 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x49, - 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x59, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, - 0x2a, 0xbb, 0x08, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, - 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, - 0x4e, 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, - 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, - 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x43, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, 0x03, - 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x43, + 0x10, 0x21, 0x12, 0x23, 0x0a, 0x1f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x22, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x52, 0x44, 0x45, 0x52, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, + 0x54, 0x54, 0x5f, 0x4f, 0x52, 0x5f, 0x47, 0x54, 0x43, 0x10, 0x23, 0x12, 0x27, 0x0a, 0x23, 0x4f, + 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, + 0x55, 0x54, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x50, 0x52, 0x49, + 0x43, 0x45, 0x10, 0x24, 0x12, 0x33, 0x0a, 0x2f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x42, 0x55, 0x59, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x52, + 0x45, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x41, 0x53, + 0x4b, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x25, 0x12, 0x37, 0x0a, 0x33, 0x4f, 0x52, 0x44, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, + 0x4d, 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, + 0x4f, 0x52, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x5f, 0x54, 0x4f, 0x5f, 0x5a, 0x45, 0x52, 0x4f, + 0x10, 0x28, 0x12, 0x34, 0x0a, 0x30, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x4c, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, + 0x46, 0x45, 0x52, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x45, 0x53, 0x54, 0x5f, 0x42, 0x49, 0x44, + 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x29, 0x12, 0x30, 0x0a, 0x2c, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x4d, + 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, 0x54, + 0x48, 0x41, 0x4e, 0x5f, 0x5a, 0x45, 0x52, 0x4f, 0x10, 0x2a, 0x12, 0x2a, 0x0a, 0x26, 0x4f, 0x52, + 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, + 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x42, 0x41, 0x4c, + 0x41, 0x4e, 0x43, 0x45, 0x10, 0x2b, 0x12, 0x45, 0x0a, 0x41, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4d, 0x45, + 0x4e, 0x44, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, 0x5f, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x50, + 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x2c, 0x12, 0x2e, 0x0a, + 0x2a, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x50, + 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x2d, 0x12, 0x35, 0x0a, + 0x31, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, + 0x42, 0x4c, 0x45, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x4d, 0x45, 0x4e, 0x44, 0x5f, 0x50, 0x52, 0x49, + 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, + 0x45, 0x52, 0x10, 0x2e, 0x12, 0x38, 0x0a, 0x34, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x53, 0x49, 0x53, 0x54, 0x45, + 0x4e, 0x54, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4f, 0x55, 0x54, 0x5f, 0x4f, 0x46, 0x5f, + 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x10, 0x2f, 0x12, 0x26, + 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x54, 0x4f, + 0x4f, 0x5f, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x50, 0x45, 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, + 0x44, 0x45, 0x52, 0x53, 0x10, 0x30, 0x12, 0x2b, 0x0a, 0x27, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x54, 0x52, 0x41, 0x44, + 0x45, 0x10, 0x31, 0x12, 0x3b, 0x0a, 0x37, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x5f, 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x5f, 0x4f, + 0x52, 0x44, 0x45, 0x52, 0x5f, 0x57, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, + 0x45, 0x44, 0x55, 0x43, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x32, + 0x12, 0x2c, 0x0a, 0x28, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, + 0x49, 0x53, 0x4f, 0x4c, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, + 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x33, 0x12, 0x41, + 0x0a, 0x3d, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x45, + 0x47, 0x47, 0x45, 0x44, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, + 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x5f, 0x49, 0x53, 0x4f, 0x4c, 0x41, + 0x54, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, + 0x34, 0x12, 0x26, 0x0a, 0x22, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x54, 0x49, + 0x43, 0x4b, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x10, 0x35, 0x12, 0x3d, 0x0a, 0x39, 0x4f, 0x52, 0x44, + 0x45, 0x52, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x5f, 0x4d, + 0x55, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x48, 0x41, 0x4e, + 0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x5f, 0x54, 0x4f, 0x5f, 0x4d, 0x41, 0x58, + 0x5f, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x36, 0x22, 0x04, 0x08, 0x26, 0x10, 0x26, 0x22, 0x04, + 0x08, 0x27, 0x10, 0x27, 0x2a, 0x82, 0x01, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, + 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x59, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x1a, 0x0a, + 0x16, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, + 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0xbb, 0x08, 0x0a, 0x0b, 0x41, 0x63, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x43, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, + 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x02, + 0x12, 0x17, 0x0a, 0x13, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, + 0x4c, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, + 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x4c, + 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x10, 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, - 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, 0x10, 0x05, - 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x10, - 0x06, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x10, 0x07, 0x12, 0x15, - 0x0a, 0x11, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, - 0x4f, 0x4e, 0x44, 0x10, 0x09, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x0a, - 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, - 0x45, 0x10, 0x0b, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, - 0x44, 0x10, 0x0c, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x53, 0x10, 0x0d, 0x12, 0x27, 0x0a, 0x23, 0x41, 0x43, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, - 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x50, 0x41, 0x49, 0x44, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x0e, - 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x52, 0x45, - 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x0f, 0x12, 0x28, 0x0a, - 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, - 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4c, 0x50, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, - 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x10, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, - 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x52, 0x53, 0x10, - 0x11, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x12, 0x12, 0x22, 0x0a, 0x1e, 0x41, - 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x50, 0x5f, 0x4c, - 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x13, 0x12, - 0x32, 0x0a, 0x2e, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x42, - 0x4f, 0x4e, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x14, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x54, 0x52, 0x45, 0x41, - 0x53, 0x55, 0x52, 0x59, 0x10, 0x15, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x52, - 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x16, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x43, 0x4f, - 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x45, 0x44, 0x5f, - 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, 0x17, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x43, 0x43, + 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x10, 0x07, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x43, 0x43, 0x4f, 0x55, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x10, 0x09, 0x12, 0x19, + 0x0a, 0x15, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, + 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x0a, 0x12, 0x21, 0x0a, 0x1d, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, + 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x0b, 0x12, 0x1e, 0x0a, 0x1a, + 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x4c, 0x4f, + 0x42, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x10, 0x0c, 0x12, 0x22, 0x0a, 0x1e, + 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x53, 0x10, 0x0d, + 0x12, 0x27, 0x0a, 0x23, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x50, 0x41, + 0x49, 0x44, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x0e, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, - 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x18, 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, 0x4c, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x5f, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x10, 0x19, 0x12, 0x29, 0x0a, 0x25, + 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x5f, + 0x46, 0x45, 0x45, 0x53, 0x10, 0x0f, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4c, 0x50, + 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x44, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x10, + 0x12, 0x28, 0x0a, 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x4b, 0x45, 0x54, 0x5f, 0x50, + 0x52, 0x4f, 0x50, 0x4f, 0x53, 0x45, 0x52, 0x53, 0x10, 0x11, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x43, + 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x12, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x50, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, + 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x13, 0x12, 0x32, 0x0a, 0x2e, 0x41, 0x43, 0x43, 0x4f, + 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, + 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53, 0x5f, 0x44, 0x49, + 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x14, 0x12, 0x21, 0x0a, 0x1d, + 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, + 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x54, 0x52, 0x45, 0x41, 0x53, 0x55, 0x52, 0x59, 0x10, 0x15, 0x12, + 0x20, 0x0a, 0x1c, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x56, 0x45, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x10, + 0x16, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x45, 0x44, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, + 0x10, 0x17, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x41, 0x56, 0x45, 0x52, 0x41, 0x47, + 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x18, 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, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x56, 0x4f, 0x4c, 0x41, 0x54, - 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x1a, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x43, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, 0x52, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, - 0x10, 0x1b, 0x12, 0x2c, 0x0a, 0x28, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, - 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x10, 0x1c, - 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 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, - 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, - 0x4c, 0x4f, 0x53, 0x53, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, - 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x1a, 0x0a, - 0x16, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, - 0x54, 0x4d, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x54, 0x4d, 0x5f, 0x57, - 0x49, 0x4e, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, - 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, - 0x07, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x53, - 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x08, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, - 0x45, 0x45, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x09, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, - 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x10, 0x0a, 0x12, 0x28, 0x0a, - 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, - 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x46, 0x45, - 0x45, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x0b, 0x12, 0x2f, 0x0a, 0x2b, 0x54, 0x52, 0x41, 0x4e, 0x53, - 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, - 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, - 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x0c, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, - 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x0d, 0x12, 0x2a, 0x0a, - 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, - 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x44, 0x49, 0x53, - 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x0e, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, - 0x4c, 0x4f, 0x57, 0x10, 0x0f, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, - 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x49, 0x47, 0x48, - 0x10, 0x10, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x44, 0x52, 0x41, 0x57, 0x10, 0x12, 0x12, 0x19, - 0x0a, 0x15, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x10, 0x13, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, - 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, - 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, - 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4f, 0x55, 0x54, 0x10, 0x15, 0x12, 0x25, 0x0a, 0x21, 0x54, + 0x41, 0x52, 0x44, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x52, 0x45, 0x54, + 0x55, 0x52, 0x4e, 0x10, 0x19, 0x12, 0x29, 0x0a, 0x25, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x52, 0x45, 0x54, + 0x55, 0x52, 0x4e, 0x5f, 0x56, 0x4f, 0x4c, 0x41, 0x54, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x1a, + 0x12, 0x29, 0x0a, 0x25, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x4f, + 0x52, 0x5f, 0x52, 0x41, 0x4e, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x1b, 0x12, 0x2c, 0x0a, 0x28, 0x41, + 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, + 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x41, 0x4c, + 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x10, 0x1c, 0x12, 0x1d, 0x0a, 0x19, 0x41, 0x43, 0x43, + 0x4f, 0x55, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 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, 0xaa, 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, 0x4c, 0x4f, 0x53, 0x53, 0x10, 0x01, 0x12, + 0x15, 0x0a, 0x11, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x57, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x54, 0x4d, 0x5f, 0x4c, 0x4f, 0x53, 0x53, + 0x10, 0x04, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x54, 0x4d, 0x5f, 0x57, 0x49, 0x4e, 0x10, 0x05, 0x12, 0x1c, 0x0a, + 0x18, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, + 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x06, 0x12, 0x1d, 0x0a, 0x19, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, + 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x07, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x52, 0x47, + 0x49, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x53, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x08, + 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x50, 0x41, 0x59, 0x10, + 0x09, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x4b, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, 0x43, + 0x45, 0x49, 0x56, 0x45, 0x10, 0x0a, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, + 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x0b, + 0x12, 0x2f, 0x0a, 0x2b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x52, 0x41, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x55, 0x52, 0x45, + 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, + 0x0c, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, + 0x5f, 0x50, 0x41, 0x59, 0x10, 0x0d, 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, + 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, + 0x10, 0x0e, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x0f, 0x12, 0x1b, + 0x0a, 0x17, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x10, 0x12, 0x1a, 0x0a, 0x16, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x54, + 0x48, 0x44, 0x52, 0x41, 0x57, 0x10, 0x12, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x52, 0x41, 0x4e, 0x53, + 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, + 0x10, 0x13, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x49, 0x4e, + 0x47, 0x10, 0x14, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x4f, + 0x55, 0x54, 0x10, 0x15, 0x12, 0x25, 0x0a, 0x21, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, + 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x16, 0x12, 0x2b, 0x0a, 0x27, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x53, 0x45, 0x4e, 0x44, - 0x10, 0x16, 0x12, 0x2b, 0x0a, 0x27, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x55, 0x4e, - 0x44, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x17, 0x12, - 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x43, 0x4c, 0x45, 0x41, 0x52, 0x5f, 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x18, - 0x12, 0x2c, 0x0a, 0x28, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x42, 0x41, 0x4c, - 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x19, 0x12, 0x16, - 0x0a, 0x12, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x53, 0x50, 0x4f, 0x54, 0x10, 0x1a, 0x12, 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, - 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x5f, - 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x1b, 0x12, 0x21, 0x0a, 0x1d, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, - 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x5f, - 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, 0x10, 0x1c, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x4f, 0x52, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x46, - 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x1d, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, - 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x41, 0x54, - 0x45, 0x10, 0x1e, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, - 0x45, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, - 0x45, 0x10, 0x1f, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, - 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x10, 0x20, 0x12, 0x2a, 0x0a, - 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, - 0x4c, 0x41, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x4c, 0x50, 0x5f, 0x46, 0x45, - 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x59, 0x10, 0x21, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, - 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x55, 0x4e, 0x50, 0x41, 0x49, 0x44, 0x5f, - 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x10, 0x22, 0x12, 0x32, 0x0a, 0x2e, 0x54, 0x52, 0x41, - 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, - 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53, - 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x23, 0x12, 0x29, 0x0a, - 0x25, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, - 0x45, 0x52, 0x50, 0x45, 0x54, 0x55, 0x41, 0x4c, 0x53, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x10, 0x24, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, - 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, 0x54, - 0x55, 0x41, 0x4c, 0x53, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x57, 0x49, 0x4e, - 0x10, 0x25, 0x12, 0x20, 0x0a, 0x1c, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x53, 0x5f, 0x56, 0x45, 0x53, 0x54, - 0x45, 0x44, 0x10, 0x26, 0x12, 0x29, 0x0a, 0x25, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, - 0x45, 0x52, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x27, 0x12, - 0x30, 0x0a, 0x2c, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x52, 0x5f, 0x52, 0x45, - 0x57, 0x41, 0x52, 0x44, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, - 0x2c, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, - 0x4c, 0x4f, 0x57, 0x10, 0x2d, 0x12, 0x23, 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, - 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x52, - 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x2e, 0x12, 0x25, 0x0a, 0x21, 0x54, 0x52, + 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, + 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x17, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x52, 0x41, 0x4e, + 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, 0x45, 0x41, 0x52, 0x5f, + 0x41, 0x43, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x18, 0x12, 0x2c, 0x0a, 0x28, 0x54, 0x52, 0x41, + 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, + 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x45, + 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x19, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x52, 0x41, 0x4e, 0x53, + 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x50, 0x4f, 0x54, 0x10, 0x1a, 0x12, + 0x1e, 0x0a, 0x1a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x1b, 0x12, + 0x21, 0x0a, 0x1d, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x48, 0x4f, 0x4c, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x4c, 0x45, 0x41, 0x53, 0x45, + 0x10, 0x1c, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x4f, 0x52, 0x5f, 0x49, 0x4e, + 0x53, 0x55, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x46, 0x52, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x1d, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, + 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x45, 0x10, 0x1e, 0x12, 0x2e, 0x0a, 0x2a, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, + 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x5f, + 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x1f, 0x12, 0x28, 0x0a, 0x24, + 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, + 0x41, 0x5f, 0x50, 0x45, 0x4e, 0x41, 0x4c, 0x54, 0x59, 0x5f, 0x42, 0x4f, 0x4e, 0x44, 0x5f, 0x41, + 0x50, 0x50, 0x4c, 0x59, 0x10, 0x20, 0x12, 0x2a, 0x0a, 0x26, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x45, 0x4e, 0x41, + 0x4c, 0x54, 0x59, 0x5f, 0x4c, 0x50, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x59, + 0x10, 0x21, 0x12, 0x2e, 0x0a, 0x2a, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x46, 0x45, + 0x45, 0x5f, 0x55, 0x4e, 0x50, 0x41, 0x49, 0x44, 0x5f, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, + 0x10, 0x22, 0x12, 0x32, 0x0a, 0x2e, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4c, 0x41, 0x5f, 0x50, 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x41, + 0x4e, 0x43, 0x45, 0x5f, 0x42, 0x4f, 0x4e, 0x55, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, + 0x42, 0x55, 0x54, 0x45, 0x10, 0x23, 0x12, 0x29, 0x0a, 0x25, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, 0x54, 0x55, 0x41, + 0x4c, 0x53, 0x5f, 0x46, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x4f, 0x53, 0x53, 0x10, + 0x24, 0x12, 0x28, 0x0a, 0x24, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x50, 0x45, 0x54, 0x55, 0x41, 0x4c, 0x53, 0x5f, 0x46, 0x55, + 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x57, 0x49, 0x4e, 0x10, 0x25, 0x12, 0x20, 0x0a, 0x1c, 0x54, + 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x57, + 0x41, 0x52, 0x44, 0x53, 0x5f, 0x56, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x26, 0x12, 0x29, 0x0a, + 0x25, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, + 0x45, 0x45, 0x5f, 0x52, 0x45, 0x46, 0x45, 0x52, 0x52, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x57, 0x41, + 0x52, 0x44, 0x5f, 0x50, 0x41, 0x59, 0x10, 0x27, 0x12, 0x30, 0x0a, 0x2c, 0x54, 0x52, 0x41, 0x4e, + 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x52, 0x45, + 0x46, 0x45, 0x52, 0x52, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x44, 0x49, + 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x45, 0x10, 0x2c, 0x12, 0x22, 0x0a, 0x1e, 0x54, 0x52, + 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4f, 0x52, 0x44, 0x45, + 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x2d, 0x12, 0x23, + 0x0a, 0x1f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4f, 0x52, 0x44, 0x45, 0x52, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, + 0x48, 0x10, 0x2e, 0x12, 0x25, 0x0a, 0x21, 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, 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, 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, + 0x41, 0x54, 0x45, 0x44, 0x5f, 0x4d, 0x41, 0x52, 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x49, 0x47, 0x48, + 0x10, 0x30, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4d, 0x4d, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x31, 0x12, 0x1a, 0x0a, + 0x16, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, + 0x4d, 0x4d, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x10, 0x32, 0x12, 0x1d, 0x0a, 0x19, 0x54, 0x52, 0x41, + 0x4e, 0x53, 0x46, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4d, 0x4d, 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, 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, + 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, 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, 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, } var ( @@ -11623,7 +11844,7 @@ func file_vega_vega_proto_rawDescGZIP() []byte { } var file_vega_vega_proto_enumTypes = make([]protoimpl.EnumInfo, 29) -var file_vega_vega_proto_msgTypes = make([]protoimpl.MessageInfo, 84) +var file_vega_vega_proto_msgTypes = make([]protoimpl.MessageInfo, 86) var file_vega_vega_proto_goTypes = []interface{}{ (Side)(0), // 0: vega.Side (Interval)(0), // 1: vega.Interval @@ -11737,11 +11958,13 @@ var file_vega_vega_proto_goTypes = []interface{}{ (*VolumeDiscountProgram)(nil), // 109: vega.VolumeDiscountProgram (*ActivityStreakBenefitTiers)(nil), // 110: vega.ActivityStreakBenefitTiers (*ActivityStreakBenefitTier)(nil), // 111: vega.ActivityStreakBenefitTier - (*StopOrder_SizeOverrideValue)(nil), // 112: vega.StopOrder.SizeOverrideValue - (CompositePriceType)(0), // 113: vega.CompositePriceType - (Market_TradingMode)(0), // 114: vega.Market.TradingMode - (Market_State)(0), // 115: vega.Market.State - (*PriceMonitoringTrigger)(nil), // 116: vega.PriceMonitoringTrigger + (*LongBlockAuction)(nil), // 112: vega.LongBlockAuction + (*LongBlockAuctionDurationTable)(nil), // 113: vega.LongBlockAuctionDurationTable + (*StopOrder_SizeOverrideValue)(nil), // 114: vega.StopOrder.SizeOverrideValue + (CompositePriceType)(0), // 115: vega.CompositePriceType + (Market_TradingMode)(0), // 116: vega.Market.TradingMode + (Market_State)(0), // 117: vega.Market.State + (*PriceMonitoringTrigger)(nil), // 118: vega.PriceMonitoringTrigger } var file_vega_vega_proto_depIdxs = []int32{ 30, // 0: vega.PartyProfile.metadata:type_name -> vega.Metadata @@ -11750,7 +11973,7 @@ var file_vega_vega_proto_depIdxs = []int32{ 20, // 3: vega.StopOrder.status:type_name -> vega.StopOrder.Status 21, // 4: vega.StopOrder.rejection_reason:type_name -> vega.StopOrder.RejectionReason 17, // 5: vega.StopOrder.size_override_setting:type_name -> vega.StopOrder.SizeOverrideSetting - 112, // 6: vega.StopOrder.size_override_value:type_name -> vega.StopOrder.SizeOverrideValue + 114, // 6: vega.StopOrder.size_override_value:type_name -> vega.StopOrder.SizeOverrideValue 30, // 7: vega.Party.metadata:type_name -> vega.Metadata 4, // 8: vega.PeggedOrder.reference:type_name -> vega.PeggedReference 0, // 9: vega.Order.side:type_name -> vega.Side @@ -11798,21 +12021,21 @@ var file_vega_vega_proto_depIdxs = []int32{ 60, // 51: vega.LedgerMovement.entries:type_name -> vega.LedgerEntry 61, // 52: vega.LedgerMovement.balances:type_name -> vega.PostTransferBalance 16, // 53: vega.MarginLevels.margin_mode:type_name -> vega.MarginMode - 113, // 54: vega.PerpetualData.internal_composite_price_type:type_name -> vega.CompositePriceType + 115, // 54: vega.PerpetualData.internal_composite_price_type:type_name -> vega.CompositePriceType 68, // 55: vega.PerpetualData.internal_composite_price_state:type_name -> vega.CompositePriceState 64, // 56: vega.ProductData.perpetual_data:type_name -> vega.PerpetualData - 114, // 57: vega.MarketData.market_trading_mode:type_name -> vega.Market.TradingMode + 116, // 57: vega.MarketData.market_trading_mode:type_name -> vega.Market.TradingMode 3, // 58: vega.MarketData.trigger:type_name -> vega.AuctionTrigger 3, // 59: vega.MarketData.extension_trigger:type_name -> vega.AuctionTrigger 71, // 60: vega.MarketData.price_monitoring_bounds:type_name -> vega.PriceMonitoringBounds 69, // 61: vega.MarketData.liquidity_provider_fee_share:type_name -> vega.LiquidityProviderFeeShare - 115, // 62: vega.MarketData.market_state:type_name -> vega.Market.State + 117, // 62: vega.MarketData.market_state:type_name -> vega.Market.State 65, // 63: vega.MarketData.product_data:type_name -> vega.ProductData 70, // 64: vega.MarketData.liquidity_provider_sla:type_name -> vega.LiquidityProviderSLA - 113, // 65: vega.MarketData.mark_price_type:type_name -> vega.CompositePriceType + 115, // 65: vega.MarketData.mark_price_type:type_name -> vega.CompositePriceType 68, // 66: vega.MarketData.mark_price_state:type_name -> vega.CompositePriceState 67, // 67: vega.CompositePriceState.price_sources:type_name -> vega.CompositePriceSource - 116, // 68: vega.PriceMonitoringBounds.trigger:type_name -> vega.PriceMonitoringTrigger + 118, // 68: vega.PriceMonitoringBounds.trigger:type_name -> vega.PriceMonitoringTrigger 4, // 69: vega.LiquidityOrder.reference:type_name -> vega.PeggedReference 75, // 70: vega.LiquidityOrderReference.liquidity_order:type_name -> vega.LiquidityOrder 76, // 71: vega.LiquidityProvision.sells:type_name -> vega.LiquidityOrderReference @@ -11852,11 +12075,12 @@ var file_vega_vega_proto_depIdxs = []int32{ 107, // 105: vega.VestingBenefitTiers.tiers:type_name -> vega.VestingBenefitTier 104, // 106: vega.VolumeDiscountProgram.benefit_tiers:type_name -> vega.VolumeBenefitTier 111, // 107: vega.ActivityStreakBenefitTiers.tiers:type_name -> vega.ActivityStreakBenefitTier - 108, // [108:108] is the sub-list for method output_type - 108, // [108:108] is the sub-list for method input_type - 108, // [108:108] is the sub-list for extension type_name - 108, // [108:108] is the sub-list for extension extendee - 0, // [0:108] is the sub-list for field type_name + 112, // 108: vega.LongBlockAuctionDurationTable.threshold_and_duration:type_name -> vega.LongBlockAuction + 109, // [109:109] is the sub-list for method output_type + 109, // [109:109] is the sub-list for method input_type + 109, // [109:109] is the sub-list for extension type_name + 109, // [109:109] is the sub-list for extension extendee + 0, // [0:109] is the sub-list for field type_name } func init() { file_vega_vega_proto_init() } @@ -12863,6 +13087,30 @@ func file_vega_vega_proto_init() { } } file_vega_vega_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LongBlockAuction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_vega_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LongBlockAuctionDurationTable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vega_vega_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StopOrder_SizeOverrideValue); i { case 0: return &v.state @@ -12903,7 +13151,7 @@ func file_vega_vega_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vega_vega_proto_rawDesc, NumEnums: 29, - NumMessages: 84, + NumMessages: 86, NumExtensions: 0, NumServices: 0, }, 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/version/version.go b/version/version.go index f73395ff20b..c5e800b70a0 100644 --- a/version/version.go +++ b/version/version.go @@ -22,7 +22,7 @@ import ( var ( cliVersionHash = "" - cliVersion = "v0.76.1" + cliVersion = "v0.77.0" ) func init() { diff --git a/visor/config/visor_config.go b/visor/config/visor_config.go index 9fa176cb6ef..ed25c404f81 100644 --- a/visor/config/visor_config.go +++ b/visor/config/visor_config.go @@ -128,9 +128,20 @@ type VisorConfigFile struct { The `maxNumberOfFirstConnectionRetries` is only taken into account during the first start up of the Core node process - not restarts. note: | There is a 2 second delay between each attempt. Setting the max retry number to 5 means Visor will try to establish a connection 5 times in 10 seconds. - default: 10 + default: 175000 */ MaxNumberOfFirstConnectionRetries int `toml:"maxNumberOfFirstConnectionRetries,optional"` + /* + description: | + Visor communicates with the core node via RPC API. + This variable allows a validator to specify how many times Visor should try to establish a connection to the core node before the Visor process fails. + The `MaxNumberOfRestartConnectionRetries` is only taken into account after the first start up of the Core node process where it is expected that the + time to restart will be much shorter than when originally started. + note: | + There is a 2 second delay between each attempt. Setting the max retry number to 5 means Visor will try to establish a connection 5 times in 10 seconds. + default: 10 + */ + MaxNumberOfRestartConnectionRetries int `toml:"maxNumberOfRestartConnectionRetries,optional"` /* description: | Defines the maximum number of restarts in case any of @@ -220,12 +231,13 @@ func DefaultVisorConfig(log *logging.Logger, homePath string) *VisorConfig { homePath: homePath, configPath: path.Join(homePath, configFileName), data: &VisorConfigFile{ - UpgradeFolders: map[string]string{"vX.X.X": "vX.X.X"}, - MaxNumberOfRestarts: 3, - MaxNumberOfFirstConnectionRetries: 175000, - RestartsDelaySeconds: 5, - StopDelaySeconds: 0, - StopSignalTimeoutSeconds: 15, + UpgradeFolders: map[string]string{"vX.X.X": "vX.X.X"}, + MaxNumberOfRestarts: 3, + MaxNumberOfFirstConnectionRetries: 175000, + MaxNumberOfRestartConnectionRetries: 10, + RestartsDelaySeconds: 5, + StopDelaySeconds: 0, + StopSignalTimeoutSeconds: 15, AutoInstall: AutoInstallConfig{ Enabled: true, GithubRepositoryOwner: "vegaprotocol", @@ -367,6 +379,13 @@ func (pc *VisorConfig) MaxNumberOfFirstConnectionRetries() int { return pc.data.MaxNumberOfFirstConnectionRetries } +func (pc *VisorConfig) MaxNumberOfRestartConnectionRetries() int { + pc.mut.RLock() + defer pc.mut.RUnlock() + + return pc.data.MaxNumberOfRestartConnectionRetries +} + func (pc *VisorConfig) RestartsDelaySeconds() int { pc.mut.RLock() defer pc.mut.RUnlock() diff --git a/visor/visor.go b/visor/visor.go index eb0cfb89187..7a5f845e7bb 100644 --- a/visor/visor.go +++ b/visor/visor.go @@ -29,7 +29,6 @@ import ( const ( upgradeAPICallTickerDuration = time.Second * 2 - maxUpgradeStatusErrs = 10 namedLogger = "visor" ) @@ -114,8 +113,11 @@ func (v *Visor) Run(ctx context.Context) error { runConf.Vega.RCP.HTTPPath, ) + // how many times to try and connect on the first start up of the binaries maxNumberOfFirstConnectionRetries := v.conf.MaxNumberOfFirstConnectionRetries() + // how many times to try and connect in subsequent restarts of the binaries where it is expected to be much quicker + maxUpgradeStatusErrs := v.conf.MaxNumberOfRestartConnectionRetries() numOfUpgradeStatusErrs := 0 maxNumRestarts := v.conf.MaxNumberOfRestarts() restartsDelay := time.Second * time.Duration(v.conf.RestartsDelaySeconds()) @@ -162,12 +164,13 @@ func (v *Visor) Run(ctx context.Context) error { upStatus, err := c.UpgradeStatus(ctx) if err != nil { // Binary has not started yet - waiting for first startup - if numOfRestarts == 0 { - if numOfUpgradeStatusErrs > maxNumberOfFirstConnectionRetries { + isFirstStartup := numOfRestarts == 0 + if isFirstStartup { + if numOfUpgradeStatusErrs >= maxNumberOfFirstConnectionRetries { return failedToGetStatusErr(maxNumberOfFirstConnectionRetries, err) } } else { // Binary has been started already. Something has failed after the startup - if numOfUpgradeStatusErrs > maxUpgradeStatusErrs { + if numOfUpgradeStatusErrs >= maxUpgradeStatusErrs { return failedToGetStatusErr(maxUpgradeStatusErrs, err) } } @@ -176,12 +179,17 @@ func (v *Visor) Run(ctx context.Context) error { numOfUpgradeStatusErrs++ - v.log.Info("Still waiting for vega to start...", logging.Int("attemptLeft", maxUpgradeStatusErrs-numOfUpgradeStatusErrs)) + attemptsLeft := maxUpgradeStatusErrs - numOfUpgradeStatusErrs + if isFirstStartup { + attemptsLeft = maxNumberOfFirstConnectionRetries - numOfUpgradeStatusErrs + } + v.log.Info("Still waiting for vega to start...", logging.Int("attemptLeft", attemptsLeft)) break } if !upStatus.ReadyToUpgrade { + numOfUpgradeStatusErrs = 0 break } 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)) }